从ArcGIS REST服务下载数据集


18

在此信息页面上查看esri.com上托管的数据集:http ://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

试图弄清楚如何访问原始数据(原始经纬度坐标或SHP)。

看起来数据可用,我只是想不出如何从此接口中提取数据。

Answers:


27

该地图服务是ArcGIS Server动态地图服务,通常仅返回图像和特定的查询结果,就像WMS。一些ArcGIS Server图像服务允许数据下载,但这不是其中之一。

您可以通过查询操作获取所需的信息,但是由于此服务的最大记录返回限制为1000,并且仅在v14层中就有58000多个记录,因此它将需要多个查询。

要提交查询,请转到图层端点并滚动到底部以查看受支持的操作,然后单击“ 查询”。要查找记录总数,请在“位置”字段中输入1 = 1,然后将“仅返回计数”选择为True,看起来像58919条记录。它一次只会返回1000条记录,因此您将必须发出59条查询才能获取所有记录。似乎最容易通过OBJECTID进行过滤,因此第一个查询将是WHERE OBJECTID <1000,输出字段= *,返回几何= TRUE,返回计数= False,格式为HTML。该服务返回所有功能1-999及其属性。您可以将输出格式更改为KMZ,稍后再转换为所需的格式,进行遍历,您将拥有所有数据。

另一种可行的方法是使用特征端点以编程方式获取单个特征信息。在上面的HTML格式的响应中,OBJECTID属性实际上是指向该功能属性的超链接。REST URL以OBJECTID结尾,因此您可以对其进行递增并获取JSON中的每个响应以使其更易于解析。

注意-其中某些功能/链接仅适用于ArcGIS Server 10.1 REST端点。


3
+1有时ObjectID并不是顺序的(例如与ArcSDE一样),所以也许更通用的解决方案是return IDs only返回所有58919 ID。
Kirk Kuykendall,2012年

很好,也请注意,平铺地图服务的公开方式不同。
wwnick 2012年

@wwnick,您说过尝试通过对象ID获取数据时“抓住JSON中的每个响应”。但是在这种情况下,数据格式是“ pjson”或“ json”,但是如何将这两种格式转换为shapefil或其他常见的地理数据格式,最简单的方法是什么?
SIslam 2015年

我将使用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.Dude18年

1
@ Geo.Dude要使用以“ esri2geojson”开头的命令,您将需要通过命令行安装名为“ pyesridump”的Python软件包。安装后,您可以将以“ esri2geojson”开头的命令复制并粘贴到命令行中(在Mac上,您可以使用内置的终端应用程序),然后按Enter键运行该命令。
stevevance

0

我最近不得不这样做,这是迄今为止我最好的尝试。我最初试图将"objectid non in {}".format(ids)where ids作为收集的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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.