leaflet 移动端h5地图开发(一) 点聚合矢量瓦片(附项目代码和数据)

2024-06-10 07:08

本文主要是介绍leaflet 移动端h5地图开发(一) 点聚合矢量瓦片(附项目代码和数据),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

leaflet 移动端h5地图开发(一) 点聚合&矢量瓦片(附项目代码和数据)

leaflet是一个轻量级的GIS前端框架,支持多种GIS服务(wfs,wms,wmts,arcgis mapserver,mvt矢量切片)。但是leaflet不支持三维,如果不考虑三维的话,leaflet是做移动端h5地图很好的选择。

技术栈

前端 : vue (uniapp) +leaflet

GIS服务器:geoserver

案例项目界面效果(仿高德):

在线预览地址:http://magic1412.gitee.io/h5_leaflet/#/

一、加载点marker,并添加点击事件

运用到markercluster插件实现点的聚合效果

插件地址:https://github.com/Leaflet/Leaflet.markercluster

封装请求wfs服务的函数

requestWFSData = (opts) => {return new Promise((resolve, reject) => {var urlString = opts.root + '/wfs'var param = {service: 'WFS',version: '1.0.0',request: 'GetFeature',typeName: opts.layerId,outputFormat: 'application/json',maxFeatures: 3200,srsName: 'EPSG:4326',}if (opts.cql_filter) param.CQL_FILTER = opts.cql_filteraxios.get(urlString + L.Util.getParamString(param, urlString)).then(res => {if (res.data) {resolve(res)} else {reject('请求wfs错误')}})})
}

将返回的点json,遍历实例化成marker,添加点击事件后,添加至markerClusterGroup中

addMakerLayer = (opts) => {this.requestWFSData(opts).then(res => {if (res.data.features.length > 0) {this._layerDict[opts.layerId] = L.markerClusterGroup({spiderfyOnMaxZoom: false,showCoverageOnHover: false,zoomToBoundsOnClick: false}).addTo(this._map)res.data.features.forEach(f => {var c = f.geometry.coordinatesvar title = f.properties[opts.idField]var marker = L.marker(new L.LatLng(c[0][1], c[0][0]))marker.on('click', evt => {this._map.flyTo(evt.latlng, 16)})marker.bindPopup(title.toString())this._layerDict[opts.layerId].addLayer(marker)})}})
}

二、加载矢量瓦片

使用Leaflet.VectorGrid插件加载geoserver矢量瓦片

插件地址:https://github.com/Leaflet/Leaflet.VectorGrid

addVectorTileLayer = (opts) => {this._layerDict[opts.layerId] = L.vectorGrid.protobuf(opts.url, {rendererFactory: L.canvas.tile,tms: true,interactive: true,vectorTileLayerStyles: opts.vectorTileLayerStyles}).addTo(this._map)
}

实现点击矢量瓦片跳转页面

定义个list,初始化图层时,存储图层信息。

addToClickSearchList = (opts) => {this._clickSearchList.push({root: opts.root, //wfs服务根地址layerId: opts.layerId, //图层ididField: opts.idField, //id字段crs: opts.crs,//坐标系added: true //是否})
}

遍历list,构造crs(坐标系) 和 cql_filter (筛选条件) 参数

getClickFeatrue = (pt) => {if (this._clickSearchList.length === 0) returnif (document.getElementById("popup")) document.getElementById("popup").remove()var content = '<a id="popup" style="text-decoration: underline;cursor: pointer;">'this._clickSearchList.forEach(l => {if (l.added) {var cptif (l.crs === 'EPSG:4326') cpt = L.CRS.EPSG4326.project(pt)if (l.crs === 'EPSG:3857') cpt = L.CRS.EPSG3857.project(pt)l.cql_filter = 'INTERSECTS(geom,POINT(' + cpt.x + ' ' + cpt.y + '))'this.requestWFSData(l).then(res => {if (res.data.features.length !== 0) {var geoObj = L.geoJSON(res.data)content += res.data.features[0].properties[l.idField] + '</a>'this._clickResLayer = geoObj.addTo(this._map)geoObj.bindPopup(content).openPopup()		}})}})
}

三、案例数据

疫情数据:

来源于腾讯疫情小区地图,原接口已不能用,现在的地址是

https://map.wap.qq.com/app/mp/online/h5-epidemic-20200203/OutMapDetail.html?hideBrowserTitle=1

上海小区边界和学校边界(国测局/高德坐标)

扫描关注 “GIS攻城狮” 公众号,回复”上海小区学校边界“,获取数据数据百度云链接
在这里插入图片描述

四、案例项目代码

https://gitee.com/magic1412/h5_leaflet

在这里插入图片描述

这篇关于leaflet 移动端h5地图开发(一) 点聚合矢量瓦片(附项目代码和数据)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047483

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

mysql中的数据目录用法及说明

《mysql中的数据目录用法及说明》:本文主要介绍mysql中的数据目录用法及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、版本3、数据目录4、总结1、背景安装mysql之后,在安装目录下会有一个data目录,我们创建的数据库、创建的表、插入的

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN