PROCÉDURE

extraire des données à partir d’un service de carte à l’aide de Python

Last Published: August 24, 2021

Résumé

Dans certains cas, les utilisateurs activent la fonction Accès aux entités sur les services de carte pour faciliter le téléchargement des données. Or, les données peuvent être téléchargées à partir d’un service de carte en notation JSON et le code JSON peut être converti vers un shapefile ou une classe d’entités. Cet article indique la marche à suivre dans le cas de services de carte partagés avec le public à l’aide de bibliothèques ArcPy et d’autres bibliothèques Python intégrées.

Procédure

Les instructions suivantes détaillent la procédure pour rechercher des entités dans un service de carte, écrire la réponse JSON dans un fichier et convertir le fichier JSON en un shapefile à l’aide de la fonction arcpy.JSONToFeatures_conversion(). Il est possible d’utiliser le script tel quel ou de le présenter sous forme de fonctions acceptant un argument URL.

Ajustez les paramètres de requête comme il convient (la plupart, mais non l’ensemble des paramètres possibles sont inclus). Les fichiers en sortie sont stockés dans le répertoire contenant le script Python.

  1. Importez les bibliothèques nécessaires.
# Pour Python 2
import urllib2, urllib, os, arcpy
# Pour Python 3
import urllib.parse, urllib.request, os, arcpy
  1. Si un jeton est nécessaire pour accéder à un service sécurisé, utilisez l’extrait de code ci-dessous. Sinon, passez à l’étape 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'}

#Pour Python 2
req = urllib2.Request(tokenURL, urllib.urlencode(params))
response = urllib2.urlopen(req)

#Pour Python 3
req = urllib.Request(tokenURL, urllib.urlencode(params))
response = urllib.parse.urlopen(req)

data = json.load(response)
token = data['token']

params= {'f': 'pjson', 'token': token}
  1. Spécifiez l’URL souhaitée.
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
  1. Interrogez les paramètres.
#Pour 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'
		   })
# Pour 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'
}

encode_params = urllib.parse.urlencode(params).encode("utf-8")
  1. Créez une requête et lisez-la à l’aide d’urllib.
# Pour Python 2
request = urllib2.Request(url, params)
response = urllib2.urlopen(request)
json = response.read()
# Pour Python 3
response = urllib.request.urlopen(url, encode_params)
json = response.read()
  1. Rédigez la réponse JSON dans une fichier texte.
with open("mapservice.json", "wb") as ms_json:
    ms_json.write(json)
  1. Convertissez le fichier JSON en shapefile à l’aide de la fonction JSONToFeatures.
ws = os.getcwd() + os.sep
arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")
   
Le code suivant est le code complet pour Python 2.7 installé avec ArcMap et 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")

Le code suivant est le code complet pour Python 3 installé avec ArcGIS Pro :
import urllib.parse, urllib.request, os, arcpy

url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/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'
}

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 d’article:000019645

Obtenir de l’aide auprès des experts ArcGIS

Contacter le support technique

Télécharger l’application Esri Support

Accéder aux options de téléchargement

Informations associées

En savoir plus sur ce sujet