在高德地图上展示 Shapefile 中的数据

ganymede_globes

这篇介绍一下如何将 Shapefile 转换为 WMS 图层并在高德地图上展示出来。

如果你是一名 GIS 开发者,那么你对 Shapefile 一定不陌生,它是一种用于存储地理要素的几何位置和属性信息的文件格式。具体来说,它主要通过几何图形(点、折线、多边形)存储道路、桥梁、河流等空间对象的几何位置。另外,它还可以通过不同的文字、颜色等标识出这些空间对象的属性。

很多地图制作工具都支持导出 shp 格式的数据(比如 ArcGIS),但是,如果想要通过第三方地图 SDK 加载这些数据,往往需要先做一步转换操作,比如转换为 WMS 图层 或者 KML 图层。这里,我就以高德地图为例,介绍如何通过 GeoServer 将 Shapefile 转换为 WMS 图层并加载到 Android 地图 SDK 中。

将 Shapefile 转换为 WMS

GeoServer 安装

GeoServer 是一个提供地图创建和数据分享服务的开源软件。我们可以通过官网下载 GeoServer 最新版本并启动本地服务 (sh ./bin/start.sh),然后根据教程登录进入 Web 管理后台

发布 Shapefile

参考官方例子发布 Shapefile,操作流程:

  1. Add new workspace
  2. Add new store (data source)
  3. Add all the new layers from the store

除此之外,我们还可以在 Layer Groups 中将多个 Layer 添加到同一个分组中。

访问 WMS

当我们将 Shapefile 中的数据全都转换为 WMS 图层之后,就可以通过 GeoServer 的 Layer Preivew 查看图层了。假设你将多个图层添加到了 Layer Group 中,那么访问路径就是:http://localhost:8080/geoserver/wms

需要注意的坑

在发布 Layer 时需要注意一下 SRS 的问题,比如我就遇到了无法读取 Native SRS 的问题。不过,由于绝大部分空间坐标系一般都是使用 EPSG:4326,如果你也遇到了这个问题,可以将 Declared SRS 设置为 EPSG:4326 来解决这个问题,参考:GeoServer: Coordinate Reference Systems

在高德地图上加载 WMS 图层

对于高德地图 Android SDK,可以通过自定义 UrlTileProvider 来加载 WMS 图层,具体的实现方式我参考了这篇文章:在高德地图 Android SDK 上添加 GeoServer 发布的 WMS 图层

大致的实现过程是,首先根据切片的像素点坐标、切片大小和缩放层级计算出距离,再将距离转换为经纬度,最后再将经纬度坐标进行一次转换,从高德地图使用的 GCJ02 坐标转换为 WGS84 坐标(使用 JZLocationConverter-for-Android),最后才能得到正确的 BBOX 范围。

示例代码见:AmapDemo