如何下载 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 进行认证请求。

相关推荐
ZC跨境爬虫7 分钟前
极验滑动验证码自动化实战(ddddocr免费方案):本地缺口识别与Playwright滑动模拟
前端·爬虫·python·自动化
单片机学习之路31 分钟前
【Python】输入print函数
开发语言·前端·python
后藤十八里31 分钟前
极验4消消乐验证码逆向笔记
笔记·爬虫·python
李昊哲小课37 分钟前
Python办公自动化教程 - 第1章 openpyxl基础入门 - 第一次用代码操控Excel
开发语言·python·excel·openpyxl
智算菩萨39 分钟前
【Python图像处理】4 NumPy数组操作与图像矩阵运算
图像处理·python·numpy
SomeB1oody39 分钟前
【Python深度学习】1.1. 多层感知器MLP(人工神经网络)介绍
开发语言·人工智能·python·深度学习·机器学习
数据科学小丫43 分钟前
数据分析利器 Pandas :apply() 方法 + map() 配对 + 计算描述统计 + 协方差和相关性 + 异常值处理常用方法(基于 python )
python·数据分析·numpy·pandas
财经资讯数据_灵砚智能1 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(日间)2026年4月6日
大数据·人工智能·python·信息可视化·语言模型·自然语言处理·ai编程
爱写代码的小朋友1 小时前
使用 Nuitka 打包 Python 应用:从入门到进阶
开发语言·python
不屈的铝合金1 小时前
Python入门:数字类型与运算
python·数据类型·python类型判断与转换·python运算符优先级