ArcGIS REST Serviceからのデータセットのダウンロード


18

esri.comでホストされているデータセットのこの情報ページを見る:http ://fema-services2.esri.com/arcgis/rest/services/2012_Sandy/ImageCat_NLT/MapServer/layers

生データ(生の緯度/経度座標またはSHP)にアクセスする方法を理解しようとしています。

データが利用可能であるように見えますが、このインターフェイスからデータを取得する方法がわかりません。

回答:


27

そのマップサービスはArcGIS Server Dynamic Mapサービスであり、通常はWMSのように画像と特定のクエリ結果のみを返します。一部のArcGIS Serverイメージサービスではデータのダウンロードが可能ですが、これはそれらの1つではありません。

クエリ操作で探している情報を取得できますが、このサービスの最大レコード戻り制限は1000であり、v14レイヤーだけで58000を超えるレコードがあるため、複数のクエリが必要になります。

クエリを送信するには、レイヤーのエンドポイントに移動し、サポートされている操作の一番下までスクロールして、[ クエリ ]をクリックします。レコードの総数を検索するには、Whereフィールドに1 = 1入力し、Return Count OnlyTrueを選択します( 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エンドポイントのみに適用されます。


3
+1ただし、ObjectIDはシーケンシャルではない場合があります(ArcSDEの場合と同様)。したがって、より一般的な解決策は、return IDs onlyすべての58919 IDを返すことです。
カーククイケンドール

良い点は、タイルマップサービスの場合と同じ方法で公開されていないことにも注意してください。
-wwnick

@wwnickは、オブジェクトIDでデータを取得しようとすると、「JSONで各応答を取得する」と言いました。しかし、この場合、データ形式は「pjson」または「json」ですが、これら2つの形式をshapefilまたは他の一般的な地理データ形式に変換する方法と、最も簡単なものは何ですか?
イスラム教

OGRを使用して、jsonを必要な形式に変換します。
-wwnick

9

私は常に、マップサービスからシェープファイルにすべてのデータをエクスポートする必要がある状況にあります。これは、サービスからすべての機能をエクスポートし、必要に応じてシェープファイルとgeojsonとして保存する、非常に簡単なユーティリティです。node.jsを用意またはインストールする必要があります。

https://github.com/tannerjt/AGStoShapefile

ファイルをシステムに配置したら、フォルダーに移動し、マップサービスをservices.txtファイルに追加して、コマンドラインからこれを実行します。

node AGStoSHP.txt services.txt ./output/

services.txtファイルにpipe(|)を入れて、サービスの名前を追加してください。

これが、この機能を必要とする他の人に役立つことを願っています。


この回答は、gis.stackexchange.com / questions / 98485 /に投稿された回答と同一です。 通常、同一の回答は、適用される質問が重複していることを意味します。その場合は、フラグを立ててください。
PolyGeo

おかげで、他の質問に重複のフラグを立てました。それらはさまざまな方法で求められますが、基本的には同じです。
jOshT

4

コマンドラインとPythonパッケージpyesridumpを使用して、ArcGIS REST MapServerに格納されているデータを一度に1レイヤーずつダウンロードします。

コマンド例:

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

この方法について詳しく説明していただけますか?
NULL。デュード

1
@ Geo.Dude「esri2geojson」で始まるコマンドを使用するには、コマンドラインから「pyesridump」というPythonパッケージをインストールする必要があります。インストール後、「esri2geojson」で始まるコマンドをコピーしてコマンドラインに貼り付け(Macでは組み込みのターミナルアプリを使用できます)、Enterキーを押してコマンドを実行します。
スティーブヴァンス

0

私は最近これをしなければならなかった、これはこれまでの私の最高の試みでした。私はもともと、"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")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.