HOW TO

Extrahieren von Daten aus einem Kartenservice mithilfe von Python

Last Published: August 24, 2021

Zusammenfassung

In manchen Fällen aktivieren Benutzer in Kartenservices die Funktion "Feature Access", um das einfache Herunterladen von Daten zu ermöglichen. Daten können jedoch im JSON-Format von einem Kartenservice heruntergeladen werden. Der JSON-Code kann in ein Shapefile oder eine Feature-Class konvertiert werden. In diesem Artikel wird beschrieben, wie Sie diesen Vorgang mit einem öffentlich freigegebenen Kartenservice mithilfe von ArcPy und anderen integrierten Python-Bibliotheken durchführen.

Vorgehensweise

Mit den folgenden Anweisungen wird gezeigt, wie Sie Features aus einem Kartenservice abfragen, die JSON-Antwort in eine Datei schreiben und die JSON-Datei mit der Funktion "arcpy.JSONToFeatures_conversion()" in ein Shapefile konvertieren.Sie können das Skript unverändert verwenden oder es in Funktionen formatieren, die ein URL-Argument akzeptieren.

Passen Sie die Abfrageparameter nach Bedarf an (die meisten, wenn auch nicht alle, möglichen Parameter sind enthalten). Die Ausgabedateien werden in dem Verzeichnis gespeichert, in dem sich das Python-Skript befindet.

  1. Importieren Sie die erforderlichen Bibliotheken.
# For Python 2 import urllib2, urllib, os, arcpy
# For Python 3 import urllib.parse, urllib.request, os, arcpy, json
  1. Wenn für den Zugriff auf einen gesicherten Service ein Token erforderlich ist, verwenden Sie den folgenden Codeausschnitt. Fahren Sie andernfalls mit Schritt 3 fort.
username = "adminaccount" password = "adminpassword" tokenURL = 'https://machine.domain.com/portal/sharing/rest/generateToken/' params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'https://machine.domain.com'} #For Python 2 req = urllib2.Request(tokenURL, urllib.urlencode(params)) response = urllib2.urlopen(req) #For Python 3 data = urllib.parse.urlencode(query=params).encode('utf-8') req = urllib.request.Request(tokenURL, data) response = urllib.request.urlopen(req) data = json.loads(response.read()) token = data['token']
  1. Geben Sie die gewünschte URL an.
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
  1. Fragen Sie die Parameter ab.
#For Python 2 params = urllib.urlencode({'where': '1=1', 'geometryType': 'esriGeometryEnvelope', 'spatialRel': 'esriSpatialRelIntersects', 'relationParam': '', 'outFields': '*', 'returnGeometry': 'true', 'geometryPrecision':'', 'outSR': '', 'returnIdsOnly': 'false', 'returnCountOnly': 'false', 'orderByFields': '', 'groupByFieldsForStatistics': '', 'returnZ': 'false', 'returnM': 'false', 'returnDistinctValues': 'false', 'f': 'pjson' })
# For Python 3 params = {'where': '1=1', 'geometryType': 'esriGeometryEnvelope', 'spatialRel': 'esriSpatialRelIntersects', 'relationParam': '', 'outFields': '*', 'returnGeometry': 'true', 'geometryPrecision':'', 'outSR': '', 'returnIdsOnly': 'false', 'returnCountOnly': 'false', 'orderByFields': '', 'groupByFieldsForStatistics': '', 'returnZ': 'false', 'returnM': 'false', 'returnDistinctValues': 'false', 'f': 'pjson',   'token': token } encode_params = urllib.parse.urlencode(params).encode("utf-8")
  1. Erstellen Sie eine Anforderung, und lesen Sie sie mithilfe von urllib.
# For Python 2 request = urllib2.Request(url, params) response = urllib2.urlopen(request) json = response.read()
# For Python 3 response = urllib.request.urlopen(url, encode_params) json = response.read()
  1. Schreiben Sie die JSON-Antwort in eine Textdatei.
with open("mapservice.json", "wb") as ms_json: ms_json.write(json)
  1. Konvertieren Sie den JSON-Code mit der Funktion "JSONToFeatures" in ein Shapefile.
ws = os.getcwd() + os.sep arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")
   
Dies ist der vollständige Code für Python 2.7 bei Installation mit ArcMap und ArcGIS Server:
import urllib2, urllib, os, arcpy url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?" params = urllib.urlencode({'where': '1=1', 'geometryType': 'esriGeometryEnvelope', 'spatialRel': 'esriSpatialRelIntersects', 'relationParam': '', 'outFields': '*', 'returnGeometry': 'true', 'geometryPrecision':'', 'outSR': '', 'returnIdsOnly': 'false', 'returnCountOnly': 'false', 'orderByFields': '', 'groupByFieldsForStatistics': '', 'returnZ': 'false', 'returnM': 'false', 'returnDistinctValues': 'false', 'f': 'pjson' }) request = urllib2.Request(url, params) response = urllib2.urlopen(request) json = response.read() with open("mapservice.json", "wb") as ms_json:     ms_json.write(json) ws = os.getcwd() + os.sep arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")

Dies ist der vollständige Code für Python 3 bei Installation mit ArcGIS Pro:
import urllib.parse, urllib.request, os, arcpy, json arcpy.env.overwriteOutput = True # Specify built-in Portal for ArcGIS account credentials username = "portaluser" password = "portalpassword" tokenURL = 'https://server.domain.com/portal/sharing/rest/generateToken/' params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'https://server.domain.com'} data = urllib.parse.urlencode(query=params).encode('utf-8') req = urllib.request.Request(tokenURL, data) response = urllib.request.urlopen(req) data = json.loads(response.read()) token = data['token'] # Specify REST URL for service JSON to be returned url = "https://server.domain.com/server/rest/services/servicename/MapServer/0/query?" params = {'where': '1=1',           'geometryType': 'esriGeometryEnvelope',           'spatialRel': 'esriSpatialRelIntersects',           'relationParam': '',           'outFields': '*',           'returnGeometry': 'true',           'geometryPrecision': '',           'outSR': '',           'returnIdsOnly': 'false',           'returnCountOnly': 'false',           'orderByFields': '',           'groupByFieldsForStatistics': '',           'returnZ': 'false',           'returnM': 'false',           'returnDistinctValues': 'false',           'f': 'pjson',           'token': token           } encode_params = urllib.parse.urlencode(params).encode("utf-8") response = urllib.request.urlopen(url, encode_params) json = response.read() with open("mapservice.json", "wb") as ms_json:     ms_json.write(json) ws = os.getcwd() + os.sep arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp", )

Artikel-ID:000019645

Hilfe von ArcGIS-Expert*innen erhalten

Technischen Support kontaktieren

Die Esri Support-App herunterladen

Zu den Download-Optionen

Zugehörige Informationen

Weitere Informationen zu diesem Thema erkunden