Laden Sie den Datensatz vom ArcGIS REST-Service herunter

18

Auf dieser Informationsseite finden Sie einen Datensatz, der auf esri.com gehostet wird:
http://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

Ich versuche herauszufinden, wie ich Zugriff auf die Rohdaten bekomme (entweder Rohdaten / Längenkoordinaten oder SHP).

Es sieht so aus, als ob die Daten verfügbar sind. Ich kann einfach nicht herausfinden, wie ich sie von dieser Schnittstelle abrufen kann.

Steve Horn
quelle

Antworten:

27

Dieser Karten-Service ist ein dynamischer ArcGIS Server-Karten-Service, der in der Regel nur Bilder und bestimmte Abfrageergebnisse zurückgibt, ähnlich wie ein WMS. Einige ArcGIS Server-Image-Services ermöglichen das Herunterladen von Daten, dies ist jedoch keiner von diesen.

Sie können die gesuchten Informationen über die Abfrageoperation abrufen, es werden jedoch mehrere Abfragen ausgeführt, da das maximale Rückgabelimit für Datensätze für diesen Dienst 1000 beträgt und allein in der Ebene v14 über 58000 Datensätze vorhanden sind.

Um Abfragen zu senden, navigieren Sie zum Layer-Endpunkt und scrollen Sie nach unten, um die unterstützten Vorgänge anzuzeigen . Klicken Sie dann auf Abfrage . Um die Gesamtzahl der Datensätze zu ermitteln, geben Sie 1 = 1 in das Feld Where ein und wählen Sie True for Return Count Only ( Wahr, nur für Rückgabezählung). Dies entspricht 58919 Datensätzen. Es werden jeweils nur 1000 Datensätze zurückgegeben, sodass Sie 59 Abfragen ausführen müssen, um alle Datensätze abzurufen. Scheint am einfachsten nach OBJECTID zu filtern, daher wäre die erste Abfrage WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False und Format ist HTML . Der Dienst gibt alle Funktionen 1 bis 999 und ihre Attribute zurück. Sie können das Ausgabeformat in KMZ ändern und später in das gewünschte Format konvertieren, durchlaufen und alle Daten haben.

Eine andere Methode, die funktionieren würde, ist das programmgesteuerte Abrufen der einzelnen Feature-Informationen mithilfe des Feature-Endpunkts. In der HTML-formatierten Antwort von oben ist das OBJECTID-Attribut tatsächlich ein Hyperlink zu den Attributen für genau dieses Feature . Die REST-URL endet mit der OBJECTID. Sie können diese also einfach erhöhen und jede Antwort in JSON abrufen, um das Parsen zu vereinfachen.

HINWEIS - Einige dieser Funktionen / Links gelten nur für ArcGIS Server 10.1-REST-Endpunkte.

wwnick
quelle
3
+1 Manchmal sind ObjectIDs jedoch nicht sequenziell (wie bei ArcSDE), sodass möglicherweise eine allgemeinere Lösung gefunden wird, bei return IDs onlyder alle 58919-IDs zurückgegeben werden.
Kirk Kuykendall
Ein guter Punkt, auch zu beachten, dass dies für gekachelte Karten-Services nicht auf die gleiche Weise verfügbar gemacht wird.
wwnick
@wwnick Sie sagten, dass "jede Antwort in JSON abrufen", wenn Sie versuchen, Daten nach Objekt-ID abzurufen. Aber in diesem Fall ist das Datenformat "pjson" oder "json", aber wie konvertiert man diese beiden Formate in Shapefil oder andere gängige Geodatenformate und was ist das einfachste?
Islam
Ich würde OGR verwenden , um JSON in das von Ihnen benötigte Format zu konvertieren.
wwnick
9

Ich befinde mich immer in Situationen, in denen ich alle Daten von einem Kartendienst in ein Shapefile exportieren muss. Hier ist ein sehr benutzerfreundliches Dienstprogramm, mit dem alle Features eines Dienstes exportiert und bei Bedarf als Shapefile und Geojson gespeichert werden können. Sie müssen node.js haben oder installieren.

https://github.com/tannerjt/AGStoShapefile

Sobald Sie die Dateien auf Ihrem System gespeichert haben, navigieren Sie einfach zum Ordner, fügen Sie den Kartendienst zur Datei services.txt hinzu und führen Sie diesen über die Befehlszeile aus:

node AGStoSHP.txt services.txt ./output/

Stellen Sie sicher, dass Sie ein Pipe (|) in Ihre services.txt-Datei einfügen, um einen Namen für Ihren Dienst hinzuzufügen.

Hoffe, dies hilft anderen, die diese Funktionalität benötigen.

jOshT
quelle
Diese Antwort ist identisch mit einer auf gis.stackexchange.com/questions/98485/… veröffentlichten. Identische Antworten bedeuten normalerweise, dass die Fragen, auf die sie angewendet werden, Duplikate sein sollten. Wenn dies der Fall ist, kennzeichnen Sie sie bitte als solche.
PolyGeo
Danke, ich habe die andere Frage als doppelt markiert. Sie werden auf unterschiedliche Weise gefragt, aber im Grunde genommen gleich.
jOshT
4

Laden Sie die auf einem ArcGIS REST MapServer gespeicherten Daten über die Befehlszeile und das Python-Paket pyesridump nacheinander herunter .

Beispielbefehl:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
Stevevance
quelle
Können Sie diese Methode näher erläutern?
NULL.Dude
1
@ Geo.Dude Um den Befehl zu verwenden, der mit "esri2geojson" beginnt, müssen Sie das Python-Paket "pyesridump" über die Befehlszeile installieren. Nach der Installation können Sie den Befehl, der mit "esri2geojson" beginnt, kopieren und in Ihre Befehlszeile einfügen (auf einem Mac können Sie die integrierte Terminal-App verwenden) und die Eingabetaste drücken, um den Befehl auszuführen.
Stevevance
0

Ich musste dies kürzlich tun und dies war mein bisher bester Versuch. Ich habe ursprünglich versucht, eine "objectid non in {}".format(ids)Where-ID zu erstellen, die ein Tupel der gesammelten Objectids ist, aber die URL würde keine Daten zurückgeben. Es muss eine Begrenzung für die Länge der Where-Klausel-Zeichenfolge geben. Ein Teil dieses Codes ist fest codiert, und wenn die IDs nicht sequenziell sind, funktioniert dieses Skript höchstwahrscheinlich nicht. aber trotzdem hoffe ich, dass dies hilfreich ist

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")
zickig
quelle