本文介绍如何从 ArcGIS Online 的 WebMap 中下载指定图层数据,并转换为 GeoJSON 格式。整个过程分为三个步骤:确认图层 URL 、编写爬虫脚本 、数据处理。
一、确认图层 URL
要从 ArcGIS Online 的 WebMap 中下载指定图层,首先需要定位目标图层对应的 REST 服务地址。
操作步骤
-
打开 WebMap 链接
若目标图层 WebMap ID 为
xxx,访问以下链接:https://www.arcgis.com/apps/mapviewer/index.html?webmap=2b3e59efaa7f495e8e743ebfbeba95ca -
搜索图层关键词
按
Ctrl+F搜索图层关键词,例如:Qingcourierroutesbuddistsites
-
定位图层 URL
在返回的响应体中,找到
operationalLayers数组,定位对应图层的url字段。该 URL 指向一个 ArcGIS Feature Service 的具体图层端点,格式通常如下:https://services.arcgis.com/xxx/arcgis/rest/services/图层名/FeatureServer/图层ID

二、编写爬虫脚本
由于 ArcGIS 服务对单次查询返回的要素数量有限制(默认最大 2000 条 ),直接使用 where=1=1&f=geojson 可能无法获取全部数据。因此采用两阶段策略进行数据抓取。
核心思路
| 阶段 | 操作 | 目的 |
|---|---|---|
| 第一阶段 | POST 请求 /query 接口,设置 returnIdsOnly=true |
获取所有要素的 ObjectID 列表 |
| 第二阶段 | 将 ID 分批(每批 1000 个),POST 请求批量查询 | 获取完整属性和几何信息 |
脚本要点
- 使用 POST 请求 :避免 URL 过长导致的
414 Request-URI Too Large错误 - 设置请求头 :配置合理的
User-Agent和Content-Type,模拟合法客户端 - 分批处理:每批 1000 个 ID,低于服务上限以确保稳定性
- 进度显示 :利用
tqdm库显示下载进度,提升交互体验 - 数据合并 :所有批次返回的 GeoJSON 特征合并到统一的
FeatureCollection结构 - 文件保存 :以 UTF-8 编码写入本地
.geojson文件
示例代码
代码已上传至GitHub:https://github.com/ANN-POWER/geospatial-toolkit.git
python
import requests
import json
import math
from tqdm import tqdm
# LAYER_URL 输入目标图层 url ;OUTFILE是保存文件地址
LAYER_URL ="https://services7.arcgis.com/iEMmryaM5E3wkdnU/arcgis/rest/services/4ee48ac3_1ca0_4da9_818c_871c802c5137/FeatureServer/0"
OUTFILE ="Qing Courier Routes.geojson"
PAGE_SIZE = 1000 # ArcGIS 推荐 <= 2000
HEADERS = {
"User-Agent": "Mozilla/5.0",
"Content-Type": "application/x-www-form-urlencoded"
}
def post_json(url, data):
r = requests.post(url, data=data, headers=HEADERS)
r.raise_for_status()
return r.json()
def get_object_ids():
data = {
"where": "1=1",
"returnIdsOnly": "true",
"f": "json"
}
j = post_json(LAYER_URL + "/query", data)
return j["objectIds"]
def query_by_oid_list(oids):
data = {
"objectIds": ",".join(map(str, oids)),
"outFields": "*",
"f": "geojson"
}
return post_json(LAYER_URL + "/query", data)
def main():
print("Fetching object IDs...")
object_ids = get_object_ids() # ← POST 方式,不会 404
print(f"Total objectIds: {len(object_ids)}")
features = []
batches = math.ceil(len(object_ids) / PAGE_SIZE)
for i in tqdm(range(batches)):
batch = object_ids[i*PAGE_SIZE:(i+1)*PAGE_SIZE]
j = query_by_oid_list(batch)
feats = j.get("features", [])
features.extend(feats)
# 保存 GeoJSON
geojson = {
"type": "FeatureCollection",
"features": features
}
with open(OUTFILE, "w", encoding="utf-8") as f:
json.dump(geojson, f, ensure_ascii=False)
print(f"✔ 完成!已保存到 {OUTFILE}, 共 {len(features)} 条记录")
if __name__ == "__main__":
main()
三、数据处理
下载完成后,建议对数据进行投影转换和格式验证。
QGIS 处理步骤
-
导入数据
将下载的 GeoJSON 文件拖入 QGIS,或通过
图层 → 添加图层 → 添加矢量图层导入。 -
投影转换
- 右键图层 →
导出 → 保存要素为... - 格式选择:GeoJSON
- CRS 设置为:WGS84 (EPSG:4326)
- 指定输出文件路径,点击确定
- 右键图层 →
-
验证数据
检查属性表是否完整,几何信息是否正确,确保数据可用性。
注意事项
| 事项 | 说明 |
|---|---|
| ⚠️ 服务限制 | 部分图层可能设置访问权限,需登录或申请 API Key |
| ⚠️ 请求频率 | 避免高频请求,建议添加延时(如 time.sleep(1)) |
| ⚠️ 数据版权 | 下载的数据请遵守 ArcGIS 使用条款,注明数据来源 |
| ⚠️ 网络稳定 | 大批量下载时确保网络稳定,建议添加重试机制 |
总结
通过以上三步,您可以高效地从 ArcGIS Online 下载任意公开图层的矢量数据,并转换为通用的 GeoJSON 格式。该方法适用于大多数 ArcGIS Feature Service 图层,是获取地理空间数据的实用技巧。
💡 提示:如遇到访问限制,可尝试在 ArcGIS Online 注册账号后获取 Token 进行认证请求。