首页 > 其他分享 >leaflet在vue2中标点 加载geoJSON

leaflet在vue2中标点 加载geoJSON

时间:2023-12-19 18:55:28浏览次数:26  
标签:map layer geoJSON leaflet let vue2 marker 加载

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

标签:map,layer,geoJSON,leaflet,let,vue2,marker,加载
From: https://www.cnblogs.com/reround/p/17914443.html

相关文章

  • vue2前端调接口下载(导出)后端返回.zip压缩文件流
    1、接口api//三级教育档案导出exportfunctionsearchPersonnelHousInfoExport(data){returnrequest({url:train+'/fileExport/controller/export/personalProfile',method:'post',data:data,responseType:'blob',......
  • Vue学习计划-Vue2--VueCLi(二)vuecli脚手架创建的项目内部主要文件分析
    1.文件分析1.补充:什么叫单文件组件?一个文件中只有一个组件vue-cli创建的项目中,.vue的文件都是单文件组件,例如App.vue2.进入分析1.package.json:项目依赖配置文件:如图,我们说主要的属性:name:项目的名称version:项目版本scripts:脚本入口serve:启动项目命......
  • vue2子组件拷贝父组件传递的参数
    在Vue2中,父组件向子组件传递参数时,如果参数是对象或数组(即非基本数据类型),那么子组件可以直接修改这个参数,这会影响到父组件的数据。如果你想避免这种情况,你可以让子组件对父组件的传参进行深度拷贝。这样,子组件就可以自由修改拷贝后的参数,而不会影响到父组件的数据。这是一个例......
  • Vue2 校验不通过的表单,赋正确的值后,再次校验结果不变
    前言在工作中遇到了这个问题,多次排查,耗费了不少时间才解决这个问题。问题的解决很简单,但发现根本原因还是有点困难,因此在此做个记录,以防忘记。问题发现步骤例如有以下AntDesignVue表单<a-form-modelref="formRef":model="model"><a-form-model-itemlabel="姓名"pr......
  • vue2 中 el-table 实现树形列表,支持增删改等操作
    需求场景:el-table构造一个树形列表,支持新增节点,删除,修改等操作。实现效果思路 一般的el-table增删改,我们都很熟悉;关键在于实现一个纯前端的树形列表,最终再调接口存列表数据。     树形el-table,需要设置 row-key,一般为id,所以每新增一条数据,都必须有id。需......
  • vue2项目webpack打包的优化策略,降低打包文件后的大小
    1.区分开发模式和打包模式的main.js入口文件首先,在项目的根目录下创建一个名为vue.config.js的文件(如果已存在,请跳过此步骤)。然后对于你的项目中的mian.js新建一个相同内容的js文件,然后将这2个mian.js文件分别命名为打包模式的入口文件:main-prod.js开发模式的入口文件:mian-dev.js......
  • vue2环境变量配置开发环境和生产环境
    在项目根目录下新建.env文件写入变量比如本地链接VUE_APP_BASE_API=http://127.0.0.1:5000/在读取的时候使用process.env.VUE_APP_BASE_API就可以读到这个全局变量process.env.NODE_ENV有两个值开发环境:development,部署环境:production都为Srting字符串下面示例给baseurl添......
  • 基于mysql、laravel、vue2框架开发的手术麻醉临床信息系统源码,自主版权
    手术麻醉系统源码技术架构:PHP、js、mysql、laravel、vue2手术麻醉临床信息管理系统是数字化手段应用于手术过程中的重要组成部分,用数字形式获取并存储手术相关信息,既便捷又高效。既然是管理系统,那就是一整套流程,管理患者手术、麻醉的申请、审批、安排以及术后有关各项数据的记录......
  • flask支持Vue2 mode history历史模式
    VueRouter配置在Vue2router里面增加constrouter=newVueRouter({mode:'history',base:'/admin/',//这里路径写你打包后的网址路径routes:[//这里是你的路由配置],});vue.config.js打包配置const{defineConfig}=require('@vue/cli-service......
  • Vue2 的 diff 算法详解
    所谓diff算法,就是通过比对新旧两个虚拟节点不一样的地方,针对那些不一样的地方进行新增或更新或删除操作。接下来详细介绍节点更新的过程。首先进行静态节点处理,判断新旧两个虚拟节点是否是静态节点,如果是,就不需要进行更新操作,可以直接跳过更新比对的过程。再更新处理新老节点......