leaflet在vue2中标点 加载geoJSON

发布时间 2023-12-19 18:51:14作者: 环岛公路

lealfet版本1.9.4 vue版本2.6

引入: import L from 'leaflet'   import 'leaflet/dist/leaflet.css'   //记得引入样式 不然加载瓦片图后地图会错乱

1.初始化

this.map = L.map(this.mapId, mapInitOptionNew)  //this.mapId 是容器的id
let center = [32.666, 129.547]
const mapInitOptionNew = {
crs: L.CRS.EPSG4326, //坐标系 根据实际需求来
zoomControl: false, //缩放控件
closePopupOnClick: false, //点击地图是否关闭弹出窗口
center, //中心点
maxBounds: [[27.971730, 103.988246], [32.471166, 114.300393]], //地图的视角
zoom: MIN_ZOOM, //默认层级
minZoom: MIN_ZOOM, //最小层级
maxZoom: MAX_ZOOM, //最大层级 //最大最小层级根据加载的瓦片图来决定
}
如果不需要这些配置,简单写法
this.map = L.map(this.mapId).setView(center, zoom)

//可以用L.tileLayer来加载地图底图
//如果是esri 就安装esri-leaflet 来加载

2.标点

① let marker = L.marker(center, {
        icon: L.icon({
          iconUrl: '本地图片路径',
          iconSize: [24, 24]
        })
      })
let marker = L.marker(center, {
icon: this.makeSvgIcon()
})

makeSvgIcon() {
//自定义html
return L.divIcon({
  className: `marker-svg`,
html: `<div class="box"></div>`,
iconSize: [30, 30],
iconAnchor: [15, 30],
tooltipAnchor: [0, -20],
popupAnchor: [0, -20]
})
}

marker.bindTooltip('名称', { direction: 'top' })
marker.bindPopup('内容')或marker.bindPopup(pop)
let pop = L.popup({
minWidth: 300,
maxWidth: 600,
className: 'layer-popup',
autoPanPadding: [200, 100],
keepInView: true
}).setContent(this.$refs.school.$el) //直接放一个html

marker.on('click', e => { '点击事件' })
//一般是多个标点 将多个标点添加到数组中 最后添加到地图中去
let markers = []
markers.push(marker)
let layers = L.layerGroup(markers)
this.map.addLayer(layers)

3.加载GEOJSON

let layer = L.geoJSON(geojson数据, { weight: 6, ...style })   //可以自定义geojson的样式  //在数组里返回 给每一项定义一个layer  然后绑定对应事件
layer.on('mouseover', _ => {   //鼠标经过
layer.setStyle({ ...style, weight: 8 })
})
layer.on('mouseout', _ => { //鼠标离开
layer.resetStyle()
})
layer.on('click', _ => {
//点击事件
})
layer.bindTooltip('名称', { direction: 'top', sticky: true })

let regionLayer = L.layerGroup()
let layer2 = L.geoJSON('返回的数组', { //循环数组
style: {},
onEachFeature: (feature, item) => {
item.on('mouseover', _ => {   //鼠标经过
layer.setStyle({ ...style, weight: 8 })
})
item.on('mouseout', _ => { //鼠标离开
layer.resetStyle()
})
item.on('click', _ => {
//点击事件
})
item.bindTooltip('名称', { direction: 'top', sticky: true })

//有些展示地级市边界的geojson 中心点需要加上地级市的名字
regionLayer.addLayer(item)
const { properties: { name } } = feature
     const nameMarker = L.marker(center, {
interactive: false,
icon: L.divIcon({
html: `<div class="region-name">${name}</div>`,
iconSize: [0, 0]
})
})
regionLayer.addLayer(nameMarker)
  }
})
this.map.addLayer(layer2)

4.加载wms

let imgLayer = L.tileLayer.wms('你的url', {
//要求的一些参数 layers: ''
, format: 'image/png', transparent: true })this.map.addLayer(imgLayer)

5.删除图层

this.map.removeLayer(layer)

6.视角移动到某个标点并放大层级

this.map.setView([经纬度], zoom)

7.定义一个marker按照固定的路线移动(如按照河流路线移动)

安装   leaflet.AnimatedMarker(1.0.0)

引入  import 'leaflet.AnimatedMarker/src/AnimatedMarker'

使用  L.animatedMarker

8.计算两个点的直线距离(不考虑高度)

let a = L.latLng(纬度, 经度)

let b = L.latLng(纬度, 经度)

a.distanceTo(b)

//引入turfjs可以计算更多东西   链接: https://turfjs.fenxianglu.cn/category/#cdn%E9%93%BE%E6%8E%A5