最近在使用openlayers开发离线地图,但是全英文的文档属实有点难顶,本文代码主要就是实现marker点位标记以及点击图标会显示弹窗,参考博客写的非常的详细也是我找到比较好的。
文中用到的瓦片地图是使用太乐下载器下载的,仅供参考
完整代码

在这里插入代码片
<template><div><div ref="olMap" id="map" class="ol-map"/><div id="popup" class="ol-popup"><a href="#" id="popup-closer" class="ol-popup-closer"></a><div id="popup-content" class="popup-content"></div></div></div>
</template>
<script>
import 'ol/ol.css'
import TileLayer from 'ol/layer/Tile'
import VectorLayer from 'ol/layer/Vector'
import VectorSource from 'ol/source/Vector'
import XYZ from 'ol/source/XYZ'
import {Map, View, Feature} from 'ol'
import Overlay from 'ol/Overlay'
import {Style,Stroke,Fill,Icon,Text
} from 'ol/style'
import {Point} from 'ol/geom'
import {Cluster} from 'ol/source'
import {fromLonLat} from 'ol/proj'
// import {toStringHDMS} from 'ol/coordinate'export default {name: 'defineMap',data () {return {imgUrl: require('../../src/assets/pointer.png'),map: null,pointLayer: null,diffLayer: null,overlay: null,clusterData:null,}},mounted () {this.init()this.diffLayer = new VectorLayer({source: new VectorSource()})this.clusterData = {点A: {center: {lng: 119.99082431579592, lat: 30.277877393725625}},点B: {center: {lng: 119.92396220947268, lat: 30.256453639392525}}}let points = [{name: '点A', value: 1},{name: '点B', value: 1}]this.addCluster(this.clusterData, points, true)this.addPopup()this.addPoint(this.diffLayer, [119.97846324707033, 30.274838322154054])},methods: {init () {const tileLayer = new TileLayer({source: new XYZ({url: `tiles/{z}/{x}/{y}.png`})})// 初始化地图this.map = nullthis.map = new Map({layers: [tileLayer],view: new View({center: fromLonLat([119.97846324707033, 30.274838322154054]), // 地图中心点zoom: 14, // 缩放级别minZoom: 0, // 最小缩放级别maxZoom: 18, // 最大缩放级别constrainResolution: true// 因为存在非整数的缩放级别,所以设置该参数为true来让每次缩放结束后自动缩放到距离最近的一个整数级别,这个必须要设置,当缩放在非整数级别时地图会糊}),target: this.$refs.olMap// DOM容器})},addCluster (clusterData, points) {let source = new VectorSource()let clusterSource = new Cluster({distance: parseInt(20, 10),source: source})this.pointLayer = new VectorLayer({source: clusterSource// style: this.clusterStyle})this.pointLayer.setStyle(this.clusterStyle())this.map.addLayer(this.pointLayer)for (const key in clusterData) {points.forEach(e => {if (e.name === key) {let point = fromLonLat([clusterData[key].center.lng,clusterData[key].center.lat])var f = new Feature({geometry: new Point(point),data: {path: 'homepage'}})f.set('name', e.name)f.set('value', e.value)source.addFeature(f)}})}},// 添加弹窗addPopup () {var container = document.getElementById('popup')var closer = document.getElementById("popup-closer");var content = document.getElementById('popup-content')this.overlay = new Overlay({element: container,autoPan: true,autoPanAnimation: {duration: 250}})this.map.addOverlay(this.overlay)this.map.on('click', function (evt) {//查询当前点击的地方是否存在要素(图标)var feature = this.map.forEachFeatureAtPixel(evt.pixel, function (feature) { return feature; });console.log(feature)if (feature) {content.innerHTML = ''; //清空popup的内容容器// 点击尺 (这里是尺(米),并不是经纬度);content.innerHTML = `<p>A<p><p>状态:正常</p>安装人员:lisa`this.overlay.setPosition(evt.coordinate) // 把 overlay 显示到指定的 x,y坐标}}.bind(this))this.map.on('pointermove', function (e) {var pixel = this.map.getEventPixel(e.originalEvent);var hit = this.map.hasFeatureAtPixel(pixel);this.map.getTargetElement().style.cursor = hit ? 'pointer' : '';}.bind(this));closer.onclick = function() {this.overlay.setPosition(undefined);closer.blur();return false;}.bind(this);},clusterStyle () {return () => {var style = new Style({image: new Icon({src: this.imgUrl,// offset: [-15, 0], // 偏移量anchor: [1, 1]}),text: new Text({text: '我是一个点',fill: new Fill({color: '#FFF'}),font: '12px Calibri,sans-serif',stroke: new Stroke({color: 'red',width: 5})})})return style}},// 添加点位 这个可以不看addPoint (pointLayer, condiation) {// 添加图层this.map.addLayer(pointLayer)// 循环添加feature// 创建feature,一个feature就是一个点坐标信息let feature = new Feature({geometry: new Point(// 经纬度需要转换一下fromLonLat(condiation)),data: {path: 'homepage'}})feature.set('marker', () => {console.log('1')})this.map.on('singleClick', (e) => {console.log(e)})feature.setStyle(new Style({// 设置图片效果image: new Icon({src: this.imgUrl,// offset: [-15, 0], // 偏移量anchor: [1, 1]}),name: '我是一个点',text: new Text({textAlign: 'right',textBaseline: 'middle',text: 'xxx'})}))let featuresArr = []featuresArr.push(feature)// 批量添加featurepointLayer.getSource().addFeatures(featuresArr)},}
}
</script><style scoped>
.ol-map {width: 100%;font-size: 14px;height: calc(100vh - 96px);
}.ol-popup {position: absolute;background-color: white;-webkit-filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));filter: drop-shadow(0 1px 4px rgba(0, 0, 0, 0.2));padding: 15px;border-radius: 10px;border: 1px solid #cccccc;bottom: 12px;left: -50px;
}.ol-popup:after,
.ol-popup:before {top: 100%;border: solid transparent;content: " ";height: 0;width: 0;position: absolute;pointer-events: none;
}.ol-popup:after {border-top-color: white;border-width: 10px;left: 48px;margin-left: -10px;
}.ol-popup:before {border-top-color: #cccccc;border-width: 11px;left: 48px;margin-left: -11px;
}.ol-popup-closer {text-decoration: none;position: absolute;top: 2px;right: 8px;
}.popup-content {width: 400px;
}.ol-popup-closer:after {content: "✖";
}</style>

