获取 ArcGIS REST 端点中每个服务、每个文件夹中每个图层的列表

问题描述 投票:0回答:3

我有两个 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 路线并附加

?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/mapservers_2016/mapserver?宽带文件夹 如有任何帮助,我们将不胜感激。我把它放在这里,而不是放在 GIS 堆栈交换中,因为它似乎是一个比地理空间更Python 的问题。

python-3.x rest arcgis arcgis-online
3个回答
0
投票

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

如果您打算继续使用 Esri 的 REST API 和 Python,我强烈建议您阅读 Esri 的

ArcGIS API for Python

。从本质上讲,ArcGIS API for Python 是一个用于与 Esri 的 REST API 配合使用的 Python 包装器。除非某人有非常基本的需求,否则为 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']}})



0
投票
https://gissurfer.com

) 的一部分,我面临着同样的问题,但对于不需要登录凭据的 any ArcGIS 服务器。我的解决方案是编写 PHP 代码来“遍历树”以查找所有服务。


0
投票
https://transparentgov.net/json2tree/esri/server2/searchLayer.html?org=https%3A%2F%2Fservices.arcgis.com%2Ff48yV21HSEYeCYMI%2Farcgis%2Frest%2Fservices&url=https%3A%2F%2Fservices。 arcgis.com%2Ff48yV21HSEYeCYMI%2Farcgis%2Frest%2Fservices&select_folder=1&select_layer=0&arcgis_online_token=&filter_by=

此示例列出了 arcgis 服务器上的所有图层

它的工作原理请参见这里

https://transparentgov.net/cleargov1/1278/palm-springs-ca-arcgis-asset

© www.soinside.com 2019 - 2024. All rights reserved.