On the webpage of the REST services URL there is a json
link at the top left. Clicking this will show a json
of the service metadata, including a list of names. Likewise, a similar link will show a json
of all the layers in each service.
The service names and corresponding layers can be extracted like so:
import urllib.request, json
json_url = 'https://gis.adem.alabama.gov/arcgis/rest/services?f=pjson'
# download the services json
with urllib.request.urlopen(json_url) as url:
data = json.loads(url.read().decode())
# get services from the json
services = data['services']
# get names and types of services
for i,x in enumerate(services):
print(i, ' | ', x['name'], ' | ', x['type'])
# number of service
num = 5
# get name and type from list
service_name = services[num]['name']
service_type = services[num]['type']
# get layers from service
layers_url = f"https://gis.adem.alabama.gov/arcgis/rest/services/{service_name}/{service_type}/layers?f=pjson"
# download the layers json
with urllib.request.urlopen(layers_url) as url:
data = json.loads(url.read().decode())
layers = data['layers']
available_layers = []
for layer in layers:
available_layers.append([layer[k] for k in ['id', 'name', 'type', 'geometryType']])
[print(x) for x in available_layers]
## pick a layer
layer_index = 0
# check that the chosen index is available
if layer_index in (x[0] for x in available_layers):
# build the REST service url
uri = f"crs='EPSG:4326' url='https://gis.adem.alabama.gov/arcgis/rest/services/{service_name}/{service_type}/{layer_index}"
# make QGIS layer
lyr = QgsVectorLayer(uri, layer['name'], "arcgisfeatureserver")
# add to map
QgsProject.instance().addMapLayer(lyr)
else:
print(f"chosen layer index ({layer_index}) is not in available layers")