我有两个 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 的问题。
但是,既然我们现在在这里......
如果您打算继续使用 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']}})
) 的一部分,我面临着同样的问题,但对于不需要登录凭据的 any ArcGIS 服务器。我的解决方案是编写 PHP 代码来“遍历树”以查找所有服务。