Scarica il set di dati dal servizio REST di ArcGIS


Risposte:


27

Tale servizio di mappe è un servizio di mappe dinamiche del server ArcGIS che in genere restituisce solo immagini e risultati di query specifici, in modo molto simile a un WMS. Alcuni servizi di immagini di ArcGIS Server consentono il download di dati, ma questo non è uno di quelli.

Puoi ottenere le informazioni che stai cercando tramite l'operazione di query, ma saranno necessarie più query poiché il limite massimo di restituzione dei record per questo servizio è 1000 e ci sono oltre 58000 record nel solo livello v14.

Per inviare query, vai all'endpoint del livello e scorri verso il basso per le operazioni supportate, quindi fai clic su Query . Per trovare il numero totale di record, immettere 1 = 1 nel campo Dove e selezionare Vero solo per il conteggio dei resi , simile a 58919 record. Restituirà solo 1000 record alla volta, quindi dovrai inviare 59 query per ottenere tutti i record. Sembra più semplice filtrare per OBJECTID, quindi la prima query sarebbe WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False e Format è HTML . Il servizio restituisce tutte le funzionalità 1-99 e i relativi attributi. È possibile modificare il formato di output in KMZ e convertirlo nel formato desiderato in un secondo momento, scorrere attraverso e si otterrebbero tutti i dati.

Un altro metodo che funzionerebbe è quello di afferrare programmaticamente le informazioni sulle singole funzionalità utilizzando l'endpoint della funzione. Nella risposta in formato HTML dall'alto, l'attributo OBJECTID è in realtà un collegamento ipertestuale agli attributi proprio per quella funzione . L'URL REST termina con OBJECTID, quindi è possibile incrementarlo e acquisire ogni risposta in JSON per semplificare l'analisi.

NOTA: alcune di queste funzioni / collegamenti sono applicabili solo agli endpoint REST di ArcGIS Server 10.1.


3
+1 Talvolta gli ObjectID non sono sequenziali (come con ArcSDE), quindi forse una soluzione più generale potrebbe essere quella di return IDs onlyrestituire tutti i 58919 ID.
Kirk Kuykendall il

Buon punto, anche bene notare che questo non è esposto allo stesso modo per i servizi di mappe piastrellate.
Wwnick il

@wwnick hai detto che "prendi ogni risposta in JSON" quando provi a ottenere dati per ID oggetto. Ma in questo caso il formato dei dati è "pjson" o "json", ma come convertire questi due formati in shapefil o altri formati di dati geografici comuni e qual è il più semplice?
SIslam,

Vorrei utilizzare OGR per convertire JSON in qualsiasi formato sia necessario.
Wwnick,

9

Mi trovo sempre in situazioni in cui ho bisogno di esportare tutti i dati da un servizio di mappe in uno shapefile. Ecco un'utilità molto semplice da usare che esporterà ogni funzione da un servizio e la salverà come file di forma e geojson se ne hai bisogno. Dovrai avere o installare node.js.

https://github.com/tannerjt/AGStoShapefile

Dopo aver inserito i file sul tuo sistema, vai alla cartella, aggiungi il servizio di mappa al file services.txt ed eseguilo dalla riga di comando:

node AGStoSHP.txt services.txt ./output/

Assicurati di inserire una pipe (|) nel tuo file services.txt per aggiungere un nome per il tuo servizio.

Spero che questo aiuti gli altri che hanno bisogno di questa funzionalità.


Questa risposta è identica a quella pubblicata su gis.stackexchange.com/questions/98485/… In genere, le risposte identiche indicano che le domande a cui vengono poste devono essere duplicate. In tal caso, contrassegnali come tali.
PolyGeo

Grazie, ho contrassegnato l'altra domanda come duplicata. Sono richiesti in diversi modi, ma sostanzialmente lo stesso.
GIOVEDI

4

Scarica i dati memorizzati su un MapServer REST ArcGIS un livello alla volta utilizzando la riga di comando e il pacchetto python pyesridump .

Esempio di comando:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson

puoi approfondire questo metodo?
NULL.Dude

1
@ Geo.Dude Per utilizzare il comando che inizia con "esri2geojson", dovrai installare il pacchetto Python chiamato "pyesridump" tramite la riga di comando. Dopo l'installazione, è possibile copiare e incollare il comando che inizia con "esri2geojson" nella riga di comando (su un Mac è possibile utilizzare l'app Terminale integrata) e premere il tasto Invio per eseguire il comando.
stevevance,

0

Ho dovuto farlo di recente e questo è stato il mio miglior tentativo finora. Inizialmente stavo cercando di fare un "objectid non in {}".format(ids)dove gli id ​​sarebbero una tupla di objectid raccolti ma l'URL non restituirebbe alcun dato, ci deve essere un limite su quanto può essere lunga la stringa della clausola where. parte di questo codice è hard coded e se gli id ​​non sono sequenziali di questo script molto probabilmente non funzionerà. ma spero comunque che questo aiuti a guidare

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.