ArcGIS REST Service에서 데이터 세트 다운로드


18

esri.com에 호스팅 된 데이터 세트에 대한이 정보 페이지를 참조하십시오.
http://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

원시 데이터 (원시 위도 / 경도 좌표 또는 SHP)에 액세스하는 방법을 알아 내려고합니다.

데이터가 사용 가능한 것 같습니다.이 인터페이스에서 데이터를 가져 오는 방법을 알 수 없습니다.

답변:


27

이 맵 서비스는 일반적으로 WMS와 같이 이미지와 특정 쿼리 결과 만 반환하는 ArcGIS Server 동적 맵 서비스입니다. 일부 ArcGIS Server 이미지 서비스는 데이터 다운로드를 허용하지만 그 중 하나는 아닙니다.

쿼리 작업을 통해 원하는 정보를 얻을 수 있지만이 서비스의 최대 레코드 반환 제한이 1000이고 v14 계층에만 58000 개가 넘는 레코드가 있으므로 여러 쿼리가 필요합니다.

쿼리를 제출하려면 레이어 엔드 포인트 로 이동하여 지원되는 작업을 위해 맨 아래로 스크롤 한 다음 쿼리 를 클릭하십시오 . 총 레코드 수를 찾으려면 위치 필드에 1 = 1을 입력하고 리턴 계수 전용으로 True를 선택하십시오 ( 58919 레코드와 유사 함). 한 번에 1000 개의 레코드 만 리턴하므로 모든 레코드를 가져 오려면 59 개의 쿼리를 발행해야합니다. OBJECTID로 필터링하는 것이 가장 쉬운 것처럼 보이므로 첫 번째 쿼리는 WOBE OBJECTID <1000, Out Fields = *, Return Geometry = TRUE, Return Count = False, Format은 HTML 입니다. 서비스는 모든 기능 1-999 및 해당 속성을 반환합니다. 출력 형식을 KMZ로 변경하고 나중에 원하는 형식으로 변환하고 반복하며 모든 데이터를 가질 수 있습니다.

작동하는 또 다른 방법은 기능 끝점을 사용하여 개별 기능 정보를 프로그래밍 방식으로 가져 오는 것입니다. 위의 HTML 형식 응답에서 OBJECTID 속성은 실제로 해당 기능속성에 대한 하이퍼 링크 입니다. REST URL은 OBJECTID로 끝나므로이를 늘리고 JSON에서 각 응답을 가져 와서 더 쉽게 구문 분석 할 수 있습니다.

참고-이러한 기능 / 링크 중 일부는 ArcGIS Server 10.1 REST 엔드 포인트에만 적용됩니다.


3
+1 때때로 ObjectID가 ( return IDs onlySrcSDE 와 같이) 순차적이지 않기 때문에 더 일반적인 해결책은 58919 개의 ID를 모두 반환하는 것입니다.
커크 Kuykendall

좋은 점은 타일 맵 서비스에서 동일한 방식으로 노출되지 않는다는 것입니다.
wwnick

@wwnick은 객체 ID로 데이터를 가져올 때 "JSON에서 각 응답을 가져옵니다"라고 말했습니다. 그러나이 경우 데이터 형식은 "pjson"또는 "json"이지만이 두 형식을 shapefil 또는 기타 일반적인 지리 데이터 형식으로 변환하는 방법은 무엇입니까?
SIslam

OGR 을 사용 하여 json을 필요한 형식으로 변환합니다.
wwnick

9

나는 항상 Map Service의 모든 데이터를 shapefile로 내 보내야하는 상황에 처해 있습니다. 다음은 서비스에서 모든 기능을 내보내고 필요한 경우 shapefile 및 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

명령 행 및 Python 패키지 pyesridump를 사용하여 ArcGIS REST MapServer에 저장된 데이터를 한 번에 한 계층 씩 다운로드하십시오 .

명령 예 :

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

이 방법에 대해 더 자세히 설명해 주시겠습니까?
NULL.Dude

1
@ Geo.Dude "esri2geojson"으로 시작하는 명령을 사용하려면 명령 행을 통해 "pyesridump"라는 Python 패키지를 설치해야합니다. 설치 후 "esri2geojson"으로 시작하는 명령을 명령 줄 (Mac의 경우 내장 터미널 앱을 사용할 수 있음)에 복사하여 붙여넣고 Enter 키를 눌러 명령을 실행할 수 있습니다.
stevevance

0

나는 최근에 이것을해야했고 이것은 지금까지 최선의 시도였습니다. 원래 "objectid non in {}".format(ids)id가 수집 된 objectid의 튜플 이되는 위치 를 수행하려고 했지만 URL이 데이터를 반환하지 않으므로 where 절 문자열의 길이에 대한 제한이 있어야합니다. 이 코드 중 일부는 하드 코딩되어 있으며이 스크립트보다 ID가 비 순차적이면 작동하지 않을 가능성이 높습니다. 어쨌든 나는 이것이 도움이되기를 바랍니다.

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")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.