python-3.x 获取ArcGIS REST端点中每个图层、每个服务和每个文件夹的列表

moiiocjp  于 7个月前  发布在  Python
关注(0)|答案(3)|浏览(59)

我有两个ArcGIS REST端点,我试图获取每个图层的列表:
https://rdgdwe.sc.egov.usda.gov/arcgis/rest/serviceshttps://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/MapServer?f=pjson将为我获取宽带文件夹中第一个服务(CDC_5yr_OpioidOverDoseDeaths_2016)中的CDC_OverDoseDeathsbyCounty2016_5yr层。
我把它放在这里与GIS堆栈交换中,因为它看起来比地理空间更像是一个Python问题。

qgzx9mmu

qgzx9mmu1#

我不太同意这是一个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是一个用于使用Esri REST API的Python Package 器。除非某人有非常基本的需求,否则为Esri REST API编写自己的Python代码并不值得。
如果您打算自己滚动,我强烈建议您阅读Get started -- ArcGIS REST APIs | ArcGIS Developers。文档描述了REST API的结构、语法,并包括一些示例。
以下内容并不美观,它更多的是为了帮助您在阅读Esri文档时将点连接起来。也就是说,它将给予您ArcGIS Server站点上的Map服务列表以及这些服务的图层。

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']}})

字符串

relj7zay

relj7zay2#

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

相关问题