如何下载 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-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 处理步骤

  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 进行认证请求。

相关推荐
全栈练习生10 小时前
AI Agent 沙箱
python·ai
SEO_juper11 小时前
用 Python 写一个 GEO 可见性检查脚本:你的网站现在能被 AI 引用吗
开发语言·人工智能·爬虫·python·seo·外贸独立站
用户83562907805112 小时前
使用 Python 对 Excel 工作表进行排序
后端·python
for_ever_love__13 小时前
MySQL 全文索引实战:FULLTEXT、ngram 中文分词与 MATCH AGAINST 到底该怎么用
java·python·mysql·全文检索·分词·索引·ngram
用户83562907805113 小时前
使用 Python 合并 PowerPoint 演示文稿
后端·python
weixin_4617694013 小时前
VS Code 中创建 Jupyter 文件(.ipynb)
ide·python·jupyter
2601_9669496513 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
全栈弄潮儿13 小时前
Python实战第1期:Python环境搭建与第一个程序
python
心易行者14 小时前
Agent应用+API端点商业化进阶实战:从单体智能体到可付费调用的API全流程
运维·服务器·人工智能·python·apache
weixin1997010801614 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存