Unduh Dataset From ArcGIS REST Service

Jawaban:

27

Layanan peta itu adalah layanan ArcGIS Server Dynamic Map yang biasanya hanya mengembalikan gambar dan hasil kueri tertentu, seperti WMS. Beberapa layanan gambar ArcGIS Server memungkinkan pengunduhan data, tetapi ini bukan salah satunya.

Anda bisa mendapatkan informasi yang Anda cari melalui operasi kueri, tetapi akan membutuhkan beberapa pertanyaan karena batas pengembalian rekaman maksimum pada layanan ini adalah 1000, dan ada lebih dari 58000 catatan di lapisan v14 saja.

Untuk mengirimkan pertanyaan, pergi ke titik akhir layer dan gulir ke bawah untuk operasi yang didukung, lalu klik Permintaan . Untuk menemukan jumlah total catatan, masukkan 1 = 1 di bidang Di mana, dan pilih Benar untuk Hanya Menghitung Kembali , tampak seperti 58.919 catatan. Itu hanya akan mengembalikan 1000 catatan sekaligus, jadi Anda harus mengeluarkan 59 pertanyaan untuk mendapatkan semua catatan. Tampaknya lebih mudah untuk disaring oleh OBJECTID, jadi permintaan pertama adalah WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False, dan Format adalah HTML . Layanan mengembalikan semua fitur 1- 999 dan atributnya. Anda dapat mengubah format output ke KMZ dan mengonversi ke format yang diinginkan nanti, beralih melalui dan Anda akan memiliki semua data.

Metode lain yang dapat digunakan adalah mengambil informasi fitur individual secara terprogram menggunakan titik akhir fitur. Dalam respons berformat HTML dari atas, atribut OBJECTID sebenarnya adalah hyperlink ke atribut untuk fitur itu saja . URL REST diakhiri dengan OBJECTID, jadi Anda bisa menambahkannya dan mengambil setiap respons di JSON untuk memudahkan penguraian.

CATATAN - beberapa fitur / tautan ini hanya berlaku untuk titik akhir ArcGIS Server 10.1 REST.

Wickick
sumber
3
+1 Kadang-kadang ObjectID tidak berurutan (seperti dengan ArcSDE), jadi mungkin solusi yang lebih umum adalah return IDs onlymengembalikan semua 58919 id.
Kirk Kuykendall
Poin bagus, juga bagus untuk dicatat bahwa ini tidak diekspos dengan cara yang sama untuk layanan peta ubin.
wwnick
@wickick Anda mengatakan bahwa "ambil setiap respons dalam JSON" ketika mencoba untuk mendapatkan data dengan ID objek. Tetapi dalam kasus ini format data adalah "pjson" atau "json" tetapi bagaimana mengubah kedua format ini menjadi shapefil atau format geo-data umum lainnya dan apa yang paling mudah?
SIslam
Saya akan menggunakan OGR untuk mengkonversi json ke format apa pun yang Anda butuhkan.
wwnick
9

Saya selalu menemukan diri saya dalam situasi di mana saya perlu mengekspor semua data dari Layanan Peta ke sebuah shapefile. Berikut ini adalah utilitas yang sangat mudah digunakan yang akan mengekspor setiap fitur dari suatu layanan dan menyimpannya sebagai shapefile dan geojson jika Anda membutuhkannya. Anda harus memiliki atau menginstal node.js.

https://github.com/tannerjt/AGStoShapefile

Setelah Anda meletakkan file di sistem Anda, cukup navigasikan ke folder, tambahkan layanan peta Anda ke file services.txt dan jalankan ini dari baris perintah:

node AGStoSHP.txt services.txt ./output/

Pastikan untuk memasukkan pipa (|) ke file services.txt Anda untuk menambahkan nama untuk layanan Anda.

Semoga ini bisa membantu orang lain yang membutuhkan fungsi ini.

JOshT
sumber
Jawaban ini identik dengan yang diposting di gis.stackexchange.com/questions/98485/... Jawaban identik biasanya berarti bahwa pertanyaan yang mereka ajukan harus berupa duplikat. Jika demikian, harap beri tanda pada mereka.
PolyGeo
Terima kasih, saya menandai pertanyaan lain sebagai duplikat. Mereka ditanya dengan cara yang berbeda, tetapi pada dasarnya sama.
JOshT
4

Unduh data yang disimpan di ArcGIS REST MapServer satu lapis pada satu waktu menggunakan baris perintah dan paket python pyesridump .

Contoh perintah:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
sumber
dapatkah Anda menjelaskan lebih lanjut tentang metode ini?
NULL. Bung
1
@ Geo.Dude Untuk menggunakan perintah yang dimulai dengan "esri2geojson", Anda harus menginstal paket Python yang disebut "pyesridump" melalui baris perintah. Setelah menginstal itu, Anda dapat menyalin dan menempelkan perintah yang dimulai dengan "esri2geojson" ke dalam baris perintah Anda (pada Mac Anda dapat menggunakan aplikasi Terminal bawaan) dan tekan tombol Enter untuk menjalankan perintah.
stevevance
0

Saya harus melakukan ini baru-baru ini dan ini adalah upaya terbaik saya sejauh ini. Saya awalnya mencoba melakukan di "objectid non in {}".format(ids)mana id akan menjadi tuple dari objectid yang dikumpulkan tetapi url tidak akan mengembalikan data apa pun, harus ada batas berapa lama string klausa dapat berada di mana. beberapa kode ini adalah kode keras dan jika id tidak berurutan dari skrip ini kemungkinan besar tidak akan berfungsi. tapi bagaimanapun saya harap ini membantu panduan

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
sumber