如何下载 ArcGIS 官方数据图层

本文介绍如何从 ArcGIS Online 的 WebMap 中下载指定图层数据,并转换为 GeoJSON 格式。整个过程分为三个步骤:确认图层 URL编写爬虫脚本数据处理


一、确认图层 URL

要从 ArcGIS Online 的 WebMap 中下载指定图层,首先需要定位目标图层对应的 REST 服务地址。

操作步骤

  1. 打开 WebMap 链接

    若目标图层 WebMap ID 为 xxx,访问以下链接:

    复制代码
    https://www.arcgis.com/apps/mapviewer/index.html?webmap=2b3e59efaa7f495e8e743ebfbeba95ca
  2. 搜索图层关键词

    Ctrl+F 搜索图层关键词,例如:

    • Qingcourierroutes
    • buddistsites
  3. 定位图层 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-AgentContent-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 处理步骤

  1. 导入数据

    将下载的 GeoJSON 文件拖入 QGIS,或通过 图层 → 添加图层 → 添加矢量图层 导入。

  2. 投影转换

    • 右键图层 → 导出 → 保存要素为...
    • 格式选择:GeoJSON
    • CRS 设置为:WGS84 (EPSG:4326)
    • 指定输出文件路径,点击确定
  3. 验证数据

    检查属性表是否完整,几何信息是否正确,确保数据可用性。


注意事项

事项 说明
⚠️ 服务限制 部分图层可能设置访问权限,需登录或申请 API Key
⚠️ 请求频率 避免高频请求,建议添加延时(如 time.sleep(1)
⚠️ 数据版权 下载的数据请遵守 ArcGIS 使用条款,注明数据来源
⚠️ 网络稳定 大批量下载时确保网络稳定,建议添加重试机制

总结

通过以上三步,您可以高效地从 ArcGIS Online 下载任意公开图层的矢量数据,并转换为通用的 GeoJSON 格式。该方法适用于大多数 ArcGIS Feature Service 图层,是获取地理空间数据的实用技巧。

💡 提示:如遇到访问限制,可尝试在 ArcGIS Online 注册账号后获取 Token 进行认证请求。

相关推荐
Kapaseker2 小时前
Python 正在遭遇人气下滑
后端·python
Autumn72992 小时前
【系统重装】PYTHON 入门——速通版
开发语言·python·conda·cuda
ding_zhikai2 小时前
【Web应用开发笔记】Django笔记3:模版的用法-实现一个简单的网页
笔记·后端·python·django
FL16238631292 小时前
基于yolov11+django+deepseek的血液细胞红白细胞血小板检测系统带登录界面python源码+onnx模型+精美web界面
python·yolo·django
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 9 章-分类模型
人工智能·python·学习·算法·机器学习·计算机视觉·分类
Dxy12393102162 小时前
DataFrame缺失值处理:完整指南与实战技巧
python·pandas·dataframe
geovindu2 小时前
python: Visitor Pattern
python·设计模式·访问者模式
哈里谢顿2 小时前
TCP 线程池连接耗尽故障排查指导
python
zhaoyin19943 小时前
关于文件读取中使用的斜杠问题
python