项目过程中遇到一个需求:leaflet要使用自定义的底图。现在配图一般都会用ArcMap,但是不能使用ArcGIS Server发布(没买)。所以需要研究一下怎样把ArcMap配的地图用GeoServer发布出去。
首先需要明确一点,动态地图服务(WMS)想都不要想,他是实时渲染的,需要数据+样式,只能发布瓦片服务。
数据准备分两步:
第一步,确定数据和mxd文件都是WGS 1984 Web Mercator Auxiliary Sphere(WKID:3857)坐标系。我这里是需要使用Leaflet加载,3857是最方便的。其他情况也需要尽量保证数据和配图都是投影坐标系,否则GeoServer的GeoWebCache插件不好处理。
第二步:切片获得arcgis瓦片。这里有两种方式,一种是发布到ArcGIS Server等待其切片完成,一种是分享为切片包。使用第二种方式需要在ArcMap里打开相关的选项:Customize>Sharing>Enable ArcGIS Runtime Tools,这里需要注意,很多同志ArcGIS10.4以后的版本是通过直接覆盖AfCore.dll破解而不是通过License破解的,这种破解方式这个ArcGIS Runtime Tools是用不了的。
无论采取什么切片方式,如果最终使用leaflet加载,推荐使用用自带的Arcgis Online…切片方案,可适当调整级别,不然会很大很大。如果有其他的需求,可以自己使用ArcGIS工具箱里的切片方案制作工具来做一个。
最后如果使用ArcGIS Server切片,就将切片文件从缓存文件夹里拷出来,如果分享成切片包,就将切片包改成.zip文件,将切片文件从里面解压出来。拷出来需要有以下这些东西。
GEOWEBCACHE_CACHE_DIR /home/zxhm/geoserver/cache_dir
hbw_tiled /home/zxhm/geoserver/cache_dir/hbw_tiled/conf.xml /home/zxhm/geoserver/cache_dir/hbw_tiled/_alllayers false
GeoServer是不支持arcgisLayer的,因此需要借助GeoWebCache插件。虽然比较新的版本是自带GeoWebCache插件的,但是他又把里面识别arcgisLayer的功能给摘了出去,所以需要配置一下。
geowebcache-arcgiscache-context.xml
,从/WEB-INF/lib种解压出gwc-arcgiscache-x.x.x.jar
gwc-arcgiscache-x.x.x.jar
拷到里面。找到gs-gwc-x.x.x.jar
,用压缩软件打开,将geowebcache-arcgiscache-context.xml
加入其中。gs-gwc-x.x.x.jar
中找到geowebcache-servlet.xml
,在里面加入
找到geowebcache-core-context.xml
,在里面加入
Leaflet加载就是普普通通加载WMTS了,代码如下:
const params = 'layer=hbw_tiled&style=&tilematrixset=EPSG:3857_hbw_tiled&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png'
L.tileLayer(`${geoServerBase}gwc/service/wmts?${params}&TileMatrix=EPSG:3857_hbw_tiled:{z}&TileCol={x}&TileRow={y}`,{maxZoom: 18,minZoom: 12,
}).addTo(map)