方法

Python を使用してマップ サービスからデータを抽出する

Last Published: August 24, 2021

サマリー

ユーザーがデータをダウンロードしやすくするために、マップ サービス上でフィーチャ アクセス機能を有効にすることがあります。 ただし、データは JSON 形式でマップ サービスからダウンロードでき、JSON コードをシェープファイルやフィーチャクラスに変換することができます。 この記事では、ArcPy やその他の組み込みの Python ライブラリを使用し、一般公開されているマップ サービスでその操作を行う手順を説明します。

手順

次の手順では、マップ サービスでフィーチャを検索し、ファイルへの JSON 応答を記述し、arcpy.JSONToFeatures_conversion() 関数を使用して JSON ファイルをシェープファイルに変換する方法について説明します。可能であれば、スクリプトはそのまま使用するか、URL 引数を取る関数に書式設定してください。

クエリ パラメーターは必要に応じて調整します (考えられるパラメーターのほとんどは含まれていますが、すべては含まれていません)。 出力ファイルは、Python スクリプトを含むディレクトリに格納されています。

  1. 必要なライブラリをインポートします。
# Python 2 の場合
import urllib2, urllib, os, arcpy
# Python 3 の場合
import urllib.parse, urllib.request, os, arcpy
  1. セキュリティ保護されたサービスへのアクセスにトークンが必要な場合は、以下のスニペットを使用します。 そうでない場合は、ステップ 3 に進みます。
username = "adminaccount"
password = "adminpassword"

tokenURL = 'https://machine.domain.com/portal/sharing/rest/generateToken/'
params = {'f': 'pjson', 'username': username, 'password': password, 'referer': 'https://machine.domain.com'}

# Python 2 の場合
req = urllib2.Request(tokenURL, urllib.urlencode(params))
response = urllib2.urlopen(req)

# Python 3 の場合
req = urllib.Request(tokenURL, urllib.urlencode(params))
response = urllib.parse.urlopen(req)

data = json.load(response)
token = data['token']

params= {'f': 'pjson', 'token': token}
  1. 必要な URL を指定します。
url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"
  1. パラメーターを検索します。
# Python 2 の場合
params = urllib.urlencode({'where': '1=1',
		   'geometryType': 'esriGeometryEnvelope',
		   'spatialRel': 'esriSpatialRelIntersects',
		   relationParam
		   'outFields': '*',
		   'returnGeometry': 'true',
		   'geometryPrecision':'',
		   'outSR': '',
		   'returnIdsOnly': 'false',
		   'returnCountOnly': 'false',
		   'orderByFields': '',
		   'groupByFieldsForStatistics': '',
		   'returnZ': 'false',
		   'returnM': 'false',
		   'returnDistinctValues': 'false',
		   'f': 'pjson'
		   })
# Python 3 の場合
params = {'where': '1=1',
		   'geometryType': 'esriGeometryEnvelope',
		   'spatialRel': 'esriSpatialRelIntersects',
		   relationParam
		   'outFields': '*',
		   'returnGeometry': 'true',
		   'geometryPrecision':'',
		   'outSR': '',
		   'returnIdsOnly': 'false',
		   'returnCountOnly': 'false',
		   'orderByFields': '',
		   'groupByFieldsForStatistics': '',
		   'returnZ': 'false',
		   'returnM': 'false',
		   'returnDistinctValues': 'false',
		   'f': 'pjson'
}

encode_params = urllib.parse.urlencode(params).encode("utf-8")
  1. リクエストを作成し、urllib を使用して読み取ります。
# Python 2 の場合
request = urllib2.Request(url, params)
response = urllib2.urlopen(request)
json = response.read()
# Python 3 の場合
response = urllib.request.urlopen(url, encode_params)
json = response.read()
  1. JSON 応答をテキスト ファイルに書き込みます。
with open("mapservice.json", "wb") as ms_json:
    ms_json.write(json)
  1. JSONToFeatures 関数を使用し、JSON をシェープファイルに変換します。
ws = os.getcwd() + os.sep
arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")
   
ArcMap と ArcGIS Server とともにインストールされる Python 2.7 の完全なコードを以下に示します。
import urllib2, urllib, os, arcpy

url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"

params = urllib.urlencode({'where': '1=1',
		   'geometryType': 'esriGeometryEnvelope',
		   'spatialRel': 'esriSpatialRelIntersects',
		   relationParam
		   'outFields': '*',
		   'returnGeometry': 'true',
		   'geometryPrecision':'',
		   'outSR': '',
		   'returnIdsOnly': 'false',
		   'returnCountOnly': 'false',
		   'orderByFields': '',
		   'groupByFieldsForStatistics': '',
		   'returnZ': 'false',
		   'returnM': 'false',
		   'returnDistinctValues': 'false',
		   'f': 'pjson'
		   })

request = urllib2.Request(url, params)
response = urllib2.urlopen(request)
json = response.read()

with open("mapservice.json", "wb") as ms_json:
    ms_json.write(json)

ws = os.getcwd() + os.sep
arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")

ArcGIS Pro とともにインストールされる Python 3 の完全なコードを以下に示します。
import urllib.parse, urllib.request, os, arcpy

url = "https://sampleserver6.arcgisonline.com/arcgis/rest/services/Census/MapServer/3/query?"

params = {'where': '1=1',
		   'geometryType': 'esriGeometryEnvelope',
		   'spatialRel': 'esriSpatialRelIntersects',
		   relationParam
		   'outFields': '*',
		   'returnGeometry': 'true',
		   'geometryPrecision':'',
		   'outSR': '',
		   'returnIdsOnly': 'false',
		   'returnCountOnly': 'false',
		   'orderByFields': '',
		   'groupByFieldsForStatistics': '',
		   'returnZ': 'false',
		   'returnM': 'false',
		   'returnDistinctValues': 'false',
		   'f': 'pjson'
}

encode_params = urllib.parse.urlencode(params).encode("utf-8")

response = urllib.request.urlopen(url, encode_params)
json = response.read()

with open("mapservice.json", "wb") as ms_json:
    ms_json.write(json)

ws = os.getcwd() + os.sep
arcpy.JSONToFeatures_conversion("mapservice.json", ws + "mapservice.shp")

記事 ID:000019645

ArcGIS の専門家からヘルプを受ける

テクニカル サポートへのお問い合わせ

Esri Support アプリのダウンロード

ダウンロード オプションに移動

関連情報

このトピックについてさらに調べる