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.