CÓMO
En algunos casos, los usuarios activan la función Acceso a entidades en los servicios de mapas para poder descargar datos fácilmente. Sin embargo, los datos se pueden descargar desde un servicio de mapas en forma de JSON, y el código JSON se puede convertir en un archivo shapefile o una clase de entidad. Este artículo describe cómo usar este proceso con un servicio de mapas compartido públicamente mediante ArcPy y otras bibliotecas integradas de Python.
Las siguientes instrucciones muestran cómo buscar entidades en un servicio de mapas, escribir la respuesta JSON en un archivo y convertir el archivo JSON en un shapefile mediante la función arcpy.JSONToFeatures_conversion().Es posible usar la secuencia de comandos tal cual, o bien reescribirla como funciones que admitan una URL como argumento.
Haga los ajustes necesarios en los parámetros de consulta (se incluyen la mayoría de los parámetros posibles, aunque no todos). Los archivos de salida se almacenan en el directorio que contiene el script de Python.
# For Python 2 import urllib2, urllib, os, arcpy
# For Python 3 import urllib.parse, urllib.request, os, arcpy, json
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']
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
#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")
# 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()
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")
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")
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", )
Obtener ayuda de expertos en ArcGIS
Descargar la aplicación de soporte de Esri