CÓMO

Extraer datos de un servicio de mapas mediante Python

Last Published: August 24, 2021

Resumen

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.

Procedimiento

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.

  1. Importar las bibliotecas necesarias.
# For Python 2 import urllib2, urllib, os, arcpy
# For Python 3 import urllib.parse, urllib.request, os, arcpy, json
  1. Si se requiere un token para acceder a un servicio seguro, utilice el fragmento de código que aparece a continuación. En caso contrario, continúe en el paso 3.
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. Especificar la URL deseada.
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
  1. Realizar la consulta de parámetros.
#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. Crear una solicitud y leerla mediante 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. Escribir la respuesta de JSON en el archivo de texto.
with open("mapservice.json", "wb") as ms_json: ms_json.write(json)
  1. Convertir el JSON en un shapefile mediante la función JSONToFeatures.
ws = os.getcwd() + os.sep arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")
   
A continuación, se muestra el código completo para Python 2.7 instalado con ArcMap y 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")

A continuación, se muestra el código completo para Python 3 instalado con 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", )

Id. de artículo:000019645

Obtener ayuda de expertos en ArcGIS

Contactar con soporte técnico

Descargar la aplicación de soporte de Esri

Ir a las opciones de descarga

Información relacionada

Descubrir más sobre este tema