Загрузить набор данных из ArcGIS REST Service

18

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

Попытка выяснить, как я могу получить доступ к необработанным данным (либо необработанные координаты широты / долготы, либо SHP).

Похоже, данные доступны, я просто не могу понять, как извлечь их из этого интерфейса.

Стив Хорн
источник

Ответы:

27

Этот картографический сервис представляет собой сервис ArcGIS Server Dynamic Map, который обычно возвращает только изображения и конкретные результаты запроса, как и WMS. Некоторые сервисы изображений ArcGIS Server позволяют загружать данные, но это не один из них.

Вы можете получить искомую информацию с помощью операции запроса, но она будет принимать несколько запросов, поскольку максимальный предел возврата записей для этой службы равен 1000, а в одном слое v14 имеется более 58000 записей.

Чтобы отправить запрос, перейдите к конечной точке слоя и прокрутите список до конца для поддерживаемых операций, затем нажмите Запрос . Чтобы найти общее количество записей, введите 1 = 1 в поле «Где» и выберите «Истина» только для счетчика возвратов, похоже на 58919 записей. Он будет возвращать только 1000 записей за раз, поэтому вам нужно будет выполнить 59 запросов, чтобы получить все записи. Кажется, проще всего фильтровать по OBJECTID, поэтому первым запросом будет WHERE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False и Format - HTML . Сервис возвращает все функции 1-999 и их атрибуты. Вы можете изменить формат вывода на KMZ и позже преобразовать в желаемый формат, выполнить итерацию, и у вас будут все данные.

Другой метод, который будет работать, - это программный сбор информации об отдельных объектах с использованием конечной точки объекта. В приведенном выше ответе в формате HTML атрибут OBJECTID фактически является гиперссылкой на атрибуты только для этой функции . URL REST оканчивается OBJECTID, так что вы можете просто увеличить его и получить каждый ответ в JSON, чтобы упростить анализ.

ПРИМЕЧАНИЕ. - Некоторые из этих функций / ссылок применимы только к конечным точкам REST ArcGIS Server 10.1.

wwnick
источник
3
+1 Иногда ObjectID не являются последовательными (как в случае с ArcSDE), поэтому, возможно, было бы более общее решение, return IDs onlyкоторое возвращает все 58919 идентификаторов.
Кирк Кайкендалл
Хороший вопрос, также приятно отметить, что это не проявляется таким же образом для плиточных картографических сервисов.
wwnick
@wwnick вы сказали, что "захватить каждый ответ в JSON" при попытке получить данные по идентификатору объекта. Но в этом случае формат данных "pjson" или "json", но как преобразовать эти два формата в shapefil или в другой распространенный формат геоданных и какой из них самый простой?
SIslam
Я бы использовал OGR для преобразования json в любой формат, который вам нужен.
wwnick
9

Я всегда нахожусь в ситуациях, когда мне нужно экспортировать все данные из картографического сервиса в шейп-файл. Вот очень простая в использовании утилита, которая экспортирует каждую функцию из сервиса и сохраняет ее как шейп-файл и геоджон, если вам это нужно. Вам нужно будет иметь или установить node.js.

https://github.com/tannerjt/AGStoShapefile

После того, как вы поместили файлы в свою систему, просто перейдите в папку, добавьте картографический сервис в файл services.txt и запустите его из командной строки:

node AGStoSHP.txt services.txt ./output/

Убедитесь, что в ваш файл services.txt добавлен канал (|), чтобы добавить имя для вашей службы.

Надеюсь, что это помогает другим, кто нуждается в этой функции.

jOshT
источник
Этот ответ идентичен ответу, опубликованному на сайте gis.stackexchange.com/questions/98485/… Идентичные ответы обычно означают, что вопросы, к которым они применяются, должны быть дубликатами. Если это так, пожалуйста, пометьте их как таковые.
PolyGeo
Спасибо, я пометил другой вопрос как дубликат. Их спрашивают по-разному, но в основном одинаково.
ЙОШТ
4

Загружайте данные, хранящиеся на ArcGIS REST MapServer, по одному слою за раз, используя командную строку и пакет Pyesridump пакета Python .

Пример команды:

esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
stevevance
источник
Можете ли вы подробнее рассказать об этом методе?
NULL. Чувак
1
@ Geo.Dude Чтобы использовать команду, начинающуюся с «esri2geojson», вам необходимо установить пакет Python с именем «pyesridump» через командную строку. После установки вы можете скопировать и вставить команду, начинающуюся с «esri2geojson», в вашу командную строку (на Mac вы можете использовать встроенное приложение Terminal) и нажать клавишу Enter, чтобы запустить команду.
Stevevance
0

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

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")
Зигги
источник