公司近期会有项目需要实现在内网环境下调用高德、百度地图,但是内网与互联网又是物理隔离,无法直接调用各地图api,目前的方法是,将需要使用的地图下载到本地服务器上,并通过geoserver发布为服务,来实现调用。
步骤分为以下几步:
一、下载地图数据
在各种地图下载器中流连之后,发现还是“太乐地图下载器”好用些,下载下来直接就可以发布,只需要注册下就可以。【其他下载器:BIGEMAP下载器、水经注、sxearth等,只是繁琐程度不同,都可以使用】
‘太乐’下载步骤放在文章末尾,需要请移步(毕竟不是文章重点(0.。0))
第二种下载方式(python)
需要下载PyCharm 2021.1.2 x64程序,将python包丢进去进行下载
代码下载位置:
链接:https://pan.baidu.com/s/1tce6iEiVW5lLyFyr93asTg
提取码:a21k
#raw_input(“等待中…”)这句需要注释才能执行
二、发布服务(geoserver)
【新建工作区——新建数据存储——发布为图层——切片处理】
①新建工作区
②新建数据存储
接下来需要根据下载数据的类型选择数据存储的格式,我这里下载的地图是tif格式的影像数据,因此需要选择“栅格数据”中的"GeoTIFF"
确定后自动跳转,点击“发布”按钮
一般需要调整的只有这两个选项卡中的内容,其中“数据”选项卡中需要确认图层边框、坐标参考系统、覆盖参数。覆盖参数默认为空,此时加载图层会有黑边,调整为“000000”(即纯黑色),可以去掉黑边。"Tile Caching"选项卡中需要调整网格集的坐标系统,只留下需要的就可以,我这边只留下“EPSG:3857”。【ps:如果是刚安装的geoserver,一般来说没有这个坐标系,需要手动添加,找页面最左侧“Gridsets”即可】
完成后点击“保存”
点击Tile Layers,在刚刚添加的图层后选择“Seed/Truncate”
此时就做好了切片处理,切片存储在data_dir文件夹下的gwc文件夹里
多个图层发布服务就重复以上步骤即可。
三、调用服务地图
我这里使用的是leaflet,其他框架大同小异
对地图缩放做监听,每次地图缩放就调用对应级别的影像
//写给新手:“()=>”近似于function ***(),相当于不用写名称的方法
//具体差异自行百度
mymap.on('zoomend',()=>{
//wmsLayer提前定义了全局变量
if(wmsLayer){
mymap.removeLayer(wmsLayer);
}
//let是es6的用法,作用为定义局部变量
let mm=mymap.getZoom();
wmsLayer = L.tileLayer.wms("http://localhost:8080/geoserver/try/wms", {
layers: 'try:L'+mm, //需要加载的图层
format: 'image/png', //返回的数据格式
transparent: true,
//crs: L.CRS.EPSG4326
});
mymap.addLayer(wmsLayer);
})
同一位置不同级别效果
看其他大佬采用方法为多图层切片后,把切片后的文件整理到一个文件夹下,然后就可以实现自动切换,但是我试过后发现只有在geoserver中预览时才会这样,实际调用的时候还是只显示其中一个图层的,百撕不得其姐,很奇怪,如果有大佬知道,烦请告知一二,或者日后我研究出来再更新本文。
下载地图(使用“太乐地图下载器”)
如果未注册的话,下载的地图会有水印,因此建议下载带注册机的“学习”版本。
然后会进入下载界面,下载完成后自动在屏幕右下角弹出窗口询问是否导出地图,
下载完成后自动打开位置