Pobierz zestaw danych z usługi ArcGIS REST

18

Patrząc na tę stronę informacyjną, zestaw danych hostowany na esri.com:
http://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

Próbuję dowiedzieć się, w jaki sposób mogę uzyskać dostęp do surowych danych (surowe współrzędne lat / lng lub SHP).

Wygląda na to, że dane są dostępne, po prostu nie mogę wymyślić, jak je pobrać z tego interfejsu.

Steve Horn
źródło

Odpowiedzi:

27

Ta usługa map jest usługą dynamicznej mapy ArcGIS Server, która zazwyczaj zwraca tylko obrazy i określone wyniki zapytań, podobnie jak WMS. Niektóre usługi graficzne ArcGIS Server umożliwiają pobieranie danych, ale nie jest to jedna z nich.

Informacje, których szukasz, możesz uzyskać za pomocą operacji zapytania, ale zajmie to wiele zapytań, ponieważ maksymalny limit zwrotu rekordów w tej usłudze wynosi 1000, a sama warstwa v14 zawiera ponad 58000 rekordów.

Aby przesłać zapytania, przejdź do punktu końcowego warstwy i przewiń w dół dla obsługiwanych operacji, a następnie kliknij Zapytanie . Aby znaleźć całkowitą liczbę rekordów, wpisz 1 = 1 w polu Gdzie i wybierz Prawda tylko dla Licznika zwrotów, wygląda jak 58919 rekordów. Zwróci tylko 1000 rekordów na raz, więc będziesz musiał wydać 59 zapytań, aby uzyskać wszystkie rekordy. Najłatwiej jest filtrować według OBJECTID, więc pierwszym zapytaniem byłoby WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False, a Format to HTML . Usługa zwraca wszystkie funkcje 1- 999 i ich atrybuty. Możesz zmienić format wyjściowy na KMZ i później przekonwertować na żądany format, iterować i mieć wszystkie dane.

Inną metodą, która działałaby, jest programowe przechwytywanie informacji o poszczególnych elementach za pomocą punktu końcowego elementu. W powyższej sformatowanej odpowiedzi HTML atrybut OBJECTID jest tak naprawdę hiperłączem do atrybutów tylko dla tej funkcji . Adres URL REST kończy się na OBJECTID, więc możesz po prostu zwiększyć to i pobrać każdą odpowiedź w JSON, aby ułatwić parsowanie.

UWAGA - niektóre z tych funkcji / łączy dotyczą tylko punktów końcowych REST ArcGIS Server 10.1.

wwnick
źródło
3
+1 Czasami jednak ObjectIDy nie są sekwencyjne (jak w ArcSDE), więc być może bardziej ogólnym rozwiązaniem byłoby return IDs onlyzwrócenie wszystkich 58919 identyfikatorów.
Kirk Kuykendall
Warto również zauważyć, że nie jest to ujawniane w ten sam sposób dla usług map kafelkowych.
wwnick
@wwnick powiedziałeś, że „łap każdą odpowiedź w JSON”, gdy próbujesz uzyskać dane według identyfikatora obiektu. Ale w tym przypadku formatem danych jest „pjson” lub „json”, ale jak przekonwertować te dwa formaty na shapefil lub inny popularny format danych geodezyjnych i co jest najłatwiejsze?
SIslam
Użyłbym ogr przekonwertować json na dowolnym formacie trzeba.
wwnick
9

Zawsze znajduję się w sytuacjach, w których muszę wyeksportować wszystkie dane z usługi mapy do pliku kształtu. Oto bardzo łatwe w użyciu narzędzie, które eksportuje każdą funkcję z usługi i zapisuje ją jako plik kształtu i geojson, jeśli jest to potrzebne. Musisz mieć lub zainstalować node.js.

https://github.com/tannerjt/AGStoShapefile

Po umieszczeniu plików w systemie przejdź do folderu, dodaj usługę mapowania do pliku services.txt i uruchom go z wiersza polecenia:

node AGStoSHP.txt services.txt ./output/

Upewnij się, że wstawiłeś potok (|) w pliku services.txt, aby dodać nazwę swojej usługi.

Mam nadzieję, że pomoże to innym, którzy potrzebują tej funkcji.

JOshT
źródło
Ta odpowiedź jest identyczna z odpowiedzią na gis.stackexchange.com/questions/98485/... Odpowiedzi identyczne zwykle oznaczają, że pytania, na które są zadawane, powinny być duplikatami. W takim przypadku należy je oznaczyć jako takie.
PolyGeo
Dzięki, oznaczyłem drugie pytanie jako duplikat. Są zadawane na różne sposoby, ale w zasadzie tak samo.
JOshT
4

Pobierz dane przechowywane na ArcGIS REST MapServer pojedynczo, używając wiersza poleceń i pyesridump pakietu Python .

Przykładowe polecenie:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
źródło
czy możesz rozwinąć tę metodę?
NULL. Koleś
1
@ Geo.Dude Aby użyć polecenia rozpoczynającego się od „esri2geojson”, musisz zainstalować pakiet Python o nazwie „pyesridump” za pomocą wiersza polecenia. Po zainstalowaniu możesz skopiować i wkleić polecenie rozpoczynające się od „esri2geojson” do wiersza poleceń (na komputerze Mac możesz użyć wbudowanej aplikacji Terminal) i nacisnąć klawisz Enter, aby uruchomić polecenie.
stevevance
0

Musiałem to zrobić niedawno i to była moja najlepsza jak dotąd próba. Początkowo próbowałem zrobić, "objectid non in {}".format(ids)gdzie id będzie krotką zebranych identyfikatorów objectid, ale adres URL nie zwróci żadnych danych, musi istnieć limit długości łańcucha klauzuli where. część tego kodu jest na stałe zakodowana i jeśli identyfikatory nie są sekwencyjne, ten skrypt najprawdopodobniej nie zadziała. ale i tak mam nadzieję, że to pomoże

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")
zygzak
źródło