DOC
|
はじめに 「さわって覚える ArcGIS API for Python」シリーズブログは、 ArcGIS API for Python のガイドやサンプル、API リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心に、実際にさわって覚えていただくようなノートブックと共に、全 5 回のシリーズとして紹介していく予定です。 基本編 (GIS モジュール編) フィーチャ データ編 場所検索、ジオコーディング編 ネットワーク解析編(前編)/ ネットワーク解析編(後編) マッピング、可視化編 ラスター編 前回のネットワーク解析編(前編)の記事では、ネットワーク解析のコンセプトを解説と、ルート検索での、 ・必要なデータの準備 ・arcgis.network.analysis.find_routes を使ったルート検索 ・arcgis.features.use_proximity.plan_routes を使ったルート検索 の主要なコードと解説を行いました。 今回は、「パート3:到達圏の作成」のノートブックをもとに、主要な処理を解説していきます。 紹介している翻訳済みのノートブックは、GitHub にも公開しますので、ご参照ください。 ArcGIS API for Python の環境構築がまだお済みでない方は、開発リソース集のインストールガイドにインストール方法を掲載しておりますので、ご参照ください。 本記事では以下の内容でネットワーク解析についてご紹介します。 【ネットワーク解析編(後編)】 ・到達圏の作成 1. 到達圏の作成 今回の「到達圏の作成」のノートブックでは、カリフォルニア州サンバーナーディーノ郡の病院施設からの到達圏の作成がテーマです。 コードとしては大きく、次に分かれています。 ・データ(入力に使用するデータセットの準備) ・arcgis.network.analysis.generate_service_areas による到達圏の作成 ・arcgis.features.use_proximity.create_drive_time_areas による到達圏の作成 1.1 データ(入力に使用するデータセットの準備) generate_service_areas ツールは、施設 フィーチャ セットを入力パラメーターとして指定する必要があります。元のノートブックでは、Living Atlas を参照する方法と、カリフォルニア州サンバーナーディーノ郡の病院のCSV を自組織内で公開する方法のコードが含まれています。それぞれの詳細な実行ステップと解説はノートブックを参照いただくこととし、本記事では後者の方法でのフィーチャ セット(FeatureSet)を準備するコードを抜粋して示しています。 [ データセットの準備のコード ] from arcgis.gis import GIS
import arcgis.network as network
from arcgis.features import FeatureLayer, Feature, FeatureSet, use_proximity
import pandas as pd
import datetime as dt
import time
my_gis = GIS(profile="your_online_profile")
# 施設レイヤーの定義
# print("Trying to publish from csv...")
import requests
import csv
import os
# サンバーナーディーノ郡の病院のCSVを取得し自組織で公開
out_file_name = 'hospitals_SB_county.csv'
url = "https://data.chhs.ca.gov/datastore/dump/641c5557-7d65-4379-8fea-6b7dedbda40b?q=&sort=_id+asc&fields=OSHPD_ID%2CFACILITY_NAME%2CLICENSE_NUM%2CFACILITY_LEVEL_DESC%2CDBA_ADDRESS1%2CDBA_CITY%2CDBA_ZIP_CODE%2CCOUNTY_CODE%2CCOUNTY_NAME%2CER_SERVICE_LEVEL_DESC%2CTOTAL_NUMBER_BEDS%2CFACILITY_STATUS_DESC%2CFACILITY_STATUS_DATE%2CLICENSE_TYPE_DESC%2CLICENSE_CATEGORY_DESC%2CLATITUDE%2CLONGITUDE&filters=%7B%22COUNTY_CODE%22%3A+%5B%2236%22%5D%7D&format=csv"
download = requests.get(url)
with open(out_file_name, 'w') as out_file:
out_file.writelines(download.text)
print(out_file_name)
csv_item = my_gis.content.add({}, out_file_name)
hospital_item = csv_item.publish()
# クエリで抽出するためにFeatureLayer クラスのオブジェクトを作成
hospital_fl = FeatureLayer(hospital_item.url + "/0")
# クエリで抽出(オリジナルのノートブックの except ブロック)
facilities = hospital_fl.query(where="Dba_city='REDLANDS' or Dba_city='LOMA LINDA'", as_df=False)
前編の記事と同様、ここからが、「到達圏の作成」のノートブックで最も理解していただきたい ポイントなので、本記事でも取り上げます。 ArcGIS API for Python は到達圏の作成の方法として、ServiceAreaLayer.solve、generate_service_areas、create_drive_time_areas の3つのメソッドを提供しています。 解析の種類 network.analysis features.use_proximity Route (ルート検索) find_routes plan_routes Service Area (到達圏) generate_service_areas create_drive_time_areas Closest Facility (最寄りの検索) find_closest_facilities find_nearest これら 3 つのメソッドは異なるモジュールで定義されており、裏側では異なる REST API を呼び出しています。 ServiceAreaLayer.solve と generate_service_areas は, 独自もしくは高度なネットワーク解析のワークフローを想定しており、独自のネットワーク解析レイヤーを公開する必要があります。create_drive_time_areas は、ArcGIS Online 上でホストされているルート検索 サービスに対して動作します。プロキシ サービスを介して ArcGIS Enterprise 上で利用することもできます。利用にはクレジット消費が必要となります。 今回は、同一の問題をnetwork.analysis.generate_service_areas() と features.use_proximity.create_drive_time_areas() で解析し、それらのワークフローについて facilites で定義された病院に対して到達圏を作成し、それらのプロセスの違いを詳細に説明しています。 1.2 arcgis.network.analysis.generate_service_areas による到達圏の作成 generate_service_areas ツールは、 facilites で定義された施設(病院)周辺のネットワーク到達圏を作成します。ネットワーク到達圏は、1 つもしくは複数の施設から、任意の距離や移動時間内でアクセス可能な全ての道路を包含する領域です。 例えば、ある施設から 10 分の到達圏は、その施設から 10 分以内で行くことができる全ての道路を含んでいます。到達圏はアクセスのしやすさを可視化したり、計測するためによく使われます。また、食料品店から運転時間 3 分以内を表すポリゴンは、どの住民が 3 分以内で店舗にたどり着けるかを明確にし、その店で買い物をする可能性が高いかどうかの判断材料にすることができます。 以降の例で用いられるパラメーターは次のものを含みます。 facilities: 施設 (FeatureSet)。必須パラメーター。周辺に到達圏が作成される施設。 break_values: ブレーク値 (string 型)。必須パラメーター。施設ごとに作成される到達圏ポリゴンのサイズと数を指定します。 break_units: ブレークの単位 (string 型)。必須パラメーター。ブレーク値パラメーターの単位。 time_of_day: 時刻 (datetime 型)。任意パラメーター。施設の出発時間、または到着時間。 generate_service_areas メソッドの詳細は API リファレンスをご参照ください。 [ generate_service_areas 実行部分のコード] # ブレーク値を設定
list_of_breaks = [5,10,15]
if isinstance(list_of_breaks, list):
string_of_breaks = ' '.join(map(str, list_of_breaks))
# print(string_of_breaks)
# 5,10,15分の到達圏の作成
current_time = dt.datetime.now()
result1 = network.analysis.generate_service_areas(facilities=facilities, break_values=string_of_breaks,
break_units="Minutes", time_of_day=current_time) result1 に格納された結果の確認、テーブルや地図での可視化、さらにより高度な時間帯ごとの到達圏の作成と可視化については、ノートブックをご参照ください。 1.3 arcgis.features.use_proximity.create_drive_time_areas による到達圏の作成 create_drive_time_areas メソッドは任意の運転時間や距離内で到達できるエリアを作成します。このツールは以下のような質問に答えるのに役立ちます。 ここから 車で5 分でどこまで行けるか? 自分の店から車で 3 マイル以内の範囲はどのエリアか? うちの消防署から 4 分以内の地域は? 以降の例で用いられるパラメーターは次のものを含みます。 input_layer: 必須パラメーター。ポイント フィーチャ レイヤーを指定。このポイントの周囲に移動のモードに基づいた移動範囲が描画されます break_values: 任意パラメーター (float 型を格納したリスト)。作成するポリゴンのサイズを規定します。break_values の単位は break_units パラメーターで指定します。 time_of_day: 任意パラメーター。datetime 型を指定。移動時間が交通の状況を考慮するかどうかを規定します。 context: 任意パラメーター (dict 型)。このパラメーターは、タスクの実行に影響する追加の設定を含みます。create_drive_time_areasには、次の extent (エクステント) と outSR (出力データの空間参照) の設定があります。 output_name: 任意パラメーター (str 型)。出力するフィーチャ サービスの名前。指定されなかった場合、フィーチャ コレクションが返却されます。 ノートブックでの実行部分のコードは、ouput_name の指定の有無により、次の通り異なります。 [ create_drive_time_areas 実行部分のコード] output_name を入力パラメーターに指定する場合、create_drive_time_areas からの戻り値はFeature Layer のコレクションになります。 # output_name を指定する場合
"""ダウンロードした CSV から公開されたフィーチャ レイヤー コレクションを参照している場合
"""
hospital_layer = {'url': hospital_fl.url,
'filter': "Dba_city='REDLANDS' or Dba_city='Loma Linda'"}
result2 = use_proximity.create_drive_time_areas(input_layer=hospital_layer, break_values=list_of_breaks,
time_of_day = current_time,
context={'outSR': {"wkid": 4326}},
output_name="Create Service Area from Hospitals in SB County 2") result2 に格納された結果の確認や、テーブルや地図での可視化等については、ノートブックをご参照ください。 output_name を指定しない場合、 create_drive_time_areas からの戻り値はFeatureCollection オブジェクトになり、オンデマンドでの情報を取得するために詳細なパースが必要になります。 # output_name を指定しない場合
result2b = use_proximity.create_drive_time_areas(input_layer=hospital_layer, break_values=list_of_breaks,
time_of_day = current_time,
context={'outSR': {"wkid": 4326}}) result2b に格納された結果の確認や、テーブルや地図での可視化等については、ノートブックをご参照ください。 また、arcgis.features.use_proximity.create_drive_time_areas を実行する場合、 output_name を指定する場合:解析結果を直接フィーチャ サービスとして出力することが可能です。 output_name を指定しない場合:解析結果が FeatureCollection で返却されるため、結果の可視化にはパース / 描画というアプローチを取る必要があります。 の2つ記載しているように、結果のハンドリングの仕方も異なってきます。詳細なハンドリングの方法や解説はノートブックをご参照ください。 おわりに 今回は「ネットワーク解析編(後編)」として、到達圏の作成に必要なデータセットの準備と、arcgis.network.analysis.generate_service_areas と arcgis.features.use_proximity.create_drive_time_areas を到達圏作成のツールとして利用するまでの主要なコードと解説を取り上げて紹介しました。 パート3のノートブックでは、この記事で取り上げた内容に加え、到達圏作成の必要性や、到達圏を計算するときに必要となる「近さ」の基本的な考え方についても紹介しています。また、解析結果のテーブル形式や地図での可視化の方法や、より高度な時間帯別の到達圏解析などについても触れていますので、より詳しく確認したい方は、ノートブックをご参照ください。 次回は「マッピング、可視化編」として、マップ ウィジェットの使用方法や、可視化手法としてスマートマッピングについて紹介する予定です。 関連リンク ArcGIS 関連ページ ArcGIS API for Python(ESRIジャパン製品ページ) ArcGIS for Developers(ESRIジャパン製品ページ) ArcGIS Online(ESRIジャパン製品ページ) ArcGIS for Developers 開発リソース集 ArcGIS API for Python(米国Esri ページ(英語)) シリーズブログ 関連ページ ArcGIS API for Python を使ってみよう シリーズブログ 開発リソース集 ArcGIS for API for Pythonのコンセプト インストールガイド ArcGIS for API for Pythonのための基礎環境:conda入門 関連するノートブック パート1:ネットワーク データセットとネットワーク解析 パート2:ルート検索 パート3:到達圏の作成 Part 1 - Network Dataset and Network Analysis (英語) Part 2 - Find Routes (英語) Part 3 - Generate Service Area (英語) 関連資料 ゼロから学ぶ、ネットワークデータ~構築から解析まで~
... View more
07-01-2020
07:46 PM
|
0
|
0
|
1836
|
DOC
|
はじめに 「さわって覚える ArcGIS API for Python」シリーズブログは、 ArcGIS API for Python のガイドやサンプル、API リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心に、実際にさわって覚えていただくようなノートブックと共に、全 5 回のシリーズとして紹介していく予定です。 基本編 (GIS モジュール編) フィーチャ データ編 場所検索、ジオコーディング編 ネットワーク解析編(前編)/ ネットワーク解析編(後編) マッピング、可視化編 ラスター編 前回の記事では、geocode() メソッドを使った、さまざまなジオコーディングについて紹介しました。シリーズ第 4 回目となる今回は、ネットワーク解析編として、「パート1:ネットワーク データセットとネットワーク解析」のノートブックをもとに、ネットワーク解析に必要なコンセプトを説明します。その後、「パート2:ルート検索」と「パート3:到達圏の作成」のノートブックをもとに、主要な処理を解説していきます。 なお、今回はパート2とパート3のノートブックのそれぞれがボリュームが多いので、前編・後編の2回に分けて解説したいと思います。 紹介している翻訳済みのノートブックは、GitHub にも公開しますので、ご参照ください。 ArcGIS API for Python の環境構築がまだお済みでない方は、開発リソース集のインストールガイドにインストール方法を掲載しておりますので、ご参照ください。 本記事では以下の内容でネットワーク解析についてご紹介します。 【ネットワーク解析編(前編)】 ・ネットワーク データセットとネットワーク解析 ・ネットワーク解析の概要 ・ネットワークとは? ・ネットワーク データセット ・ネットワーク解析サービス ・ルート検索 【ネットワーク解析編(後編)】 ・到達圏の作成 1. ネットワーク データセットとネットワーク解析 1.1 ネットワーク解析の概要 ArcGIS API for Python の Network Analysis は、次のような質問に答えるために設計されています。 マンハッタンからブルックリンへの最速の移動手段は? サンフランシスコのダウンタウンで火災が発生した場合、車で5分以内に対応できる最寄りの消防署は? 各都市の倉庫がカバーしている市場面積は? 現在の場所から一番近いコーヒーショップはどこですか? 輸送コストを最小限に抑え、顧客サービスを向上させるためには、どのように配送車両のルートを決定すればよいでしょうか? 市場シェアを最大化するためには、どこに新しい支店を開設すればよいのでしょうか? 当社は縮小する必要があります - 全体的な需要を維持するためには、どの店舗を閉鎖すべきですか? 現在または過去の交通状況はどのようなもので、ネットワーク分析の結果にどのように影響しますか? これらの質問は、企業、公共サービス、または組織が業務をより効率的に遂行し、戦略的意思決定を改善することに関連しています。 例えば、組織は自社の商品やサービスにアクセスできる人が分かれば、現在の市場と潜在的な市場の両方をより理解することができます。 時間帯、車両容量、最大移動時間などのいくつかの制約を考慮しながら、停留所を最適に配列し、停留所間の最短経路を見つけることで、輸送コストを削減することができます。 顧客サービスは、より迅速な対応、またはより利便性の高い施設の立地を通じて改善することができます。 以下の図は、ネットワーク解析を利用する一般的なアプリケーションについてまとめたものです。 図 - ネットワーク解析の一般的なアプリケーション Route(ルート検索)、Closest Facility(最寄りの検索)、Service Area(到達圏) Vehicle Routing Problem(配車ルート解析)、Location-Allocation(ロケーション・アロケーション)、OD Cost Matrix(OD コストマトリックス) 1.2 ネットワークとは? ネットワークとは、エッジ(ライン)や接続ジャンクション(ポイント)のような要素が相互に接続されたシステムで、ある地点から、別の地点への可能なルートを表します。自動車やトラックは道路を、航空会社は決められた飛行経路を、石油はパイプラインを流れています。潜在的な移動経路をネットワークでモデル化することで、ネットワーク上の石油、トラック、または他のエージェントの移動に関連した分析を行うことができます。最も一般的なネットワーク解析は、2点間の最短経路を見つけることです。 ArcGIS ではネットワークを、ユーティリティ ネットワークとネットワーク データセットの2つのカテゴリに分類していますが、ここで扱うのは、ネットワーク データセットです。 1.3 ネットワーク データセット ネットワーク データセットは、道路ネットワークをモデリングするのに適しています。ネットワーク データセットは、シンプル フィーチャ (ラインとポイント) およびターンを含めることができるソース フィーチャから作成され、ソース フィーチャの接続性を格納します。ネットワーク解析を実行するときには、常にネットワーク データセット上で実行されます。 ネットワーク データセットは、ネットワーク エレメントから構成されています。ネットワーク エレメントは、ネットワーク データセットの作成に使用されるソース フィーチャから生成され、接続性の確立には、ソース フィーチャのジオメトリを使用できます。また、ネットワーク エレメントには、ネットワーク上のナビゲーションを制御する属性があります。 ネットワーク エレメントには、次の 3 種類があります: エッジ — 別のエレメント (ジャンクション) に接続するエレメントで、エージェントが移動リンクになります。 ジャンクション — エッジと接続し、1 つのエッジから別のエッジへのナビゲーションを行います。 ターン — 複数のエッジの間の移動に影響する可能性のある情報を格納します。 ネットワークの基本構造はエッジとジャンクションから構成され、ネットワークの接続性はエッジとジャンクションを相互に接続することで確立されます。ターンはオプションのエレメントで、たとえば、ある特定のエッジから別のエッジへの左折を規制する場合など、特定のターン移動に関する情報を格納します。 1.4 ネットワーク解析サービス ネットワーク解析 (NA) サービスは、ArcGIS Network Analysis ソルバ によって呼び出されるようになっています (ルート検索、最寄りの検索、到達圏、ロケーション・アロケーション、ODコストマトリックス、配車ルート解析など)。 ユーザーは、ArcGIS Online でホストされすぐに利用可能なネットワーク解析(NA)サービス、またはユーザーが事前に公開して設定したArcGIS Enterprise 上のカスタマイズされたネットワーク解析(NA)サービスのいずれかを選択することができます。 ArcGIS Online を使用して解析を実行する場合、ソルバ は ArcGIS Online 上に保存されている高品質な世界的な規模のネットワーク データセットを参照し、ArcGIS Online のクレジットを消費します。独自のデータを使用している場合は、Online のクレジットは消費しませんが、ネットワーク データセットをプロジェクトに関連付ける必要があります。 ArcGIS Online ネットワーク解析サービスを使用すると、ネットワーク データセットの作成や購入、ArcGIS Network Analyst エクステンションのライセンス購入をすることなく、過去、現在、および予測される交通状況を表示することもできます(ArcGIS Onlineでの現在、および予想される交通状況のデータは日本地域は未対応です)。これらのサービスは、定期的に更新される高品質の道路データを参照しています。 これらのサービスにアクセスするには、ネットワーク解析の権限を持つ ArcGIS Online の組織向けアカウントが必要であり、アプリケーションが ArcGIS Online に接続している必要があります。また、ArcGIS Online アカウントを使用して ArcGIS Pro のライセンスを取得している場合は、すでにアプリケーションにサインインしている可能性があります。 サービス利用時の消費クレジットについては、次をご参照ください。 表 - ネットワーク解析サービス利用時の消費クレジット。 詳細は弊社ホームページの 機能別のクレジット をご参照ください。 機能 機能(英語) 消費クレジット 到達圏 Service Areas 1 到達圏につき 0.5 クレジット 最寄りの検索 Closest Facility Routes 1 ルートにつき 0.5 クレジット 配車ルート解析 Multi-Vehicle Routes 1 ルートにつき 1 クレジット ジオエンリッチメント GeoEnrichment 1 変数につき 0.01 クレジット 単純ルート検索 Simple Routes 1 ルートにつき 0.005 クレジット ロケーション・アロケーション Location-Allocation 1 需要地点ルートにつき 0.1 クレジット OD コストマトリックス Origin Destination Cost Matrix 1 起点終点ペアにつき 0.0005 クレジット ここまでが「パート1:ネットワーク データセットとネットワーク解析」のノートブックの内容をもとに概要を紹介しました。「マルチモーダル ネットワーク データセット」、「3D ネットワーク データセット」などを含め、より詳しい説明はノートブックにありますので、そちらも参照してください。 ここからは、「パート2:ルート検索」のノートブックをもとに、主要な処理を解説していきます。 2. ルートの検索 今回の「ルート検索」のノートブックでは、夏のアメリカ合衆国西部の旅行を計画し、マイアミからスタートし、サンフランシスコで旅を終える旅を計画するときの、ルート検索がテーマです。旅の途中でサンノゼ、ロサンゼルス、サンディエゴ、フェニックス、エルパソ、ヒューストン、ニューオーリンズ、オーランドの 8 都市に立ち寄ります。 コードとしては大きく、次に分かれています。 データ(入力に使用するデータセットの準備) arcgis.network.analysis.find_routes を使ったルート検索 arcgis.features.use_proximity.plan_routes を使ったルート検索 2.1 データ(入力に使用するデータセットの準備) find_routes ツールは、ストップ フィーチャ セットを入力パラメーターとして指定する必要があります。フィーチャ セットは、2 つ以上のストップを指定する必要があると同時に、上限は10,000 ストップ、または 1 つのルートに対して 150 ストップです。 詳細な実行ステップと解説はノートブックを参照いただくこととし、既存のフィーチャ サービスからストップを抽出し、フィーチャ セット(FeatureSet)を入力パラメーターとして準備するコードは、次のようになります。 [ データセットの準備のコード ] from copy import deepcopy
import datetime as dt
from IPython.display import HTML
import json
import pandas as pd
from arcgis.gis import GIS
import arcgis.network as network
import arcgis.geocoding as geocoding
from arcgis.features import FeatureLayer, FeatureSet, FeatureCollection
import arcgis.features.use_proximity as use_proximity
my_gis = GIS(profile="your_online_profile")
# 「USA Major Cities」というタイトルのフィーチャ レイヤーにsearch メソッドでアクセス
sample_cities = my_gis.content.search('title:"USA Major Cities" type:Feature Service owner:esri*',
outside_org=True)[0]
# 訪問する都市をリストに配置、整形用のフォーマッタを定義
stops_cities = ['San Francisco', 'San Jose', 'Los Angeles', 'San Diego',
'Phoenix', 'El Paso',
'Houston', 'New Orleans', 'Orlando', 'Miami']
values = "'" + "', '".join(stops_cities) + "'"
stops_cities_fl = FeatureLayer(sample_cities.url + "/0")
# FeatureLayer のquery メソッドを呼び出し、各都市をFeatureSet として取得
stops_cities_fset = stops_cities_fl.query(where="ST in ('CA', 'NV', 'TX', 'AZ', 'LA', 'FL') AND NAME IN ({0})".format(values), as_df=False)
# 同様に、旅の出発点のマイアミをFeatureSet として取得
start_cities_fset = stops_cities_fl.query(where="ST='FL' AND NAME = 'Miami'", as_df=False)
""" 任意の順序にストップを並べ替える関数を定義
"""
def re_order_stop_cities(fset=stops_cities_fset, start_city = "Miami", end_city = "San Francisco"):
stops_cities_flist = []
last_city = None
for ea in fset:
if ea.attributes['NAME'] == start_city:
stops_cities_flist.insert(0, ea)
elif ea.attributes['NAME'] == end_city:
last_city = ea
else:
stops_cities_flist.append(ea)
stops_cities_flist.append(last_city)
return FeatureSet(stops_cities_flist)
# FeatureSet 内のストップを、旅の開始地点と終着点が正しくなるように並べ替え
re_ordered_stops_cities_fset = re_order_stop_cities()
# 並べ替えた FeatureSet に spatialReference を定義
re_ordered_stops_cities_fset.spatial_reference = stops_cities_fset.spatial_reference
# メソッド2で後から使用
re_ordered_stops_cities = list(map(lambda x: x.attributes['NAME'], re_ordered_stops_cities_fset)) ここからが、「ルート検索」のノートブックで最も理解していただきたい ポイント なので、本記事でも取り上げます。 ArcGIS API for Python はルート解析の方法として、RouteLayer.solve、find_routes、plan_routes の 3つのメソッドを提供しています。 解析の種類 network.analysis features.use_proximity Route (ルート検索) find_routes plan_routes Service Area (到達圏) generate_service_areas create_drive_time_areas Closest Facility (最寄りの検索) find_closest_facilities find_nearest これら 3 つのメソッドは異なるモジュールで定義されており、裏側では異なる REST API を呼び出しています。RouteLayer.solve と network.analysis.find_routes、features.use_proximity.plan_routes の主な違いは、RouteLayer.solve は独自もしくは高度なネットワーク解析のワークフローを想定しており、独自のネットワーク解析レイヤーを公開する必要があります。 network.analysis.find_routes、features.use_proximity.plan_routes は、ArcGIS Online 上でホストされているルート検索 サービスに対して動作し、プロキシ サービスを介して ArcGIS Enterprise 上で利用することもできます。利用にはクレジット消費が必要となります。 今回は、同一の問題を network.analysis.find_routes() と features.use_proximity.plan_routes() で解析し、それらのワークフローについて stops_cities で定義された 10 都市間を移動するための最短ルートを設計して、それらのプロセスの違いを詳細に説明しています。 2.2 arcgis.network.analysis.find_routes を使ったルート検索 ルート検索では、複数地点間を移動するための最速または最短の経路を決定することができます。複数のストップを訪問したり、場所間の距離や移動時間を測定したりするために、arcgis.network.analytics モジュールの find_routes ツールを使用することが出来ます。 このツールは実行するたびに1台以上の車両のルートを見つけることができるので、複数のドライバーが事前に指定したストップに移動するための最適なルートを決定することができます。 find_routes のパラメーターは次の通りで、ノートブックでの実行部分のコードは、次の通りです。 stops: 必須パラメーター。2つ以上のストップを指定します。 preserve_terminal_stops: ターミナル ストップを維持 (str 型)。任意パラメーター。 最適なルートを見つけるためreorder_stops_to_find パラメーターが True の場合、スタートまたは終了する地点を保存できます。そしてツールは残りのストップを並べ替えます。 time_of_day: 時刻 (datetime 型)。任意パラメーター。ルートの移動を開始する時間と日付を指定。 time_zone_for_time_of_day: 時刻のタイム ゾーン (str 型)。任意パラメーター。 time_of_day:パラメーターのタイム ゾーンを指定します。 もしアウトプットのルートを新しいレイヤー ファイルに保存したい場合、save_output_na_layer を True に設定します。 [ find_routes 実行部分のコード ] start_time = int(dt.datetime.now().timestamp() * 1000)
result = network.analysis.find_routes(re_ordered_stops_cities_fset, time_of_day=start_time,
time_zone_for_time_of_day="UTC",
preserve_terminal_stops="Preserve None",
reorder_stops_to_find_optimal_routes=True,
save_output_na_layer=True) result に格納された結果の確認、テーブルや地図での可視化等については、ノートブックをご参照ください。 2.3 arcgis.features.use_proximity.plan_routes 使ったルート検索 plan_routes メソッドは、移動するワーカーに対してタスクを効率的に配分する方法を決定します。ストップと利用できる車両の数を含むインプットを入力すると、ツールが各ストップを車両に割り当て、各車両が割り当てられたストップに最短時間で到着するルートを返却します。plan_routes を使うことで、現地作業者よりたくさんの作業現場に少ない時間で到達することができます。これにより生産性が向上し、カスタマー サービスを改善することができます。組織はしばしば plan_routes を次のような目的のために使用します。 住宅、レストラン、建設現場の点検 修理、設置、技術サービスの提供 商品や小包の配送 営業電話をかける 観客の自宅からイベントまでのバンでの移動手段の提供 plan_routes メソッドの詳細は API リファレンスをご参照ください。 ノートブックでの実行部分のコードは、output_name の指定の有無により、次の通り異なります。 [ plan_routes 実行部分のコード ] # 入力パラメータの準備
re_ordered_values = "'" + "', '".join(re_ordered_stops_cities) + "'"
# それぞれレイヤー
stops_layer = {'url': sample_cities.layers[0].url,
'filter': "ST in ('CA', 'NV', 'TX', 'AZ', 'LA', 'FL') AND NAME IN ({0})".format(re_ordered_values)}
start_layer = {'url': sample_cities.layers[0].url,
'filter': "ST = 'FL' AND NAME = 'Miami'"}
end_layer = {'url': sample_cities.layers[0].url,
'filter': "NAME = 'San Francisco'"}
# output_nameを指定した場合
""" using https://analysis7.arcgis.com/arcgis/rest/services/tasks/GPServer/PlanRoutes/submitJob
"""
result1 = use_proximity.plan_routes(stops_layer=stops_layer, route_count=1,
max_stops_per_route=10, route_start_time=start_time,
start_layer_route_id_field = "FID",
start_layer=start_layer,
end_layer=end_layer,
travel_mode='運転時間',
return_to_start=False,
context={'outSR': {"wkid": 4326}},
output_name="Plan Route from Miami to San Francisco 2a",
gis=my_gis)
result1 に格納された結果の確認や地図での可視化等については、ノートブックをご参照ください。 # output_nameを指定しない場合
""" using https://analysis7.arcgis.com/arcgis/rest/services/tasks/GPServer/PlanRoutes/submitJob
"""
result1 = use_proximity.plan_routes(stops_layer=stops_layer, route_count=1,
max_stops_per_route=10, route_start_time=start_time,
start_layer_route_id_field = "FID",
start_layer=start_layer,
end_layer=end_layer,
travel_mode='運転時間',
return_to_start=False,
context={'outSR': {"wkid": 4326}},
gis=my_gis)
result1 に格納された結果の確認や地図での可視化等については、ノートブックをご参照ください。 また、arcgis.features.use_proximity.plan_routes を実行する場合、 output_name を指定する場合:解析結果を直接フィーチャ サービスとして出力することが可能です。 output_name を指定しない場合:解析結果が FeatureCollection で返却されるため、結果の可視化にはパース / 描画というアプローチを取る必要があります。 の2つ記載しているように、結果のハンドリングの仕方も異なってきますので、詳細な実行ステップと解説はノートブックをご参照ください。 おわりに 今回は「ネットワーク解析編(前編)」として、本記事ではネットワーク解析に必要なコンセプトとルート検索で必要なデータの準備と、arcgis.network.analysis.find_routes と arcgis.features.use_proximity.plan_routes をルート解析のツールとして利用するまでの主要なコードと解説を取り上げて紹介しました。 パート 2 のノートブックでは、この記事で取り上げた内容に加え、テーブル形式にする方法、マッピングする方法、そして解析結果を保存する方法についても紹介していますので、より詳しく確認したい方は、ノートブックをご参照ください。 次回は、「ネットワーク解析編(後編)」として、「パート 3 :到達圏の作成」で、network.analysis 及び features.use_proximity モジュールを使った到達圏解析のポイントを紹介する予定です。 関連リンク ArcGIS 関連ページ ArcGIS API for Python(ESRIジャパン製品ページ) ArcGIS for Developers(ESRIジャパン製品ページ) ArcGIS Online(ESRIジャパン製品ページ) ArcGIS for Developers 開発リソース集 ArcGIS API for Python(米国Esri ページ(英語)) シリーズブログ 関連ページ ArcGIS API for Python を使ってみよう シリーズブログ 開発リソース集 ArcGIS for API for Pythonのコンセプト インストールガイド ArcGIS for API for Pythonのための基礎環境:conda入門 関連するノートブック パート1:ネットワーク データセットとネットワーク解析 パート2:ルート検索 Part 1 - Network Dataset and Network Analysis (英語) Part 2 - Find Routes (英語) 関連資料 ゼロから学ぶ、ネットワークデータ~構築から解析まで~
... View more
06-25-2020
07:23 PM
|
0
|
0
|
3499
|
DOC
|
はじめに 弊社ホームページで4月末より、自宅で学ぼう GIS のページが公開されていますが、そちらは「GIS を学んでみよう!」という皆様を応援するためのページとなっています。 一方、こちらの「ArcGIS 開発者コミニティ」で配信しているものは、マッピング&ロケーションを中心とした開発に関わる記事が中心になっています。 そこで、本記事では「マッピング&ロケーション開発を学んでみよう!」という皆様を応援するための記事として、「STAY HOME」をテーマに、自宅に居ながら学べるものを厳選してご紹介したいと思います。 ArcGIS for Developers & ArcGIS Developer Subscription ArcGIS for Developers のサイトは、マッピングと解析の開発者向けプラットフォームで、次のような特徴を持っています。 データドリブンな可視化(2Dと3D) ジオコーディング、ルート解析、検索 解析 すぐに利用可能な豊富な地図コンテンツ 自分のデータのホスティング この開発者向けプラットフォームを使い始めるためには、トップページの [Sign Up for Free →] からアカウントを作成するだけで、無料で誰でも使い始めることが可能です。 ※1 : 日本語での作成方法の説明は、ArcGIS for Developers 開発リソース集の開発者アカウントの作成 をご参照ください。 ※2 : 無料のプランはArcGIS Developer Subscription (Essentials) と呼ばれるものです。その他のプランの詳細は弊社ホームページをご参照ください。 ログイン後はDashboard が表示され、アプリケーションの新規作成、データのインポートの他、ArcGIS Online(開発者向け) Subscription でのコンテンツ管理、Web マップの新規作成、ストーリーマップの新規作成、Web AppBuilder の起動など、ArcGIS Developer Subscription ならではの、ショートカットメニューが備わっています。 自分のデータのホスティング先としては、ArcGIS Online を 50 クレジット/月 の範囲で利用可能ですが、その他にCreater の1ライセンスが利用できるため、無料のArcGIS for Developer Subscription (Essentials) のアカウントでも、Map Viewer(マップ ビューアー), Scene Viewer(シーン ビューアー), ArcGIS Dashboards, ArcGIS StoryMaps(ストーリー マップ), Web AppBuilder for ArcGIS などの基本的なアプリケーションをはじめ、つい先日の4/14から国内サポートを開始したばかりのArcGIS Experience Builder を試してみることが可能です。 また、Collector for ArcGIS, Survey123 for ArcGIS , Workforce for ArcGIS などの現地調査で使うアプリケーションを試してみることも可能です。 その他にも、Get Started のタブからアクセスすると、各種API/SDK, トピック別に、1コマ5~30分で学べるチュートリアルが、豊富に用意されています。 ArcGIS API for JavaScript ・ArcGIS API for JavaScript のヘルプ(英語) ArcGIS API for JavaScript を使いこなす上では必須のリファレンスです。使いこなすコツは、[Home] タブでAPIで出来ることを把握し、[Guide] タブで基本を学び、その後、[Sample Code]や[API Reference] へ進むことです。 ・はじめての Web マッピングアプリケーション開発(日本語) 上記のヘルプは全て英語ですが、本ブログでは初心者を対象に「はじめての Web マッピングアプリケーション開発」としてAPIを使う上での要点の解説を中心に記事を連載しています。それぞれの記事で利用しているコードも公開しており、JS Bin , CodePen などのWebサービスで動かしてみることも可能です。 ・DevSummit 2020 - ArcGIS API for JavaScript Recording Available!(英語) 米国Esri で毎年3月に開発者向けに実施しているDeveloper Summit のうち、ArcGIS API for JavaScript のテクニカルセッション動画を紹介したブログです。1) APIの基礎とアーキテクチャ、2) 可視化、3) 開発者ツールと方法論、4) 素晴らしいユーザー体験の構築 ごとにまとまっています。 Python & ArcPy & ArcGIS API for Python 以下では、ArcGIS プラットフォームで使われている次の 2 つの API の学習資料を中心にご紹介します。 ArcPy – 主にデスクトップ製品 (ArcGIS Pro、ArcMap) の処理をする API ArcGIS API for Python – 主にWeb GIS (ArcGIS Online、ArcGIS Enterprise) の処理をする API ArcPy ・ArcGISユーザーのためのPython基礎(日本語) ArcGIS ユーザー向けに Python の基礎や構文の使い方などを説明しています。初めて Python を触る ArcGIS ユーザーの皆様はこちらからご利用ください。 ・Pythonによるプログラミング – ArcMap(日本語) ArcMap を利用する際の ArcPy を使った ArcGIS での処理の基本を紹介しています。 ・Pythonによるプログラミング – ArcGISPro(日本語) ArcGIS Pro を利用する際の ArcPy を使った ArcGIS での処理の基本を紹介しています。 ※ 上記 3 つの資料は過去に ESRIジャパンが GIS学会で行ったハンズオン セッション で使用した資料にジオメトリの操作やサービスの公開等を加えた増強版の資料です。演習用のデータ、コードと共に GitHub 上でまとめて公開しており、ハンズオン形式で学習できます。 ArcGIS API for Python ・ArcGIS API for Python を使ってみよう(日本語) ArcGIS API for Python の基本的な操作をシリーズ記事でご紹介しています。 ・ArcGIS API for Python のコアコンセプト(日本語) ArcGIS API for Python、REST API、conda などについて解説したブログ記事です。ArcGIS API for Python の環境を構築する前に一度目を通しておくと理解が深まります。 ・ArcGIS for Developer 開発リソース集(日本語) インストールガイドのほか、スクリプト実行を自動化するための設定方法や、グラフを描画する際に利用されている matplotlib で日本語を表示させる方法についてもご紹介しています。 スクリプト実行の自動化については新型コロナウイルスの時系列データを題材にしたブログでも設定方法をご紹介しています。 電子書籍 STAY HOME の今、 外出せずにネットで購入可能な ArcGIS 関連の電子書籍を販売しているサイトをご紹介します。 ・Packt Publishing 過去に「今ならお得 ! ArcGIS 関連の Python 書籍」でご紹介しました。イギリスの IT 系の出版社である Packt Publishing では、ArcGIS に関連する eBook や Video などを数多く販売しております。こちらの記事「秋の夜長におすすめ ! ArcGIS 関連書籍が今ならお得」でもご紹介しましたが、ArcPy や ArcGIS API for JavaScript、ArcGIS API for Python について基礎や自動化、開発のポイントを電子書籍で学ぶことができます。もちろん、上記以外の ArcGIS に関する書籍も販売されております。 ・Springer ドイツの科学、技術、医療、ビジネスなどのさまざまなジャンルの電子書籍を出版する企業である Springer 社は現在、新型コロナウイルスの発生下における利用者への支援拡大のため、期間限定(現在~2020年7月31日まで)で400冊近くのテキストブックが無料で公開されています。その中には、ArcGIS に関する書籍も含まれており、次の2冊が無料で公開されています。 タイトル:Python For ArcGIS タイトル:ArcGIS for Environmental and Water Issues ArcGIS を利用した地理情報科学(GIS)ワークフロー最適化のための Python スクリプトを紹介しています。GIS 解析を自動化するために不可欠なプログラミング スキルを身につけることができます。 環境および水資源問題における地理情報システム(GIS)の応用についてのステップバイステップのチュートリアルです。GIS とその応用についての情報を提供し、特に最先端の ESRI GIS 技術とその拡張機能を使用しています。 無料で公開されているテキストブックは、以下のサイトより無料で公開されているタイトルリスト (Excel) をダウンロードいただき、[OpenURL] 列の URL にアクセスするとダウンロードすることができます。 新型コロナウイルス(SARS-CoV-2)・感染症(COVID-19)の情報サイトを公開 | Campaigns | Springer Nature なお、販売、公開されている書籍は英語での内容となります。 開発者向けリソース 当記事でご紹介したもの以外にも無料で様々な開発者向けリソースを公開しています。形式は動画、ドキュメント、サンプルコード、サンプルアプリなど多岐にわたり、かつ、内容も非常に充実していますので、ご活用ください。 ・Example Apps Demonstrating the ArcGIS Platform(英語) 各種 SDK / API を活用したアプリをコードとともに公開しています。また、開発時の悩みどころであるアーキテクチャや UI / UX のベストプラクティスを例示しています。ソースコードは無償で自由に利用可能ですので、アプリケーションを開発する際、公開しているコードを土台としてカスタマイズすることもできます。 ・GeoDev Webiner Series(英語) 米国Esri の開発者がお届けする Webiner です。 ・Esri Videos | E360 Videos(英語) 米国Esri のイベントの動画サイトで Esri Developer Summit の動画も公開しています。 ・Esri on GitHub(英語) 500 以上のプロジェクトを公開していて、各種 SDK / API のサンプルコード、サンプルアプリなども取得可能になっています。 ・Esri Japan on GitHub(日本語) ArcGIS for Developers 開発リソース集のドキュメントや各種 SDK / API のサンプルコード、サンプルアプリを公開しています。 その他の参考資料 ・各種 API / SDK の過去のハンズオン資料やコード(日本語) ESRIジャパンは定期的に各種 SDK / API のハンズオンを実施しており、そこで使用した資料やコードを GitHub に公開しています。 以下に最近開催されたハンズオンを記載しますが、これら以外にも多くのハンズオンが開催されています。どのハンズオンの資料も体系的に学べるように作成されていますので、興味のある SDK / API がありましたら、まずは公開されているハンズオンを試してみるのも一つの手かと思います。 ①開発者向けセミナー in 大阪、福岡 ・ArcGIS Runtime SDK for .NET アプリ開発 ・ArcGIS API for JavaScript アプリ開発 ②ArcGIS 開発者のための最新アプリ開発塾 2019 ・ArcGIS REST API 入門 ・調査アプリケーション構築(ArcGIS Runtime SDK for .NET) ・ArcGIS API for JavaScript でのウィジェット開発 ③ArcGIS Pro SDK 勉強会 in 大阪 ・ArcGIS Pro SDK for .NET アドイン開発 関連リンク ・Springerからの教科書400冊が2020年7月末まで無料… Choimirai School のサンミンさんが書かれているSpringer 社の無料で公開されているテキストブックの note の日本語記事です。 ダウンロードの仕方の他、Python を使ったダウンロード自動化などについても記載されています。
... View more
04-30-2020
11:45 PM
|
0
|
0
|
3449
|
DOC
|
はじめに 2019年12月11日に、グランパーク カンファレンスで開催いたしました「マッピング & ロケーション 開発 最前線」、多数の方にご参加いただきありがとうございました。 過去の開発塾と同様に、本セミナーでのテクニカルセッションの配布資料、およびソースコードを GitHub 上で公開しております。都合により参加できなかった方、ArcGIS でのマッピング & ロケーションの開発を体験してみたい方は、ダウンロードしてご活用ください。 資料およびソースコード 1. ArcGIS 開発者製品の概要と最新動向 2. ArcGIS による様々な拡張パターンの紹介(第1部) 2-1. Web アプリケーション 2-2. ネイティブ アプリケーション 3. ArcGIS による様々な拡張パターンの紹介(第2部) 3-1. ArcGIS Enterprise 最新動向 3-2. デスクトップ拡張、スクリプト 3-3. 最新テクノロジー 4. まとめ 5. 参考 5-1. 開発者向けリソースのご紹介 5-2. ArcGIS を学ぶためのリソースのご紹介 サンプルコード 関連リンク 「ArcGIS 開発者のための最新アプリ開発塾 2019」のハンズオンコードも大公開 「ArcGIS 開発者のための最新アプリ開発塾」のハンズオンコードも大公開
... View more
12-16-2019
01:49 AM
|
0
|
0
|
1389
|
DOC
|
はじめに ArcGIS API for JavaScript では、たくさんの定義済みのレイヤーを提供しています。これらのレイヤーは、サーバーから画像またはデータを取得し、ビューに表示するために利用します。 上記でサポートされていないレイヤーをArcGIS API for JavaScript で扱う方法がヘルプの Introduction to layer extensibility に記載されおり、カスタムレイヤーを作成して対応することが可能です。 今回は、ArcGIS API for JavaScript では現在サポートしていない OGCの Tile Map Service(TMS)を対象に、カスタムレイヤーを作成して対応する方法を紹介したいと思います。 Tips ! 弊社製品に詳しい方は、WebTileLayer クラスで対応できるのでは?と思った方がいらっしゃるかもしれませんが、WebTileLayer は原点が左上(北西)、Tile Map Service は原点が左下(南西)というところが大きく異なっています。 Tile Map Service のサービス Tile Map Service でサービスを配信している主なものは、国内では次のようなものが挙げられます。 防災科学技術研究所 - 水害地形分類図デジタルアーカイブ(故大矢雅彦早稲田大学名誉教授) [水害地形分類図デジタルアーカイブ] > [データ利用方法] > [画像データおよびAPIの利用に関する技術情報] http://ecom-plat.jp/suigai-chikei/index.php?gid=10126 今昔マップ on the Web http://ktgis.net/kjmapw/ http://ktgis.net/kjmapw/tilemapservice.html 農研機構のタイル地図キャッシュサービス [Finds.jp] > [タイル地図キャッシュサービス] > [レイヤー一覧] https://www.finds.jp/tmc/layers.html.ja サンプルとしての実装方法を紹介する記事なのでどのサービスを使ってもよいのですが、最近、できるネットの「この土地には何があった? 古地図と現在の地図を比較できる「今昔マップ on the web」【水害・地震への備えに】」でも取りあげられているように、古い土地の歴史を確認するのに有用な「今昔マップ on the Web」のサービスを例にします。 また、本記事で作成するサンプルアプリケーションには、以下の機能を持たせ、そこに必要となる3つのポイントを解説します。 1) Tile Map Service のサービスをレイヤーとして表示/非表示の切替機能 2) ArcGIS Online の背景地図とスワイプできる機能 なお、本記事のようにAPIでサービス利用をする場合においても、必ずサービス元の利用ポリシーを確認の上、利用ポリシーに従ってご利用ください。 それではポイントを見ていきましょう。 ポイント1:カスタムレイヤー Introduction to layer extensibility の Request tiles as they are predefined from a data source のコードを参考に、カスタムレイヤー(今回はTMSLayerとした)を WebTileLayer.createSubclass で定義し、getTileUrl() メソッドをオーバーライドして、y座標を入れ替えします。 // *******************************************************
// ArcGIS API for JavaScript 4.x での TMSLayer の実装例
// TMSLayer を WebTileLayer のサブクラスとして実装し、
// getTileUrl() メソッドをオーバーライド
// *******************************************************
var TMSLayer = WebTileLayer.createSubclass({
getTileUrl: function(level, row, col){
//var y = Math.pow(2, level) - row - 1;
var y = (1 << level) - row - 1;; // シフト演算の方を採用
return this.urlTemplate.replace("{level}", level).replace("{col}", col).replace("{row}", y);
}
}); Tips ! maps.nyc.gov に同様の実装例があります。 // *******************************************************
// 参考: maps.nyc.gov でのTMSLayer の実装例
// https://maps.nyc.gov/tiles/#arcgis4-xyz
// *******************************************************
var TMSLayer = WebTileLayer.createSubclass({
getTileUrl: function(level, row, col){
var supermethod = this.getInherited(arguments);
var y = Math.pow(2, level) - row - 1;
return supermethod.call(this, level, y, col);
}
}); ポイント2:独自のプロキシ サービスをホスティングし設定 ArcGIS API for JavaScript 4.9 から、CORS(Cross-Origin Resource Sharing) をサポートしていることをデフォルトとして扱うようになったため、CORS の設定をしていない今回のようなサーバーを使う場合は、独自のプロキシ サービスをIIS 等のWeb サーバーに設定しておく必要があります。 独自のプロキシ サービスの設定方法は、ArcGIS for Devlopers 開発リソース集の、独自の Web サーバーにホストするプロキシ サービス のページをご参照ください。 // *******************************************************
// JavaScript API 4.9 から CORS をサポートしているのをデフォルトとして扱うようになったので
// CORS の設定をしていないサーバーを使う場合は、独自のプロキシ サービスを自分で設定しておく
// 参考:独自の Web サーバーにホストするプロキシ サービス
// http://esrijapan.github.io/arcgis-dev-resources/proxy-services/
// *******************************************************
// 今回、設置した独自のプロキシ サービスは.NET 版
// サーバー側でのTLS 1.2 が未対応だったため、「独自の Web サーバーにホストするプロキシ サービス」に記載の回避コードを追記済み
urlUtils.addProxyRule({
urlPrefix: "sv53.wadax.ne.jp", //ktgis.net,www.finds.jp
proxyUrl: "https://yourhostserver/DotNet/proxy.ashx"
});
なお、プロキシ サービス 設定用の proxy.config のXML ファイルには次のように設定します。 <?xml version="1.0" encoding="utf-8" ?>
<ProxyConfig allowedReferers="*" mustMatch="true">
<serverUrls>
<!--
<serverUrl url="http://services.arcgisonline.com"
matchAll="true"/>-->
<!--今昔マップ-->
<serverUrl url="https://sv53.wadax.ne.jp"
matchAll="true"/>
</serverUrls>
</ProxyConfig>
ポイント3:ウィジェットを活用 ウィジェット を使うのは必須ではありませんが、LayerList (API 4.2から), Expand(API 4.3から), Swipe(API 4.13から) のwidget を上手く活用すると、たった数行のコードで 1) Tile Map Service のサービスのレイヤーの表示/非表示の切替機能 2) ArcGIS Online の背景地図とスワイプできる機能 を実装することができます。 // ウィジェット活用1:
// 新規のLayerList widget を作成
var layerList = new LayerList({
view: view,
});
// 新規のExpand widget を作成
var llExpand = new Expand({
view: view,
content: layerList,
expanded: false
});
// widget を ui の右上へ追加
view.ui.add(llExpand, "top-right");
// ウィジェット活用2:
// 新規の Swipe widget を作成
var swipe = new Swipe({
//leadingLayers: [layername],// 今回は未使用
trailingLayers: [tmsLayer,tmsLayer1,tmsLayer2,tmsLayer3,tmsLayer4,tmsLayer5,tmsLayer6,tmsLayer7,tmsLayer8],
position: 50, // widget の位置を50%に設定
view: view
});
// widget を ui に追加
view.ui.add(swipe);
完成版のサンプル 最後に完成版のコードは次のようになりますが、いつものようにGitHub上でも公開しておきます。 ArcGIS for Developers のアカウント※をお持ちであれば、独自のプロキシ サービスをIIS 等のWeb サーバーにホスティングし、そのホスティング環境の設定を完成版のコードへ適用することで、ご自身の環境で試すことが出来ると思いますので、お試しいただければと思います。 ※ 今回のコードを試す用途であれば、ArcGIS Developer Subscription の無償のEssentials でも可能 なお、上記に記載したように、APIでサービス利用をする場合においても、必ずサービス元の利用ポリシーを確認の上、利用ポリシーに従ってご利用ください。 <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<title>Custom TileLayer - 4.13</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.13/esri/themes/dark/main.css" />
<script src="https://js.arcgis.com/4.13/"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<script>
require([
"esri/Map",
"esri/config",
"esri/request",
"esri/Color",
"esri/views/MapView",
"esri/widgets/LayerList",
"esri/widgets/Swipe",
"esri/widgets/Expand",
"esri/layers/WebTileLayer",
"esri/core/urlUtils",
"dojo/domReady!"
], function(
Map, esriConfig, esriRequest, Color,
MapView, LayerList, Swipe, Expand, WebTileLayer, urlUtils
) {
// *******************************************************
// ArcGIS API for JavaScript 4.x での TMSLayer の実装例
// TMSLayer を WebTileLayer のサブクラスとして実装し、
// getTileUrl() メソッドをオーバーライド
// *******************************************************
var TMSLayer = WebTileLayer.createSubclass({
getTileUrl: function(level, row, col){
//var y = Math.pow(2, level) - row - 1;
var y = (1 << level) - row - 1; // シフト演算の方を採用
return this.urlTemplate.replace("{level}", level).replace("{col}", col).replace("{row}", y);
}
});
// *******************************************************
// 参考: maps.nyc.gov でのTMSLayer の実装例
// https://maps.nyc.gov/tiles/#arcgis4-xyz
// *******************************************************
/*
var TMSLayer = WebTileLayer.createSubclass({
getTileUrl: function(level, row, col){
var supermethod = this.getInherited(arguments);
var y = Math.pow(2, level) - row - 1;
return supermethod.call(this, level, y, col);
}
});
*/
// *******************************************************
// JavaScript API 4.9 から CORS をサポートしているのをデフォルトとして扱うようになったので
// CORS の設定をしていないサーバーを使う場合は、独自のプロキシ サービスを自分で設定しておく
// 参考:独自の Web サーバーにホストするプロキシ サービス
// http://esrijapan.github.io/arcgis-dev-resources/proxy-services/
// *******************************************************
// 今回、設置した独自のプロキシ サービスは.NET 版
// サーバー側でのTLS 1.2 が未対応だったため、「独自の Web サーバーにホストするプロキシ サービス」に記載の回避コードを追記済み
urlUtils.addProxyRule({
urlPrefix: "sv53.wadax.ne.jp", //ktgis.net,www.finds.jp
proxyUrl: "https://yourhostserver/DotNet/proxy.ashx"
});
// *******************************************************
// JavaScript application の開始
// *******************************************************
// TMSLayer のインスタンスを作成し、プロパティを設定
var tmsLayer = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/2man/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1896-1909年)"
});
var tmsLayer1 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/00/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1917-1924年)",
visible: false
});
var tmsLayer2 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/01/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1927-1939年)",
visible: false
});
var tmsLayer3 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/02/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1944-1954年)",
visible: false
});
var tmsLayer4 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/03/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1965-1968年)",
visible: false
});
var tmsLayer5 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/04/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1975-1978年)",
visible: false
});
var tmsLayer6 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/05/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1983-1987年)",
visible: false
});
var tmsLayer7 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/06/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1992-1995年)",
visible: false
});
var tmsLayer8 = new TMSLayer({
urlTemplate: "https://sv53.wadax.ne.jp/~ktgis-net/kjmapw/kjtilemap/tokyo50/07/{level}/{col}/{row}.png",
opacity: 0.6,
title: "今昔マップ-首都圏編(1998-2005年)",
visible: false
});
// TMSLayer のインスタンスをマップに追加
var map = new Map({
layers:[tmsLayer,tmsLayer1,tmsLayer2,tmsLayer3,tmsLayer4,tmsLayer5,tmsLayer6,tmsLayer7,tmsLayer8],
basemap: "topo"
});
// map を MapView に追加
var view = new MapView({
container: "viewDiv",
map: map,
center: [139.715512, 35.678257],
zoom: 15
});
// 新規のLayerList widget を作成
var layerList = new LayerList({
view: view,
});
// 新規のExpand widget を作成
var llExpand = new Expand({
view: view,
content: layerList,
expanded: false
});
// widget を ui の右上へ追加
view.ui.add(llExpand, "top-right");
// 新規の Swipe widget を作成
var swipe = new Swipe({
//leadingLayers: [layername],// 今回は未使用
trailingLayers: [tmsLayer,tmsLayer1,tmsLayer2,tmsLayer3,tmsLayer4,tmsLayer5,tmsLayer6,tmsLayer7,tmsLayer8],
position: 50, // widget の位置を50%に設定
view: view
});
// widget を ui に追加
view.ui.add(swipe);
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>
関連リンク(ArcGIS 関連) ・ArcGIS API for JavaScript(ArcGIS for Developers): ArcGIS API for JavaScript 4.x のWeb ヘルプ ・Introduction to layer extensibility: ArcGIS API for JavaScript 4.x でのカスタムレイヤーについての説明 ・ArcGIS API for Javascript: Creating Custom Layers and Layer Views(pdf): Esri Developer Summit 2019 でのカスタムレイヤーとレイヤービューのテクニカルセッション資料 ・独自のWeb サーバーにホストするプロキシサービス: Proxy files for DotNet, Java and PHP の日本語解説ページ ・ ArcGIS for Developers 開発者アカウント作成方法: ArcGIS for Developers のアカウントを作成する日本語解説ページ 関連リンク(その他) ・Tiled web map: OpenLayers でサポートしているOGC標準のタイルサービスについての説明。 ・Web Map Tile Service: TMSより新しいOGC標準のタイルサービスについての説明。 ・OpenStreetMap wiki: OpenStreetMapの仕様(WMTS)等について記載されているサイト。 ・Slippy map tilenames - OpenStreetMap Wiki: OpenStreetMapのファイル命名規則、各種言語( Python, Ruby, JS, C# など)での、緯度、経度、ズームレベルのタイル座標の相互の計算式等が多数記載あり。 ・tmcw/xyz_vs_tms.md: TMSからWTMS のタイルY座標を計算をする式が記載されてmdファイル ・Tiles à la Google Maps: Coordinates, Tile Bounds and Projection - conversion to EPSG:900913 (EPSG:3785) and EPSG:4326 (WGS84): TMS , WTMS , Quadkey での座標を表示できるWebアプリあり。また、それを計算しているPythonのコードも閲覧可能。
... View more
10-29-2019
06:59 PM
|
0
|
0
|
2689
|
DOC
|
はじめに 前回の ArcGIS の Python でのマルチプロセス処理 の記事で、ArcGIS プラットフォームの拡張手段として定着している ArcPy と Python でのマルチプロセス処理をとりあげ、ベスト プラクティスや、コーディング パターンをサンプルを交えながら紹介させて頂きました。 詳細な解説は、前回の記事をご参照いただきたいですが、コーティング パターンのポイントとしてあげたのは以下の3つです。 1) ワーカー関数:batch_convert 2) ワーカー関数のラッパー:multi_run_batch_convert 3) マルチプロセスの処理:exec_batch_convert 今回の記事では農林水産省が公開している「農地の区画情報(筆ポリゴン)」を例に、前回の記事で取り上げたコーディング パターンに従って、処理を書いてみたコードを公開します。 サンプルコード 今回のサンプルは、筆ポリゴンのZIP 解凍後の1つの「都道府県フォルダ」の筆ポリゴンを処理するものです。 1つの「都道府県フォルダ」の下に「各市区町村フォルダ」があり、その下に1つの「シェープファイル」が入っています。 それを「都道府県_filegdbフォルダ」の下に「各市区町村ファイル ジオデータベース」を作成後、「シェープファイル」から「フィーチャクラス」への変換と「市区町村コードと市区町村名を属性に格納する処理」をマルチプロセスで実行します。 また、最終的に各市区町村に分かれている「フィーチャクラス」のマージをシングルプロセスで実行するコードや、マージ後に不要となった「各市区町村ファイル ジオデータベース」の削除も書いています。 #coding:utf-8
#---------------------------------------------------------------------
# Name: Multiprocess_Forge_ShapefileToFeatureClass_uft8.py
# Purpose: 農地の筆界をマルチプロセスでフィーチャクラスに変換
# 自治体コードや自治体名をフィールドに入れる
# フォルダ内のフィーチャクラスをマージしたフィーチャクラスを作成
# Author: Kataya @ ESRI Japan
# Created: xx/10/2019
# Copyright: (c) ESRI Japan Corporation
# ArcGIS Version: 10.x
# Python Version: 2.7
#---------------------------------------------------------------------
import arcpy,os
import sys
import multiprocessing
import datetime
import traceback
reload(sys)
sys.setdefaultencoding('cp932')
def split_citycode_cityname(wsname):
'''
農地筆の自治体コードと自治体名からそれぞれ抽出して返す
フォルダ名の例) 02201青森市2019
02202弘前市2019
'''
l = len(wsname)
citycode = "'{0}'".format(wsname[:5]) #自治体コードだけを抽出
cityname = '"' + "{0}".format(wsname[5:l-4]) + '"' #自治体名だけを抽出
return citycode, cityname
def multi_run_batch_convert(args):
'''
batch_convertのwrapper:
複数の引数を実行処理に渡すために必要なラッパー
'''
return batch_convert(*args)
def batch_convert(inws, outws):
'''
1プロセスで実行する処理:
1) FGDBへの書込みは仕様で複数プロセスで書込みできないため
1市区町村フォルダ下のシェープファイルを
1市区町村のFGDB下のフィーチャクラスに変換
2) すべてのフィーチャクラスを統合したとき識別しやすいように
フォルダ名から市区町村コードと、自治体名を作成しフィールドに値を格納
'''
print(u"Convert: {0} ⇒ {1}\n".format(inws,outws))
if not arcpy.Exists(outws):
outfolder = u"{0}".format(os.path.dirname(outws))
foldername= u"{0}".format(os.path.basename(outws))
arcpy.CreateFileGDB_management(outfolder, foldername, "CURRENT")
arcpy.env.workspace = inws
fieldname1 = "CITYCODE"
fieldname2 = "CITYNAME"
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
infc=os.path.splitext(fc)[0]
newfc = u"c_{0}".format(infc) #シェープファイル名が数値ではじまり、FGDBへそのまま変換できないので接頭にc_を入れる
wsname = os.path.basename(inws)
citycode, cityname = split_citycode_cityname(wsname) #フォルダ名から自治体コードと自治体名を抽出
## 座標系はそのまま変換
if arcpy.Exists(os.path.join(outws,newfc)):
outfc=os.path.join(outws,newfc)
arcpy.Append_management(fc,outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc,outws,newfc)
outfc=os.path.join(outws,newfc)
arcpy.AddField_management(outfc,fieldname1,"TEXT",field_length=5)
arcpy.AddField_management(outfc,fieldname2,"TEXT",field_length=30)
# citycode, cityname をフィールド値にいれる
calfc = os.path.join(outws,newfc)
arcpy.CalculateField_management(calfc, fieldname1, citycode, "PYTHON_9.3", "#")
arcpy.CalculateField_management(calfc, fieldname2, cityname, "PYTHON_9.3", "#")
del fcs
return u" 変換済:{0}".format(outws)
def exec_batch_convert(infolder,outfolder):
'''
マルチプロセスでの処理:
'''
try:
start=datetime.datetime.now()
print(u"-- Strat: Multiprocess_Forge_ShapefileToFeatureClass --:{0}".format(start))
cpu_cnt=multiprocessing.cpu_count()
arcpy.env.workspace = infolder
inwss = arcpy.ListWorkspaces("*","Folder")
# 各プロセスに渡すパラメータをリスト化
params=[]
for inws in inwss:
param1=inws # 市区町村フォルダ(シェープファイルが入っている)
gdbname=u"{0}.gdb".format(os.path.basename(inws))
param2=os.path.join(outfolder,gdbname) # 市区町村ファイルジオデータベース
params.append((param1,param2))
if len(inwss) < cpu_cnt: # 処理フォルダ数CPUコアより少ない場合無駄なプロセスを起動不要
cpu_cnt=len(inwss)
pool = multiprocessing.Pool(cpu_cnt) # cpu数分プロセス作成
results=pool.map(multi_run_batch_convert,params) # 割り当てプロセスで順次実行される
pool.close()
pool.join()
# 各プロセスでの処理結果を出力
for r in results:
print(u"{0}".format(r))
# 各プロセスからのマージ版を作成
arcpy.env.workspace = outfolder
outwss = arcpy.ListWorkspaces("*","FileGDB")
foldername="{0}.gdb".format(os.path.basename(outfolder))
forgefc = "forge"
print(u" Mearge to FeatureClass:{1} in FGDB:{0} ".format(foldername, forgefc))
arcpy.CreateFileGDB_management(outfolder,foldername,"CURRENT")
forgews = os.path.join(outfolder, foldername)
for outws in outwss:
arcpy.env.workspace = outws
fc = arcpy.ListFeatureClasses()[0] #農地筆は1ファイルしかないので固定
print(u" merge: {0} ⇒ {1}".format(fc,forgefc))
if arcpy.Exists(os.path.join(forgews, forgefc)):
outfc=os.path.join(forgews,forgefc)
arcpy.Append_management(fc,outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc,forgews,forgefc)
# マージが終わったので後片付け 各市区町村のFGDBを削除 - 必要に応じてコメントアウトを外す
#for outws in outwss:
# arcpy.Delete_management(outws)
fin=datetime.datetime.now()
print(u"-- Finish: Multiprocess_Forge_ShapefileToFeatureClass --:{0}".format(fin))
print(u" Elapsed time:{0}".format(fin-start))
except:
print(u"Exception:{0}".format(sys.exc_info()[2]))
def setup_batch_convert():
'''
コマンドプロンプトからの実行パラメータを設定の場合:
市区町村別のシェープファイルが入った都道府県フォルダ :infolder
例)
|-02青森県2019
|-02201青森市2019
| 02201青森市2019_5.shp
|-02202弘前市2019
| 02202弘前市2019_5.shp
|-02203八戸市2019
|-02204黒石市2019
・・・・・
市区町村別のファイル ジオデータベースの作成先フォルダ :outfolder
例)
|-02青森県2019_filegdb
|-02201青森市2019.gdb
| c_02201青森市2019_5
|-02202弘前市2019.gdb
| c_02202弘前市2019_5
|-02203八戸市2019
|-02204黒石市2019
・・・・・
|-02青森県2019_filegdb.gdb # 市区町村別のフィーチャクラスをマージしたフィーチャクラスを格納するファイル ジオデータベース
| forge
'''
infolder=ur"F:\Temp\農地の筆ポリゴン\02青森県2019" #市区町村別のシェープファイルが入った都道府県フォルダ(平面直角座標系ごと)
outfolder=ur"F:\Temp\農地の筆ポリゴン\02青森県2019_filegdb" #市区町村別のファイル ジオデータベースの作成先フォルダ
exec_batch_convert(infolder,outfolder)
if __name__ == '__main__':
setup_batch_convert()
64-bit 環境でのPython スクリプトの実行例 前回の記事と同様、Pythonスクリプトの実行例としてArcGIS Desktop、ArcGIS Proでの例を載せておきます。 実行例)ArcGIS Desktop 10.7.1 >C:\Python27\ArcGISx6410.7\python.exe Multiprocess_Forge_ShapefileToFeatureClass_utf8.py 実行例)ArcGIS Pro 2.4 >"c:\Program Files\ArcGIS\Pro\bin\Python\scripts\propy.bat" Multiprocess_Forge_ShapefileToFeatureClass_utf8.py 参考 ArcGIS の Python でのマルチプロセス処理
... View more
10-24-2019
10:33 PM
|
0
|
0
|
2404
|
POST
|
Hi, David. Is this comment is still need answer ? In my understanding, Esri JavaScript API does not have class support "OSGeo TMS". But you could read "OSGeo TMS" as layer to create a custom subclass inherited from the WebTileLayer. In NYC Map Tiles sites, you could find sample implementation of both Esri JavaScript API 3.x and 4.x. This is an example) var TMSLayer = WebTileLayer.createSubclass({ getTileUrl: function(level, row, col){ var y = (1 << level) - row - 1; return this.urlTemplate.replace("{level}", level).replace("{col}", col).replace("{row}", y); } });
... View more
09-07-2019
08:55 PM
|
0
|
0
|
606
|
DOC
|
はじめに 2019年8月23日に弊社永田町オフィスで開催した「 ArcGIS 開発者のための最新アプリ開発塾 2019 」、多数の方にご参加いただきありがとうございました。 今年の開発塾では、昨年からステップアップした内容として、ArcGIS プラットフォームを活用するための基礎となる REST API 入門 を手始めに、ArcGIS プラットフォームを活用した街路樹調査アプリケーションの開発、TypeScript を利用した ArcGIS API for JavaScript のウィジェット開発 をハンズオンとして実施しました。 昨年の開発塾と同様、本セミナーでの配布資料のデジタル版、ハンズオンで使用したデータやソースコードを GitHub 上で公開しております。都合により参加できなかった方、ArcGIS プラットフォームを活用した開発用 API / SDK での開発を体験してみたい方は、ダウンロードしてご活用ください。 ※ なお、当日は時間の都合上、駆け足になってしまいました ArcGIS プラットフォームを活用した街路樹調査アプリケーションの開発のハンズオンについては、後日チュートリアル形式にして、公開させていただく予定です。 資料 および ソースコード ArcGIS プラットフォーム活用のための REST API 入門 ArcGIS プラットフォームを活用した街路樹調査アプリケーション構築 TypeScript を利用した ArcGIS API for JavaScript のウィジェット開発 / ハンズオン手順資料 上記の2, 3 で使用したデータ および ソースコード 関連リンク 昨年の開発塾のブログ記事 「ArcGIS 開発者のための最新アプリ開発塾」のハンズオンコードも大公開
... View more
08-27-2019
10:56 PM
|
1
|
0
|
1599
|
POST
|
どちらも、ArcGIS Desktop Advanced のライセンスが必要となりますが、 「最近接 (Near) 」ツール:点から線までの最短距離 http://desktop.arcgis.com/ja/arcmap/latest/tools/analysis-toolbox/near.htm 「ポイントでラインを分割 (Split Line at Point)」ツール:線上のポイントで線を分割 http://desktop.arcgis.com/ja/arcmap/latest/tools/data-management-toolbox/split-line-at-point.htm を組み合わせすれば、よいように思います。 詳細については上記ヘルプ をご参照いただき、お試しください。 なお、GeoNet は性質上、ユーザーコミニティ内でのやり取りを支えるための仕組みとなっておりますので、タイムリーな回答や場合によっては回答を差し上げることも困難な場合がございます。 保守の一環として提供しております「製品サポートサービス」のご利用もご検討いただけますと幸いです。 https://www.esrij.com/services/maintenance/
... View more
08-01-2019
06:06 PM
|
0
|
1
|
1781
|
POST
|
水文解析をする前のDEMに対して、窪地をなくする前処理をして、サーフェスの平滑化(Fill)を行うようにするのが一般的です。 詳細はArcGIS のヘルプ で水文解析ツールセットの内容を一読することをお勧めします。 http://desktop.arcgis.com/ja/arcmap/latest/tools/spatial-analyst-toolbox/an-overview-of-the-hydrology-tools.htm またArcGIS のバージョンは古いですが、水文解析の手順は変更がないので、こちらもご参照ください。 https://blog.esrij.com/2010/12/14/arcgis-5c88/
... View more
08-01-2019
05:38 PM
|
0
|
0
|
1887
|
POST
|
ArcMap もしくは ArcCatalog の、[システム ツール ボックス] > [Raster Analysis Tool] に2つのジオプロセシングツールが追加されています。 ・「Topographic Openness」が地上開度/地下開度のジオプロセシングツールとなっておりますので、 そちらを他のジオプロセシングツールと同様にお使いください。
... View more
07-10-2019
11:57 PM
|
0
|
1
|
3583
|
POST
|
ArcGIS Pro版は現在ありません。 ArcMap の10.5 /10.5.1 対応版はこちらにあります。 https://www.arcgis.com/home/item.html?id=53a7bdf145dc4e6390eb8ccf1ae3053d
... View more
07-10-2019
10:44 PM
|
0
|
3
|
3583
|
POST
|
地上開度、地下開度のPython での実装コードはありませんが、ジオプロセシングツールは公開しております。 こちらのご利用をご検討いただけますと思います。 https://www.arcgis.com/home/item.html?id=b61d84afb36646c4a35228b2eea1d6bc
... View more
07-10-2019
10:11 PM
|
0
|
5
|
3583
|
DOC
|
はじめに: 先月の3/5 ~ 3/8 に米国で行われた「Esri Developer Summit 2019 」のテクニカル セッション 242本分の動画が、先々週から公開が始まっています( Esri 2019 Developer Summit Tech Sessions )。 その中の一部のものは、スライド やデモ で利用しているコードがGitHub 上で公開されており、開発する際のヒントになるかと思います。 今回の記事では、「Python Working with Feature Data」のタイトルで発表されていたセッションの内容を、スライドに沿う形で紹介していきます。ArcPy でのフィーチャ データ, テーブルの操作に関する内容がコンパクトにまとまっていますので、ArcPy でデータを操作したい方は必見の内容かと思います。 Python Working with Feature Data のスライド Python Working with Feature Data の動画 ※この記事の見出しは、スライドのタイトルに対応しています。また、コードリーディングを重視して、原文のままにしているものもありますので、ご了承ください。 スライド: Cursors Cursors はレコード単位、フィーチャ単位でのアクセスを提供 さまざまなワーク フローで基本的には必要 SearchCursor | 読み取り専用のアクセスに利用 UpdateCursor | 行の更新、もしくは削除に利用 InsertCursor | 行の挿入に利用 2つの実装がある arcpy.da cursors と "Classic" cursors どっちを使う? 昔作ったコードを持っていない限り、arcpy.da cursors を使うのを推奨 Table basics ※スライドのセル色の説明 黄色セル:行 緑色セル:列 水色セル:Geometry は Shape 列に格納されている(例ではPoint 型のジオメトリ) Cursors arcpy.da cursors は lists や tuples を使用 Row values には index を使ってアクセス可能 fields = ['field1', 'field2']
cursor = arcpy.da.InsertCursor(table, fields)
cursor.insertRow([1, 10]) ”Classic” cursors 10.1 より前の scripts の例 Row objects を利用 Row values はsetValue, getValue を使って操作 cursor = arcpy.InsertCursor(table)
row = cursor.newRow()
row.setValue("field1", 1)
row.setValue("field2", 10)
cursor.insertRow(row) with statemantes arcpy.da Cusors は with statements(with構文)をサポート with arcpy.da.SearchCursor(table, field) as cursor:
for row in cursor:
print row[0] with statements(with構文) python ではwith statements はコンテキストマネージャー Locks が発生するような状況でのスコープを制御 コードが明快 Demo: Cursors GitHub 上の「demo_1_cursor.py」のコードはこちら More on cursors Row values にはindex を使ってアクセス パフォーマンスはよいが、コードの可読性は良くない with arcpy.da.SearchCursor(table, fields) as cursor:
for row in cursor:
print(row[17]) #index 17 is RoadName field あるいは、すぐにディクショナリに変換可能 generator function で Wrap すると、name でアクセス可能 def row_as_dict(cursor):
for row in cursor:
yield dict(zip(cursor.fields, row))
with arcpy.da.SearchCursor(table, fields) as cursor:
for row in row_as_dict(cursor):
print(row['RoadName']) Fields and tokens よいパフォーマンス のためには必要な fields を利用 全ての fields を "*" で指定する方法は、パフォーマンスのためには非推奨 tokens も利用可能 これもアクセスしたい token でアクセスするのがよい # tokens の例
'OID@'
'SHAPE@XY'
'SHAPE@TRUECENTROID'
'SHAPE@X'
'SHAPE@Y'
'SHAPE@Z'
'SHAPE@M'
'SHAPE@JSON'
'SHAPE@WKB'
'SHAPE@WKT'
'SHAPE@'
'SHAPE@AREA'
'SHAPE@LENGTH' Editor class トランザクションを管理するために編集セッションと編集操作を使用する 編集は保存され永久に適用されるまで一時的なもの 変更を保存せずに編集セッションを終了可能 いつ利用する必要がある? トポロジー, ジオメトリ ネットワーク のフィーチャ を編集する場合 エンタープライズ ジオデータベース のバージョン対応データを操作する場合 クラス エクステンション のいくつかのオブジェクトやフィーチャ クラス を操作する場合 Editor using a with statement Editorはwith構文 をサポート 適切な開始処理、停止処理、および中止の処理 with arcpy.da.Editor(workspace) as edit:
# your edits ※スライド上のオレンジ色の文字の説明 as edit: ← 編集セッションを開いて、編集操作を開始 # your edits のスコープで Exception - 操作のキャンセル, 編集セッションが保存せずに閉じられた場合 No Exception - 操作の終了, 保存, 編集セッションを閉じる場合 Editor class Editor class は編集セッションと操作をするためのメソッドも含まれている # Start an edit session
edit = arcpy.da.Editor(workspace)
# Edit session is started without an undo/redo stach
# for versioned data
edit.startEditing(False, True)
# Start an edit operation
edit.startOperation()
# Edits
# Stop the edit operation
edit.stopOperation()
# Stop the edit session and save changes
edit.stopEditing(True)
# Editor methods
startEditing ({with_undo}, {multiuser_mode})
stopEditing(save_changes)
startOperation()
stopOperation()
abortOperation()
undoOperation()
redoOperation() Demo: Edit sessions GitHub 上の「demo_2_editor.py」のコードはこちら Working with geometry geomety オブジェクトを作成するのは少し面倒 方法はいろいろある geometry objects cursor = arcpy.da.InsertCursor(fc, 'SHAPE@')
line = arcpy.Polyline(arcpy.Array([arcpy.Point( , ), arcpy.Point( , )]), arcpy.SpatialReference(3857))
cursor.insertRow([line]) esri json cusor = arcpy.da.InsertCursor(fc, 'SHAPE@JSON')
json_line = {"paths": [[[ , ], [ , ]]], "spatialreference":{"wkid": 102100, "latestWkid":3857}}
cursor.insertRow([json.dumps(json_line)]) list of coordinates cursor = arcpy.da.InsertCursor(fc, 'SHAPE@')
coordinate_list = [( , ), ( , )]
cursor.insertRow([coordinate_list]) Iterating over data 多くのプロセスでは、データのカタログ化または反復処理が必要 一般的なものは arcpy list functions 30+ across arcpy and modules arcpy.da list functions: ListDomains
ListFieldConflictFilters
ListReplicas
ListSubtypes
ListVersions
Walk ディレクトリ構造をたどってArcGIS のデータタイプを返す 3つのタプルを返す: path, path names, and filenames walk = arcpy.da.Walk(workspace, datatype=datatypes)
for path, path_names, data_names in walk:
for data_name in data_names:
do_something() Demo:Iterating over data GitHub 上の「demo_3_list.py」のコードはこちら Numpy Numpy は科学計算用のサード パーティ製 Pythonライブラリ 強力な配列オブジェクト 洗練された分析機能 arcpy.daは、テーブルやフィーチャクラスと numpy arrays への相互変換をサポート FeatureClassToNumPyArray, TableToNumPyArray raster と numpy.arrays も相互に変換可能 RasterToNumPyArray, NumPyArrayToRaster NumPy functions arcpy.da はその他にもテーブルやフィーチャクラスへの変換をサポート FeuatureClassToNumPyArray
TableToNumPyArray
NumPyArrayToFeatureClass
NumPyArrayToTable
ExtendTable Export to NumPy さらに分析するために、テーブルやフィーチャ クラスから numpy arrays へ変換可能 import arcpy
import numpy
in_fc = "c:/data/usa.gdb/USA/counties"
field1 = "INCOME"
field2 = "EDUCATION"
array1 = arcpy.da.FeatureClassToNumPyArray(in_fc, [field1, field2])
# Print correlation coefficients for comparison of 2 fields
print numpy.corrcoef((array1[field1], array1[field2])) Import from NumPy numpy での成果を、エクスポートしてArcGIS に戻す point: array1 = numpy.array([(1, ( , )), (2, ( , ))], numpy.dtype([('idfield', numpy.int32), ('XY', '<f8', 2)]))
sr = arcpy.SpatialReference(wkid)
arcpy.da.NumPyArrayToFeatureClass(array1, outFC, ['XY'], sr) polygons, lines, multipoints は別のところ pandas pandas は次のような特徴の3rd パーティライブラリ ハイパフォーマンス 使いやすいデータ構造と 解析ツール def features_to_pandas(in_features, fields):
in_arr = arcpy.da.FeatureClassToNumPyArray(in_features, fields)
return pandas,DataFrame(in_arr)
def pandas_to_features(dataframe, output, geometry_columns, wkid=None):
in_arr = dataframe.to_records()
spatial_ref = '' if not wkid else arcpy.SpatialReference(wkid)
return arcpy.da.NumPyArrayToFeatureClass(in_arr, output, geometry_columns, spatial_reference=spatial_ref) Demo: arcpy, numpy and pandas GitHub 上の「demo_4_numpy.py」のコードはこちら 関連: Python を使って作業の効率化を図ろう!:データの操作
... View more
04-23-2019
01:25 AM
|
0
|
0
|
2790
|
DOC
|
はじめに multiprocessing モジュール が含まれる Python 2.6 がArcGIS 製品に入ってきたのは、ArcGIS 10.0 の登場がはじめでした(ArcGIS 10.0 国内リリース:2010年10月22日)。それ以降、米国 Esri の配信している Blog でも Python Multiprocessing – Approaches and Considerations(2011年8月)、Multiprocessing with ArcGIS – Approaches and Considerations (Part 1):2012年9月としてマルチプロセス処理について記事で取り上げられたのをはじめ、近年でも世界中から多くの開発者が集まるEsri Developer Summit で Parallel Python: Multiprocessing with ArcPy:2017年3月 の動画、Vector and Raster Multiprocessing with ArcPy:2018年3月 の動画 としてテクニカル セッションとして取り上げられています。 マルチプロセス処理 ArcGIS Pro 動作環境 に見られるような高スペックのハードウェア(64-bit OSが標準、CPU 4コアを推奨、メモリも最適 16GB以上)が普及してきた一方で、分析や処理に使われるデータ量も飛躍的に増加しており、効率的な分析や処理が必要な状況は今も続いています。 そのような中で、今回は、ArcGIS プラットフォームの拡張手段として定着している ArcPy とPython でのマルチプロセス処理をとりあげ、実装の要点となる箇所とコーディングパターンをサンプルを交えつつ紹介したいと思います。 さまざまな処理での実際のコーディングは、関連情報に示したものを確認いただきつつ、実際にコードを書いて試してみることをお勧めしますが、本記事を参照して並列処理実装のポイントを掴んでいただき、現在のワークフローに上手く取り入れる一助となればと思います。 ベストプラクティス 関連情報に示した各種資料では、ArcPy とPython を使用したマルチプロセス処理のベストプラクティスとして、次のようなことが言われています。 テンポラリの結果を保持するためには、高速に動作するため、in_memory ワークスペースを使うのを推奨。 ファイル ジオデータベース(参考:ジオデータベースの概要)や、GRID ラスターへの書き込みは避ける。 これらのデータ形式はスキーマロックや同期の問題を引き起こすことがあり、これはファイル ジオデータベースとGRIDラスターが同時書き込みをサポートしていないためで、つまり、一度に1つのプロセスだけが書き込むことができる仕様であるということです。ArcGIS で開いていたフィーチャ クラスを、ArcPy で変更しようとすると、この問題が発生していたのは目にしたことがあるかと思います。さらに、ファイル ジオデータベースを所持していて、多くのフィーチャクラスに対して書き込みを行おうとすると、その問題は拡大されます。すべてのフィーチャ クラスが独立して存在していたとしても、ファイル ジオデータベース内のフィーチャクラスに書き込むことができるのは一度に1つのフィーチャ クラスです。 スクリプトの実行には 64-bit のPython 実行環境を使用する。 ArcGIS Pro 1.4 以上、もしくはArcGIS Server 10.5 以上、またはBackground Geoprocessing (64-bit) をインストールした ArcGIS Desktop 10.5 以上の 64-bit Python 実行環境を使用。64-bit の実行環境は32-bitのメモリ制限(4GB)で失敗するような、大きなデータに対する問題を解決できる可能性があるからです。 特に実装にあたっては、2つ目に挙げているファイル ジオデータベースの使用には注意する必要があります。少なくとも各プロセスでの処理を記載するワーカー関数での書込み先として同じファイル ジオデータベースを使用しないようにすべきですが、マスター関数でそれらを使用して、多数のシェープ ファイルや、個々のファイル ジオデータベースを単一ソースにマージするのに使用することは可能です。 *複数のプロセスからの書込み先として、ワーカー関数でのエンタープライズ ジオデータベースを書込み先として使用するのも、一つの方法です。 マルチプロセス処理のサンプル 今回のサンプルは、47都道県別のフォルダ下に複数のシェープファイルが入っており、それらを47都道府県別のファイル ジオデータベースを作成後、それぞれフィーチャクラスに変換する実装サンプルコードです。 実装する際のポイントは、上記のベストプラクティスで書いているように、ファイル ジオデータベースへの書込み時にロックされるので、「1都道府県フォルダのシェープファイルは1都道府県ファイル ジオデータベースでのフィーチャクラスへの変換となるようにコードを書くこと」です。 実際にコーディングパターンとして見ていきましょう。 1) ワーカー関数:batch_convert コーディングパターンとしては、まずはワーカー関数を通常の ArcPyでの処理と同様に書きます。このときに注意するべきなのは、ベストプラクティスで書いたように、このワーカー関数での処理がプロセスでの処理に相当するので、複数プロセス(複数のワーカー関数)から書込み先としてアクセスする必要がある場合はエンタープライズ ジオデータベースを利用するか、同じファイル ジオデータベースを使用しないようにすることです。 def batch_convert(inws, outws):
'''
1プロセスで実行する処理(ワーカー関数):
ファイル ジオデータベースへの書込みは複数プロセスでできないため、
・1都道府県のフォルダ下の複数シェープ ファイルを
・1都道府県のファイル ジオデータベース下の複数フィーチャ クラスに変換
するように記載
'''
#print("変換: {0} ⇒ {1}\n".format(inws,outws))
if not arcpy.Exists(outws):
outfolder=os.path.dirname(outws)
foldername=os.path.basename(outws)
arcpy.CreateFileGDB_management(outfolder,foldername,"CURRENT")
arcpy.env.workspace = inws
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
l=len(fc)
infc=os.path.splitext(fc)[0]
# 0埋めした4桁の名前にフィーチャクラス名を変更
# 例) P101_CITY.shp → P0101_CITY
newfc = fc[:1]+fc[1:l-4].zfill(4)
# 既存フィーチャクラスが存在する場合はAppend
# 存在しない場合はFeatureClassToFeatureClass
if arcpy.Exists(os.path.join(outws,newfc)):
outfc=os.path.join(outws,newfc)
arcpy.Append_management(fc,outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc,outws,newfc)
del fcs
return " 変換済:{0}".format(outws)
2) ワーカー関数のラッパー:multi_run_batch_convert マルチプロセスからワーカー関数を指定する際、ワーカー関数の引数が単独の場合は不要ですが、サンプルのように複数の引数を渡す必要がある場合は、ラッパー関数を用意すると便利です。 def multi_run_batch_convert(args):
'''
batch_convert の wrapper:
複数の引数を実行処理に渡すためのラッパー
'''
return batch_convert(*args) 3) マルチプロセスの処理:exec_batch_convert ワーカー関数へ渡す2つの引数(inws, outws)を params にリスト化していれます。 その後、 pool = multiprocessing.Pool(cpu_cnt) で確保した pool に results = pool.map(multi_run_batch_convert , params) を指定します。 第1引数:処理するワーカー関数名(今回の場合はラッパー関数) multi_run_batch_convert 第2引数:リストかしたパラメータ params def exec_batch_convert(infolder,outfolder):
'''
マルチプロセスでの処理(マスター関数):
'''
try:
start=datetime.datetime.now()
print "-- Strat: Multiprocess_ShapefileToFeatureClassWithRename --:",start
cpu_cnt=multiprocessing.cpu_count()
arcpy.env.workspace = infolder
inwss = arcpy.ListWorkspaces("*","Folder")
# 各プロセスへ渡すパラメータをリスト化
params=[]
for inws in inwss:
param1=inws # 都道府県フォルダ(シェープファイルが入っている)
gdbname="{0}.gdb".format(os.path.basename(inws))
param2=os.path.join(outfolder,gdbname) # 都道府県ファイルジオデータベース
params.append((param1,param2))
if len(inwss) < cpu_cnt: # 処理フォルダ数がCPUコアより少ない場合無駄なプロセスを起動不要
cpu_cnt=len(inwss)
pool = multiprocessing.Pool(cpu_cnt) #cpu数分のpythonプロセスを作成
results=pool.map(multi_run_batch_convert,params) #割り当てプロセスで順次実行される
pool.close()
pool.join()
# 各プロセスでの処理結果を出力
for r in results:
print(r)
# 都道府県別のファイル ジオデータベース内のフィーチャ クラスを統合して
# 全国版を作成する場合はここに記載します
# ~省略~
fin=datetime.datetime.now()
print "-- Finish: Multiprocess_ShapefileToFeatureClassWithRename --:",fin
print " Elapsed time:", fin-start
except:
print traceback.format_exc(sys.exc_info()[2]) 完成版のサンプルコード 上記までのコーディングパターンに従って実装したPythonスクリプト(Multiprocess_Sample.py)の infolder, outfolder をご自分の環境のものに変更してPython の実行環境から実行すれば、マルチプロセスでデータ変換が行われます。 #coding:cp932
import arcpy,os
import sys
import multiprocessing
import datetime
import traceback
reload(sys)
sys.setdefaultencoding('cp932')
def multi_run_batch_convert(args):
'''
batch_convert の wrapper:
複数の引数を実行処理に渡すためのラッパー
'''
return batch_convert(*args)
def batch_convert(inws, outws):
'''
1プロセスで実行する処理(ワーカー関数):
ファイル ジオデータベースへの書込みは複数プロセスでできないため、
・1都道府県のフォルダ下の複数シェープ ファイルを
・1都道府県のファイル ジオデータベース下の複数フィーチャ クラスに変換
するように記載
'''
#print("変換: {0} ⇒ {1}\n".format(inws,outws))
if not arcpy.Exists(outws):
outfolder=os.path.dirname(outws)
foldername=os.path.basename(outws)
arcpy.CreateFileGDB_management(outfolder,foldername,"CURRENT")
arcpy.env.workspace = inws
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
l=len(fc)
infc=os.path.splitext(fc)[0]
# 0埋めした4桁の名前にフィーチャクラス名を変更
# 例) P101_CITY.shp → P0101_CITY
newfc = fc[:1]+fc[1:l-4].zfill(4)
# 既存フィーチャクラスが存在する場合はAppend
# 存在しない場合はFeatureClassToFeatureClass
if arcpy.Exists(os.path.join(outws,newfc)):
outfc=os.path.join(outws,newfc)
arcpy.Append_management(fc,outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc,outws,newfc)
del fcs
return " 変換済:{0}".format(outws)
def exec_batch_convert(infolder,outfolder):
'''
マルチプロセスでの処理(マスター関数):
'''
try:
start=datetime.datetime.now()
print "-- Strat: Multiprocess_ShapefileToFeatureClassWithRename --:",start
cpu_cnt=multiprocessing.cpu_count()
arcpy.env.workspace = infolder
inwss = arcpy.ListWorkspaces("*","Folder")
# 各プロセスへ渡すパラメータをリスト化
params=[]
for inws in inwss:
param1=inws # 都道府県フォルダ(シェープファイルが入っている)
gdbname="{0}.gdb".format(os.path.basename(inws))
param2=os.path.join(outfolder,gdbname) # 都道府県ファイルジオデータベース
params.append((param1,param2))
if len(inwss) < cpu_cnt: # 処理フォルダ数がCPUコアより少ない場合無駄なプロセスを起動不要
cpu_cnt=len(inwss)
pool = multiprocessing.Pool(cpu_cnt) #cpu数分のpythonプロセスを作成
results=pool.map(multi_run_batch_convert,params) #割り当てプロセスで順次実行される
pool.close()
pool.join()
# 各プロセスでの処理結果を出力
for r in results:
print(r)
# 都道府県別のファイル ジオデータベース内のフィーチャ クラスを統合して
# 全国版を作成する場合はここに記載します
# ~省略~
fin=datetime.datetime.now()
print "-- Finish: Multiprocess_ShapefileToFeatureClassWithRename --:",fin
print " Elapsed time:", fin-start
except:
print traceback.format_exc(sys.exc_info()[2])
def setup_batch_convert():
'''
コマンドプロンプトからの実行パラメータを設定:
都道府県別のシェープ ファイルが入った元フォルダ :infolder
例)
|-Shapefiles
|- 01_北海道
|-P101_CITY.shp
|-L102_RIVER.shp
・・・・・
|- 02_青森県
|- 03_岩手県
・・・・・
都道府県別のファイル ジオデータベースの作成先フォルダ :outfolder
例)
|-Filegdbs
|- 01_北海道.gdb
|-P0101_CITY
|-L0102_RIVER
・・・・・
|- 02_青森県.gdb
|- 03_岩手県.gdb
・・・・・
'''
infolder=r"E:\DATA\Shapefiles" #都道府県別のシェープファイルが入った元フォルダ
outfolder=r"E:\DATA\Filegdbs" #都道府県別のファイル ジオデータベースの作成先フォルダ
exec_batch_convert(infolder,outfolder)
if __name__ == '__main__':
setup_batch_convert() 64-bit 環境でのPython スクリプトの実行例 なお、ベストプラクティスで書いたように、64-bitの Python環境から実行してください。Pythonスクリプトの実行例としてArcGIS Desktop、ArcGIS Proでの例を載せておきます。 実行例)ArcGIS Desktop 10.6.1 >C:\Python27\ArcGISx6410.6\python.exe Multiprocess_Sample.py 実行例)ArcGIS Pro 2.2 >"c:\Program Files\ArcGIS\Pro\bin\Python\scripts\propy.bat" Multiprocess_Sample.py 参考となるブログやWebサイト ・Using Arcpy with multiprocessing – Part 1 ・Using Arcpy with multiprocessing – Part 2 ・Using Arcpy with multiprocessing – Part 3 ・Python Multiprocessing – Approaches and Considerations(2011年8月:ArcGIS 10.0 環境) ・Multiprocessing with ArcGIS – Approaches and Considerations (Part 1)(2012年9月:ArcGIS 10.1 環境) ・ペンシルバニア州立大学の John A. Dutton eラーニング研究所のマテリアル GEOG 489 - Advanced Python Programming for GIS - 1.6.6 ArcPy multiprocessing examples 参考となる動画 ・Parallel Python: Multiprocessing with ArcPy(2017年3月のEsri Developer Summmit) ・Vector and Raster Multiprocessing with ArcPy(2018年3月のEsri Developer Summit)
... View more
01-24-2019
10:04 PM
|
0
|
0
|
3561
|
Title | Kudos | Posted |
---|---|---|
1 | 11-20-2020 08:47 PM | |
3 | 12-07-2018 10:42 PM | |
1 | 08-27-2019 10:56 PM | |
1 | 12-04-2018 09:45 PM | |
1 | 08-30-2018 11:28 PM |
Online Status |
Offline
|
Date Last Visited |
11-26-2023
11:43 PM
|