Télécharger l'ensemble de données à partir du service ArcGIS REST

18

En regardant cette page d'informations pour un ensemble de données hébergé sur esri.com:
http://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

Essayer de comprendre comment je peux avoir accès aux données brutes (coordonnées brutes lat / lng ou SHP).

Il semble que les données soient disponibles, je n'arrive pas à comprendre comment les extraire de cette interface.

Steve Horn
la source

Réponses:

27

Ce service de carte est un service de carte dynamique d'ArcGIS Server qui ne renvoie généralement que des images et des résultats de requête spécifiques, un peu comme un WMS. Certains services d'imagerie ArcGIS Server permettent le téléchargement de données, mais ce n'est pas l'un d'entre eux.

Vous pouvez obtenir les informations que vous recherchez via l'opération de requête, mais il faudra plusieurs requêtes car la limite maximale de retour d'enregistrements sur ce service est de 1000, et il y a plus de 58000 enregistrements dans la seule couche v14.

Pour soumettre des requêtes, accédez au point de terminaison de la couche et faites défiler vers le bas pour les opérations prises en charge, puis cliquez sur Requête . Pour trouver le nombre total d'enregistrements, entrez 1 = 1 dans le champ Où et sélectionnez Vrai pour le nombre de retours uniquement , ressemble à 58919 enregistrements. Il ne renverra que 1000 enregistrements à la fois, vous devrez donc émettre 59 requêtes pour obtenir tous les enregistrements. Semble plus facile à filtrer par OBJECTID, donc la première requête serait WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False et Format is HTML . Le service renvoie toutes les fonctionnalités 1 à 999 et leurs attributs. Vous pouvez changer le format de sortie en KMZ et convertir au format souhaité plus tard, parcourir et vous obtiendrez toutes les données.

Une autre méthode qui fonctionnerait consiste à saisir par programme les informations individuelles sur les fonctionnalités à l'aide du point de terminaison de la fonctionnalité. Dans la réponse au format HTML ci-dessus, l'attribut OBJECTID est en fait un lien hypertexte vers les attributs de cette fonctionnalité uniquement . L'URL REST se termine par OBJECTID, vous pouvez donc simplement l'incrémenter et récupérer chaque réponse en JSON pour faciliter l'analyse.

REMARQUE - certaines de ces fonctionnalités / liaisons ne s'appliquent qu'aux points de terminaison REST d'ArcGIS Server 10.1.

wwnick
la source
3
+1 Parfois, les ObjectID ne sont pas séquentiels (comme avec ArcSDE), donc peut-être une solution plus générale serait de return IDs onlyretourner tous les 58919 ids.
Kirk Kuykendall
Bon point, il est également bon de noter que cela n'est pas exposé de la même manière pour les services de carte en mosaïque.
wwnick
@wwnick, vous avez dit que "saisir chaque réponse dans JSON" lorsque vous essayez d'obtenir des données par ID d'objet. Mais dans ce cas, le format de données est "pjson" ou "json", mais comment convertir ces deux formats en shapefil ou dans un autre format de géodonnées commun et quel est le plus simple?
SIslam
J'utiliserais OGR pour convertir json dans le format dont vous avez besoin.
wwnick
9

Je me retrouve toujours dans des situations où j'ai besoin d'exporter toutes les données d'un service de carte dans un fichier de formes. Voici un utilitaire très facile à utiliser qui exportera toutes les fonctionnalités d'un service et l'enregistrera en tant que fichier de formes et geojson si vous en avez besoin. Vous devrez avoir ou installer node.js.

https://github.com/tannerjt/AGStoShapefile

Une fois que vous avez placé les fichiers sur votre système, accédez simplement au dossier, ajoutez votre service de carte au fichier services.txt et exécutez-le à partir de la ligne de commande:

node AGStoSHP.txt services.txt ./output/

Assurez-vous de mettre un canal (|) dans votre fichier services.txt pour ajouter un nom pour votre service.

J'espère que cela aide ceux qui ont besoin de cette fonctionnalité.

jOshT
la source
Cette réponse est identique à celle publiée sur gis.stackexchange.com/questions/98485/… Des réponses identiques signifient généralement que les questions auxquelles elles s'appliquent doivent être des doublons. Si tel est le cas, veuillez les signaler comme tels.
PolyGeo
Merci, j'ai signalé l'autre question comme doublon. On leur pose des questions différentes, mais essentiellement les mêmes.
jOshT
4

Téléchargez les données stockées sur ArcGIS REST MapServer une couche à la fois à l'aide de la ligne de commande et du package Python pyesridump .

Exemple de commande:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
la source
pouvez-vous en dire plus sur cette méthode?
NULL.Dude
1
@ Geo.Dude Pour utiliser la commande commençant par "esri2geojson", vous devrez installer le package Python appelé "pyesridump" via la ligne de commande. Après l'installation, vous pouvez copier et coller la commande qui commence par "esri2geojson" dans votre ligne de commande (sur un Mac, vous pouvez utiliser l'application Terminal intégrée) et appuyez sur la touche Entrée pour exécuter la commande.
stevevance
0

J'ai dû le faire récemment et c'était ma meilleure tentative jusqu'à présent. J'essayais à l'origine de faire un "objectid non in {}".format(ids)où les identifiants seraient un tuple d'objectid collectés, mais l'URL ne retournerait aucune donnée, il doit y avoir une limite sur la durée de la chaîne de clause where. une partie de ce code est codé en dur et si les identifiants ne sont pas séquentiels, ce script ne fonctionnera probablement pas. mais de toute façon j'espère que cela aide à guider

import os, arcpy, json, requests
arcpy.env.workspace=r'C:\path'
arcpy.env.overwriteOutput=True

def non_esri_extract(url,where,idlist):
    dic={"where": where,"outFields": "*","returnGeometry": "true","f":"json"}
    resp=requests.get(url, params=dic)
    data=resp.json()
    for i in data['features']:
        idlist.append(int(i['attributes']['OBJECTID']))
    maximum=max(idlist)
    minimum=min(idlist)
    return maximum,minimum

def esri_extract(url,e_w):
    fields="*"
    esri_param="?where={}&outFields={}&returnGeometry=true&f=json".format(e_w, fields)
    fsURL=url+esri_param
    fs = arcpy.FeatureSet()
    fs.load(fsURL)
    outname="interm"+str(x)
    arcpy.CopyFeatures_management(fs, outname)


x=0
maximum=0
minimum=1
baseURL="http://gismaps.vita.virginia.gov/arcgis/rest/services/VA_Base_layers/VA_Parcels/FeatureServer/0/query"

while maximum!=minimum:
    print "number of loops = {}".format(str(x))
    if x==0:
        ids=[]
        maximum,minimum=non_esri_extract(baseURL,"LOCALITY = 'Franklin County'",ids)
        esri_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(minimum,maximum)
        esri_extract(baseURL,esri_where)
        x+=1
    else:
        ids=[]
        interm_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(maximum,maximum+999)
        maximum,minimum=non_esri_extract(baseURL,interm_where,ids)
        esri_where="objectid >={} and objectid <={} and LOCALITY = 'Franklin County'".format(minimum,maximum)
        esri_extract(baseURL,esri_where)
        x+=1

fcs = arcpy.ListFeatureClasses()
arcpy.Merge_management(fcs, "Merged")
ziggy
la source