最近在读论文与访问别人网站的的时候,发现有许多作者会将自己的研究成果(如数据集等)上传到网络地图上供人访问,以促使开放科学发展与研究成果传播。其中有一类就是上传到 ArcGIS 的在线地图平台。存储在这一平台上的数据并不能“直接”下载到本地用于后续研究,因为它们并不是以 shapefile 或 geojson 等通用地理数据格式直接存储,而是保存在 ArcGIS Server 这一服务目录上,在使用时通过地图服务(Map Service)调用的。机缘巧合下,我琢磨出了两种简单的方法,可以快速从 ArcGIS REST 后端提取所需要的数据。
获取在线链接
在浏览器中使用开发者工具,在“Network”选项卡下刷新,以找到目标数据链接。
对比高德地图与 ArcGIS 在线地图获取矢量数据的不同,可以发现,前者的数据以 json 格式明文存储,可以通过一个指向文件的链接直接获取;而后者的链接则指向了一个 ArcGIS 服务器目录的端点链接。这个链接中的rest/services
就表示了 rest 的服务端点,用户可以从中看到根目录中所有的服务列表与文件夹。注意,arcgis 这个链接最后的?f=json
并不代表能直接下载 json 格式的数据,访问返回的只是目标图层的元数据。
REST (Representational State Transfer) 是一个通过使用简单的 HTTP 协议以共享信息的架构。
方法一:使用 esridump
首先,通过 pip 安装 esridump:
pip install esridump
最简单的方式就是通过命令行使用:
esri2geojson [Esri REST layer endpoint URL] [out_name.geojson]
以下面这个链接为例:
可以直接访问这个链接(如有的话,需去除最后的?f=json
的字符),之后会进入ArcGIS Server 的服务目录:
于在线地图中展示图层,效果如下:
使用 esridump 下载数据:
在 QGIS 中打开下载的数据,发现要素和属性表都正确地获取到了:
方法二:通过 QGIS 下载
获取到链接后,直接在 QGIS 中新建一个 ArcGIS REST Servers 链接,这个不需要精确到图层。待数据全部渲染完成后,再导出即可。这个方法加载数据相对更慢一些。