Instrução

Extrair dados de um serviço de mapa usando Python

Last Published: August 24, 2021

Resumo

Em alguns casos, os usuários habilitam a função Acesso à Feição nos serviços de mapa para permitir o download fácil dos dados. No entanto, os dados podem ser baixados de um serviço de mapa na forma de JSON e o código JSON pode ser convertido em um shapefile ou classe de feição. Este artigo descreve como fazer isso com um serviço de mapa compartilhado publicamente usando ArcPy e outras bibliotecas Python integradas.

Procedimento

As instruções a seguir demonstram como consultar um serviço de mapa para feições, gravar a resposta JSON em um arquivo e converter o arquivo JSON em um shapefile usando a função arcpy.JSONToFeatures_conversion().É possível usar o script no estado em que se encontra ou formatá-lo em funções que recebam um argumento de URL.

Ajuste os parâmetros de consulta conforme necessário (a maioria, mas não todos, dos parâmetros possíveis estão incluídos). Os arquivos de saída são armazenados no diretório que contém o script Python.

  1. Importe as bibliotecas necessárias.
# For Python 2 import urllib2, urllib, os, arcpy
# For Python 3 import urllib.parse, urllib.request, os, arcpy, json
  1. Se um token for necessário para acessar um serviço seguro, use o snippet abaixo. Caso contrário, pule para a etapa 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. Especifique a URL desejada.
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
  1. Consulte os 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. Crie uma solicitação e leia-a usando 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. Grave a resposta JSON no arquivo de texto.
with open("mapservice.json", "wb") as ms_json: ms_json.write(json)
  1. Converta JSON em shapefile usando a função JSONToFeatures.
ws = os.getcwd() + os.sep arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")
   
A seguir está o código completo para Python 2.7 instalado com ArcMap e 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 seguir está o código completo para Python 3 instalado com 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 do Artigo:000019645

Obtenha ajuda de especialistas do ArcGIS

Entre em contato com suporte técnico

Baixe o Esri Support App

Ir para opções de download

Informações Relacionadas

Descubra mais sobre este tema