Tải xuống bộ dữ liệu từ dịch vụ ArcGIS REST


18

Nhìn vào trang thông tin này để biết bộ dữ liệu được lưu trữ trên esri.com:
http://fema-service2.esri.com/arcgis/rest/service/2012_Sandy/ImageCat_NLT/MapServer/layers

Cố gắng tìm hiểu làm thế nào tôi có thể có quyền truy cập vào dữ liệu thô (tọa độ lat / lng thô hoặc SHP).

Có vẻ như dữ liệu có sẵn, tôi chỉ không thể tìm ra cách lấy nó từ giao diện này.

Câu trả lời:


27

Dịch vụ bản đồ đó là dịch vụ Bản đồ động của Máy chủ ArcGIS, thường chỉ trả về hình ảnh và kết quả truy vấn cụ thể, giống như WMS. Một số dịch vụ hình ảnh của ArcGIS Server cho phép tải xuống dữ liệu, nhưng đây không phải là một trong số đó.

Bạn có thể nhận được thông tin bạn đang tìm kiếm thông qua thao tác truy vấn, nhưng sẽ mất nhiều truy vấn vì giới hạn trả về bản ghi tối đa trên dịch vụ này là 1000 và chỉ có hơn 58000 bản ghi trong lớp v14.

Để gửi truy vấn, đi đến điểm cuối lớp và cuộn xuống dưới cùng cho các hoạt động được hỗ trợ, sau đó nhấp vào Truy vấn . Để tìm tổng số bản ghi, nhập 1 = 1 vào trường Vị trí và chọn True cho Chỉ số đếm trở lại , trông giống như 58919 bản ghi. Nó sẽ chỉ trả lại 1000 bản ghi cùng một lúc, vì vậy bạn sẽ phải đưa ra 59 truy vấn để nhận tất cả các bản ghi. Có vẻ dễ dàng nhất để lọc theo OBargetID, vì vậy truy vấn đầu tiên sẽ là WHERE OBRIID <1000, Out Field = *, Return Geometry = TRUE, Return Count = false và Format là HTML . Dịch vụ trả về tất cả các tính năng 1- 999 và các thuộc tính của chúng. Bạn có thể thay đổi định dạng đầu ra thành KMZ và chuyển đổi sang định dạng mong muốn sau đó, lặp lại và bạn sẽ có tất cả dữ liệu.

Một phương pháp khác sẽ hoạt động là lấy lập trình thông tin tính năng riêng lẻ bằng cách sử dụng điểm cuối tính năng. Trong phản hồi được định dạng HTML từ phía trên, thuộc tính OBJECTID thực sự là một siêu liên kết đến các thuộc tính cho tính năng đó . URL REST kết thúc bằng OBRIID, vì vậy bạn chỉ cần tăng nó và lấy từng phản hồi trong JSON để dễ phân tích cú pháp hơn.

LƯU Ý - một số tính năng / liên kết này chỉ có thể áp dụng cho các điểm cuối ArcGIS Server 10.1 REST.


3
+1 Đôi khi các ObjectID không tuần tự (như với ArcSDE), vì vậy có lẽ một giải pháp tổng quát hơn sẽ return IDs onlytrả về tất cả 58919 id.
Kirk Kuykendall

Điểm hay, cũng tốt để lưu ý rằng điều này không được phơi bày theo cách tương tự cho các dịch vụ bản đồ lát gạch.
wwnick

@wwnick bạn đã nói rằng "lấy từng phản hồi trong JSON" khi cố gắng lấy dữ liệu bằng ID đối tượng. Nhưng trong trường hợp này, định dạng dữ liệu là "pjson" hoặc "json" nhưng làm thế nào để chuyển đổi hai định dạng này thành shapefil hoặc định dạng dữ liệu địa lý phổ biến khác và định dạng dữ liệu dễ nhất là gì?
SIslam

Tôi sẽ sử dụng OGR để chuyển đổi json sang bất kỳ định dạng nào bạn cần.
wwnick

9

Tôi luôn thấy mình trong các tình huống cần xuất tất cả dữ liệu từ Dịch vụ bản đồ thành một shapefile. Đây là một tiện ích rất dễ sử dụng sẽ xuất mọi tính năng từ một dịch vụ và lưu nó dưới dạng shapefile và Geojson nếu bạn cần. Bạn sẽ cần phải có hoặc cài đặt node.js.

https://github.com/tannerjt/AGStoShapefile

Khi bạn đã đặt các tệp trên hệ thống của mình, chỉ cần điều hướng đến thư mục, thêm dịch vụ bản đồ của bạn vào tệp services.txt và chạy tệp này từ dòng lệnh:

node AGStoSHP.txt services.txt ./output/

Đảm bảo đặt một đường ống (|) trong tệp services.txt của bạn để thêm tên cho dịch vụ của bạn.

Hy vọng điều này sẽ giúp những người khác cần chức năng này.


Câu trả lời này giống hệt với câu được đăng trên gis.stackexchange.com/questions/98485/ Câu trả lời giống hệt thường có nghĩa là các câu hỏi mà chúng đang được áp dụng nên trùng lặp. Nếu đó là trường hợp xin vui lòng gắn cờ họ như vậy.
PolyGeo

Cảm ơn, tôi đã gắn cờ câu hỏi khác là trùng lặp. Họ được hỏi theo những cách khác nhau, nhưng về cơ bản là giống nhau.
jOshT

4

Tải xuống dữ liệu được lưu trữ trên ArcGIS REST MapServer một lớp tại một thời điểm bằng cách sử dụng dòng lệnh và gói Python pyesridump .

Lệnh ví dụ:

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

bạn có thể giải thích thêm về phương pháp này?
NULL.Dude

1
@ Geo.Dude Để sử dụng lệnh bắt đầu bằng "esri2geojson", bạn sẽ cần cài đặt gói Python có tên "pyesridump" thông qua dòng lệnh. Sau khi cài đặt, bạn có thể sao chép và dán lệnh bắt đầu bằng "esri2geojson" vào dòng lệnh của mình (trên máy Mac, bạn có thể sử dụng ứng dụng Terminal tích hợp) và nhấn phím Enter để chạy lệnh.
stevevance

0

Tôi đã phải làm điều này gần đây và đây là nỗ lực tốt nhất của tôi cho đến nay. Ban đầu tôi đã cố gắng thực hiện một "objectid non in {}".format(ids)id nơi sẽ là một bộ các đối tượng được thu thập nhưng url sẽ không trả về bất kỳ dữ liệu nào, phải có giới hạn về thời gian của chuỗi mệnh đề. một số mã này được mã hóa cứng và nếu các id không tuần tự hơn kịch bản này thì rất có thể sẽ không hoạt động. nhưng dù sao tôi hy vọng điều này sẽ giúp hướng dẫn

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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.