回答:
そのマップサービスはArcGIS Server Dynamic Mapサービスであり、通常はWMSのように画像と特定のクエリ結果のみを返します。一部のArcGIS Serverイメージサービスではデータのダウンロードが可能ですが、これはそれらの1つではありません。
クエリ操作で探している情報を取得できますが、このサービスの最大レコード戻り制限は1000であり、v14レイヤーだけで58000を超えるレコードがあるため、複数のクエリが必要になります。
クエリを送信するには、レイヤーのエンドポイントに移動し、サポートされている操作の一番下までスクロールして、[ クエリ ]をクリックします。レコードの総数を検索するには、Whereフィールドに1 = 1と入力し、Return Count OnlyでTrueを選択します( 58919レコードのようになります)。一度に1000レコードしか返されないため、すべてのレコードを取得するには59件のクエリを発行する必要があります。OBJECTIDでフィルタリングするのが最も簡単だと思われるので、最初のクエリはWHERE 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エンドポイントのみに適用されます。
私は常に、マップサービスからシェープファイルにすべてのデータをエクスポートする必要がある状況にあります。これは、サービスからすべての機能をエクスポートし、必要に応じてシェープファイルとgeojsonとして保存する、非常に簡単なユーティリティです。node.jsを用意またはインストールする必要があります。
https://github.com/tannerjt/AGStoShapefile
ファイルをシステムに配置したら、フォルダーに移動し、マップサービスをservices.txtファイルに追加して、コマンドラインからこれを実行します。
node AGStoSHP.txt services.txt ./output/
services.txtファイルにpipe(|)を入れて、サービスの名前を追加してください。
これが、この機能を必要とする他の人に役立つことを願っています。
コマンドラインとPythonパッケージpyesridumpを使用して、ArcGIS REST MapServerに格納されているデータを一度に1レイヤーずつダウンロードします。
コマンド例:
esri2geojson http://gis.naperville.il.us/arcgis/rest/services/OpenData/OpenDataMapService/MapServer/4 naperville_parking_lots_122417.geojson
私は最近これをしなければならなかった、これはこれまでの私の最高の試みでした。私はもともと、"objectid non in {}".format(ids)
where 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")
return IDs only
すべての58919 IDを返すことです。