实现效果

demo

vue中使用openlayers开发离线地图相关推荐

  1. OpenLayers开发离线地图源代码(OpenLayers开发谷歌高德百度地图)

    (OpenLayers DEMO)点击下载 本案例介绍如何在离线(单机.或局域网无Internet)状态下发布离线地图,且结合OpenLayers做基于地图的二次开发. 一.   离线地图数据下载 离 ...

  2. Vue中使用Openlayers加载OSM(Open Street Map)显示街道地图

    场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...

  3. Vue中使用Openlayers加载Geoserver发布的ImageWMS

    场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...

  4. Vue中使用Openlayers加载Geoserver发布的TileWMS时单击获取shp文件的坐标信息

    场景 Vue中使用Openlayers加载Geoserver发布的TileWMS: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/ ...

  5. Vue中使用Openlayers加载Geoserver发布的TileWMS

    场景 Openlayers下载与加载geoserver的wms服务显示地图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/114 ...

  6. Vue中使用echart实现中国地图统计图

    Vue中使用echart实现中国地图统计图 前言 Echart版本的确定 全局导入或按需导入 在对应的页面调用echart 前后端数据交互注意事项 前言 在Vue2.x开发中,为了更好地展示某一个时间 ...

  7. vue中加载腾讯地图(html形式)

    vue中引入腾讯地图,目前根据网上的方式有一种 qqmap组件,但是本人才疏学浅,未能探究如何使用,于是乎,就曲线救国,用另一种方式实现了,在vue中引入iframe,然后在iframe中引入html ...

  8. vue中使用raphael.js实现地图绘制

    一.效果图 二.在vue中引入raphael.js npm i raphael -S 三.封装一个名为StreetMap的组件,代码如下 1 <template> 2 <div> ...

  9. vue中使用echarts和百度地图实现飞机迁徙图

    在vue-cli生成的项目中使用echarts和百度地图api实现飞机迁徙图,当然也可以实现其他效果. 1. 准备 项目安装echarts 在已经生成的vue项目根目录npm install echa ...

最新文章

  1. [UOJ55]紫荆花之恋
  2. 在Flash中利用PCRE正则式漏洞CVE-2015-0318的方法
  3. 分表需要解决的问题 基于MyBatis 的轻量分表落地方案
  4. 浅析微信支付:统一下单接口
  5. centos7安装redmine3.4
  6. 第二十二部分_Hibernate检索策略、拦截器、事务隔离级别
  7. Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
  8. Sql Injection 注入攻击
  9. pythonchallenge_level2
  10. 【186天】黑马程序员27天视频学习笔记【Day15-上】
  11. oracle怎么不让别的电脑连接,[转载]修改计算机名字导致oracle连接不上的解决方案...
  12. .NET简谈设计模式之(命令模式)
  13. shp文件各部分的含义和中文乱码解决
  14. 【读书笔记《Android游戏编程之从零开始》】3.Android 游戏开发常用的系统控件(Button、Layout、ImageButton)
  15. tcp 11种状态转换图
  16. Python爬取当当网图书数据
  17. 数据分析的 5 种归纳方法
  18. Prefuse及相关数据结构可视化工具
  19. 古风排版 python
  20. 微软的teredo服务器,win10系统通过teredo连接ipv6的操作方法

热门文章

  1. windows sftp linux,Windows 下的SFTP服务器配置
  2. 从阿里巴巴说到管理软件的产业链打造--管理软件夜未眠(一)
  3. 笔记本屏幕测试linux,Screen Item Detector
  4. linux跨平台笔记软件,Joplin - 跨平台笔记应用
  5. 乡村少年宫计算机小组活动教案,乡村少年宫电脑绘兴趣小组教案.doc
  6. java获取word文档标题和内容
  7. 【Vue】template 模板用法
  8. Python读取写入postgresql数据库
  9. python自动制作word_办公自动化5_用Python批量生成word版邀请函
  10. 【云原生之Docker实战】使用Docker部署melody个人在线音乐平台