-1

我有两个 ArcGIS REST 端点,我正在尝试获取每个图层的列表:

https://rdgdwe.sc.egov.usda.gov/arcgis/rest/services https://services1.arcgis.com/RLQu0rK7h4kbsBq5/ArcGIS/rest/services

这些不是我组织的端点,因此我无法在内部访问它们。在这些端点中的每一个都可以有文件夹、服务和层,或者只是服务和层。

我的目标是获取所有图层的列表。到目前为止,我已经尝试过:

endpoints=(["https://rdgdwe.sc.egov.usda.gov/arcgis/rest/services",
"https://services1.arcgis.com/RLQu0rK7h4kbsBq5/ArcGIS/rest/services"])

for item in endpoints:
    reqs = requests.get(item, verify=False) 
    # used this verify because otherwise I get an SSL error for endpoints[0]
    soup =BeautifulSoup(reqs.text, 'html.parser')

    layers = []
    for link in soup.find_all('a'):
        print(link.get('href'))
        layers.append(link)
     

但是,这并没有考虑到变量嵌套文件夹/服务/图层或服务/图层模式,而且它似乎没有完全附加到我的图层列表中。

我想我也可以走 JSON 路线并 append ?f=psjon。例如:

https://rdgdwe.sc.egov.usda.gov/arcgis/rest/services/?f=pjson会给我文件夹 https://rdgdwe.sc.egov.usda.gov/arcgis/rest/services/broadband /?f=pjson会给我宽带文件夹中的所有服务, https: //rdgdwe.sc.egov.usda.gov/arcgis/rest/services/broadband/CDC_5yr_OpioidOverDoseDeaths_2016/MapServer?f=pjson 会给我 CDC_OverDoseDeathsbyCounty2016_5yr宽带文件夹中的第一个服务 (CDC_5yr_OpioidOverDoseDeaths_2016) 中的图层。

任何帮助表示赞赏。我把它放在这里与 GIS 堆栈交换中,因为这似乎是一个比地理空间问题更多的 Python 问题。

4

2 回答 2

0

作为开发 GISsurfer ( https://gissurfer.com ) 的一部分,我遇到了这个确切的问题,但对于任何不需要登录凭据的 ArcGIS 服务器。我的解决方案是编写 PHP 代码来“遍历树”来查找所有服务。

于 2022-01-27T00:44:03.807 回答
0

我真的不同意这是一个 Python 问题,因为如何使用各种 Python 库似乎没有任何问题。主要问题似乎是如何使用 Esri 的 REST API。看到 Esri 在很大程度上是一家 GIS 公司,而他们的 REST API 在很大程度上是一个 GIS API,我认为 GIS StackExchange 会是一个更好的论坛来解决这个问题。

但是,既然我们现在在这里......

如果您打算继续使用 Python 使用 Esri 的 REST API,我强烈建议您阅读 Esri 的ArcGIS API for Python。ArcGIS API for Python 的核心是一个 Python 包装器,用于与 Esri 的 REST API 配合使用。除非有人有非常基本的需求,否则为 Esri 的 REST API 编写自己的 Python 代码并不值得花时间。

如果您打算自己动手,我强烈建议您阅读入门 - ArcGIS REST API | ArcGIS 开发人员。该文档描述了 REST API 的结构、语法,并包含一些示例。

以下内容并不漂亮,更多的是为了帮助您在阅读 Esri 的文档时联系起来。也就是说,它将为您提供 ArcGIS Server 站点上的地图服务列表以及这些服务的图层。

import json
import requests
import urllib3


urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

services = {}
services_endpoint = "https://fqdn/arcgis/rest/services"
req = requests.get(f"{services_endpoint}?f=json", verify=False)
svcs_root = json.loads(req.text)

for fld in svcs_root['folders']:
    req = requests.get(f"{services_endpoint}/{fld}?f=json", verify=False)
    svcs_fld = json.loads(req.text)
    for svc in svcs_fld['services']:
        if svc['type'] not in ('MapServer'): continue
        req = requests.get(f"{services_endpoint}/{svc['name']}/{svc['type']}?f=json", verify=False)
        svc_def = json.loads(req.text)
        services.update({svc['name']:{'type':svc['type'], 'layers':svc_def['layers']}}) 

for svc in svcs_root['services']:
    if svc['type'] not in ('MapServer'): continue
    req = requests.get(f"{services_endpoint}/{svc['name']}/{svc['type']}?f=json", verify=False)
    svc_def = svc = json.loads(req.text)
    services.update({svc['name']:{'type':svc['type'], 'layers':svc_def['layers']}})


于 2022-01-26T20:15:44.843 回答