Завантажити набір даних із служби ArcGIS REST


18

Переглядаючи цю сторінку інформації для набору даних, розміщеної на esri.com:
http://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

Намагаюся зрозуміти, як я можу отримати доступ до необроблених даних (або необроблених координат lat / lng, або SHP).

Схоже, дані є, я просто не можу зрозуміти, як витягнути їх з цього інтерфейсу.

Відповіді:


27

Ця послуга карт - послуга динамічної карти ArcGIS Server, яка, як правило, повертає лише зображення та конкретні результати запитів, як WMS. Деякі служби зображень ArcGIS Server дозволяють завантажувати дані, але це не одна з таких.

Інформацію, яку ви шукаєте, можна отримати за допомогою операції запиту, але це займе декілька запитів, оскільки максимальна межа повернення запису для цієї послуги становить 1000, а лише в шарі v14 є понад 58000 записів.

Щоб надіслати запити, перейдіть до кінцевої точки шару та прокрутіть донизу підтримувані операції та натисніть Запит . Щоб знайти загальну кількість записів, введіть 1 = 1 у поле «Де» та виберіть «Істинно лише для кількості повернень» , схожих на 58919 записів. Він одночасно поверне 1000 записів, тож вам доведеться видати 59 запитів, щоб отримати всі записи. Здається, найпростіше фільтрувати за OBJECTID, тому першим запитом було б, де OBJECTID <1000, Out Fields = *, Geometry return = TRUE, Count Return = False, а Format - HTML . Сервіс повертає всі функції 1-999 та їх атрибути. Ви можете змінити вихідний формат на KMZ і пізніше перетворити його на потрібний формат, перебрати його і у вас будуть всі дані.

Інший метод, який би працював, - це програмне захоплення інформації про окремі функції за допомогою кінцевої точки функції. У відповіді, відформатованій HTML згори, атрибут OBJECTID - це фактично гіперпосилання на атрибути саме для цієї функції . URL-адреса REST закінчується OBJECTID, так що ви можете просто збільшити його і захопити кожну відповідь у JSON, щоб полегшити її аналіз.

ПРИМІТКА - деякі з цих функцій / посилань застосовні лише до кінцевих точок ArcGIS Server 10.1 REST.


3
+1 Іноді ObjectID не є послідовними (як це стосується ArcSDE), тому, можливо, більш загальним рішенням буде те, return IDs onlyщо повертає всі 58919 ідентифікатори.
Кірк Куйкендалл

Хороший момент, також добре зауважити, що це не піддається впливу так само, як для послуг з плитковою картою.
wwnick

@wwnick Ви сказали, що "захоплюйте кожну відповідь у JSON", коли намагаєтеся отримати дані за ідентифікатором об'єкта. Але в цьому випадку формат даних є "pjson" або "json", але як перетворити ці два формати у formatfil або інший загальний формат геоданих та який найпростіший?
SIslam

Я б використовував OGR для перетворення json у будь-який формат, який вам потрібен.
wwnick

9

Я завжди опиняюсь у ситуаціях, коли мені потрібно експортувати всі дані з служби "Карта" у файл форми. Ось дуже зручна утиліта, яка експортує кожну функцію з сервісу та збереже її як файл форми та geojson, якщо вона вам потрібна. Вам потрібно буде мати або встановити node.js.

https://github.com/tannerjt/AGStoShapefile

Після того як ви помістите файли у вашу систему, просто перейдіть до папки, додайте службу карти до файлу services.txt та запустіть це з командного рядка:

node AGStoSHP.txt services.txt ./output/

Не забудьте вставити трубу (|) у файл services.txt, щоб додати ім’я для вашої послуги.

Сподіваюся, це допомагає іншим, хто потребує цієї функціональності.


Ця відповідь ідентична відповіді, розміщеній на gis.stackexchange.com/questions/98485/… Ідентичні відповіді зазвичай означають, що питання, до яких вони звертаються, повинні бути дублікатами. Якщо це так, будь ласка, позначте їх як такі.
PolyGeo

Дякую, я поставив інше питання як дублікат. Їх задають по-різному, але в основному однакові.
jOshT

4

Завантажте дані, що зберігаються на ArcGIS REST MapServer один за одним, використовуючи командний рядок і pyesridump пакету Python .

Приклад команди:

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

Ви можете детальніше розглянути цей метод?
NULL.Чер

1
@ Geo.Dude Для використання команди, яка починається з "esri2geojson", вам потрібно буде встановити пакет Python під назвою "pyesridump" через командний рядок. Після встановлення ви можете скопіювати та вставити команду, яка починається з "esri2geojson", у ваш командний рядок (на Mac можна використовувати вбудований додаток Terminal) та натисніть клавішу Enter, щоб запустити команду.
stevevance

0

Мені довелося це зробити нещодавно, і це була моя найкраща спроба поки що. Я спочатку намагався зробити "objectid non in {}".format(ids)ідентифікатор, де ідентифікатор буде набором зібраних об’єктидів, але URL не повертає жодних даних, повинно бути обмеження щодо тривалості рядка пункту. деякі з цих кодів жорстко закодовані, і якщо ідентифікатори не є послідовними, ніж цей скрипт, швидше за все, не буде працювати. але все одно я сподіваюся, що це допомагає керівництву

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")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.