当前位置: 代码迷 >> 综合 >> leaflet:入门基础(三)之加载数据
  详细解决方案

leaflet:入门基础(三)之加载数据

热度:25   发布时间:2024-01-29 13:10:42.0

前言

    上一篇 leaflet:入门基础(二)  讲了如何加载底图

    这一篇将讲解如何加载自己已有的数据

 

1:加载Geojson数据

    注:如果手上有shp数据,可以通过https://mapshaper.org/转换得到geojson数据(使用说明[链接])

var map = new L.Map('map', {center: new L.LatLng(39.86,116.45),zoom: 10});var baseLayers = L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18}).addTo(map);var geoJSON = { // 填入此处 };var layerGeo = L.geoJSON(geoJSON, {}).addTo(map);

    如果对数据渲染样式有要求也可以进行修改

var myStyle = {"color": "green","weight": 3,"opacity": 0.5,};var layerGeo = L.geoJSON( geoJSON, { style:myStyle }).addTo(map);
数据来源:http://datav.aliyun.com/tools/atlas/#&lat=30.733573157600023&lng=103.74938964843748&zoom=9 

 

2:加载矢量切片

    安装 geoserver [链接],此时geoserver最新版本为 2.17.1,但并没有找到以Windows安装程序下载,而在 2.15.1 找到了可执行程序版[链接]。GeoServer项目丢失了用于构建安装程序的Windows构建服务器,所以 2.15.1 是目前最后一个拥有windows installer的版本,为了避免与Tomcat端口号冲突要修改GeoServer的端口号 [链接]。

    同时还要下载一个同版本的 geoserver-2.15.1-vectortiles-plugin.zip, 如果用的是windows installer,则插件解压出来放入geoserver安装目录\webapps\geoserver\WEB-INF\lib;如果用的是war,则放入tomcat安装目录/geoserver/WEB-INF/lib

    geoserver 发布矢量切片 [链接] 。 我用了一个广州天河区路网 坐标系 EPSG:900913

    遇到的问题:发布好后,用 leaflet 调用却没有显示,花了两天才找到问题。详见另一篇文章 [点击跳转]  

 

    导入其它需要的js文件

<script src="https://unpkg.com/leaflet.vectorgrid@latest/dist/Leaflet.VectorGrid.bundled.js"></script>
<script src="https://unpkg.com/leaflet.vectorgrid@latest/dist/Leaflet.VectorGrid.js"></script>

    加载底图

var map = new L.Map('map', {center: new L.LatLng(23.16,113.35),zoom: 12,crs: L.CRS.EPSG900913});var baseLayers = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png', {maxZoom: 20 }).addTo(map);

    获得 geoserver 发布的数据地址,加载矢量切片

var url = "http://localhost:8081/geoserver/gwc/service/tms/1.0.0/cite%3Atianhe@EPSG%3A900913@pbf/{z}/{x}/{-y}.pbf";var vectorTileOptions = {layerURL: url,rendererFactory: L.canvas.tile,           tms: true, // 如果是 TMS 方式,则必须开启
}; var vectorTile = new L.vectorGrid.protobuf(url, vectorTileOptions).addTo(map);

    还可以设置显示样式,比如这里我希望把 车陂路 凸显出来

var vectorTileOptions = {'...', // 与上面一致,这里不重复写了vectorTileLayerStyles: {      'tianhe': function (properties, zoom) { // tianhe 为切片图层名称          var name = properties.Name; // 获取图层的 Name 属性if( name == "车陂路-道路"){return {            weight: 5,            color: 'red',       }      }else{return {            weight: 1,            color: 'green',       }      }}    },
}; 

 还可以添加一个鼠标事件

var vectorTileOptions = {'...', // 与上面一致,这里不重复写了interactive: true,	//开启VectorGrid触发mouse/pointer事件
}; vectorTile.on('mouseover', function (e) {    var properties = e.layer.properties;    L.popup().setContent(properties.Name).setLatLng(e.latlng).openOn(map);  }
);