GeoServer发布ArcMap配图

项目过程中遇到一个需求: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文件,将切片文件从里面解压出来。拷出来需要有以下这些东西。

二、配置GeoServer

  1. 给GeoServer设置缓存路径,在GeoServer文件夹下打开webapps/geoserver/WEB-INF/web.xml,在里面加入如下代码,其中param-value下填入缓存要存放的路径,保存。然后将ArcGIS切片文件拷进这个文件夹。

    <context-param>
    <param-name>GEOWEBCACHE_CACHE_DIR</param-name>
    <param-value>/home/zxhm/geoserver/cache_dir</param-value>
    </context-param>
  2. 随后启动GeoServer,GeoServer会在缓存路径下生成geowebcache.xml文件,在里面的layers节点下面加入如下代码。其中tilingScheme节点下填入要发布的切片的conf.xml路径,里面主要是瓦片配置。tileCachePath节点下加入_alllayers的路径。

    <arcgisLayer>
    <name>hbw_tiled</name>
    <tilingScheme>/home/zxhm/geoserver/cache_dir/hbw_tiled/conf.xml</tilingScheme>
    <tileCachePath>/home/zxhm/geoserver/cache_dir/hbw_tiled/_alllayers</tileCachePath>
    <hexZoom>false</hexZoom>
    </arcgisLayer>

三、配置GeoWebCache

GeoServer是不支持arcgisLayer的,因此需要借助GeoWebCache插件。虽然比较新的版本是自带GeoWebCache插件的,但是他又把里面识别arcgisLayer的功能给摘了出去,所以需要配置一下。

  1. 在这里下载一个完整版的GeoWebCache,把里面的geowebcache.war用压缩软件打开,从/WEB-INF下解压出geowebcache-arcgiscache-context.xml,从/WEB-INF/lib种解压出gwc-arcgiscache-x.x.x.jar
  2. 打开GeoServer文件夹webapps/geoserver/WEB-INF/lib,将gwc-arcgiscache-x.x.x.jar拷到里面。找到gs-gwc-x.x.x.jar,用压缩软件打开,将geowebcache-arcgiscache-context.xml加入其中。
  3. gs-gwc-x.x.x.jar中找到geowebcache-servlet.xml,在里面加入
    <import resource="geowebcache-arcgiscache-context.xml"/>

找到geowebcache-core-context.xml,在里面加入

<bean id="gwcArcGISGridsetConfiguration" class="org.geowebcache.arcgis.layer.ArcGISCacheGridsetConfiguration"/>
  1. 启动GeoServer,检查切片图层里是否有在第二步发布的图层。选择坐标系和格式可以看看能否预览。

四、Leaflet加载

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)
加载评论框需要翻墙