DOC
|
はじめに Esri社では、ネイティブ アプリを開発するための SDK として、 ArcGIS Runtime SDK を提供しています。過去に、 GeoNet ではこの ArcGIS Runtime SDK について「地図×モバイル アプリ開発」、「デスクトップ地図アプリ開発」シリーズを連載してきました。これらのシリーズでは、 ArcGIS Runtime SDK の特長や、地図アプリの基礎となる機能について紹介しております。本シリーズでは、 ArcGIS Runtime SDK の特長の 1 つである、オフラインマップを開発したい方向けに ArcGIS Runtime SDK で実現できるオフラインのワークフローについて紹介したいと思います。 本シリーズでオフラインワークフロー、データの準備、コードのポイントについて学んでいただき、オフラインアプリの開発を始める方の第一歩として役立てていただければと思います。 ArcGIS Runtime SDK を使って開発する際には、ガイドやサンプル、 API リファレンスなど多くのリソースが提供されているので併せて参照ください。 シリーズの内容は以下を予定しています。 ArcGIS Runtime SDK で実現できるオフラインワークフロー ~概要編~ ArcGIS Runtime SDK で実現できるオフラインワークフロー ~デスクトップ パターン~ ArcGIS Runtime SDK で実現できるオフラインワークフロー ~サービス パターン~ 第 1 弾では、オフラインワークフローの 2 つのパターンについて紹介し、それぞれのパターンとデータの 特徴について学んでいただきます。 オフラインを実現するための 2 つのワークフロー パターン オフラインで地図を閲覧したり、編集をしたり、解析をするためには、オフラインで活用するためのデータを準備する必要があります。そのデータをどのように準備するか、また、ネットワークの接続状態、業務での活用用途によってオフラインを実現するためのワークフロー パターンが異なります。以下で、オフラインを実現するための 2 つのワークフローについて紹介します。 ① サービス パターン ArcGIS Online や ArcGIS Enterprise といった Web GIS に公開した Web マップを使って必要な時に必要な範囲のデータをダウンロードして使用する編集や編集内容の同期も可能なパターンです。 このパターンの特徴は、要求に応じて特定のマップ、レイヤー、データをデバイスにダウンロードできるアプリを構築することができることです。ユーザーはオフラインでデータを編集したり、ネットワークに再接続した際に他のユーザーと編集内容を同期・共有したりすることができます。 Web GIS からダウンロードする地図データは、オンラインのマップから必要なエリアとデータを切り出してオフライン アプリで使用する 形式になっており、以下のようなイメージとなります。 上記のようなオフライン環境で利用する地図データは次の 2 つの方法で作成することができます。 オンデマンド オフライン アプリの利用者は、必要な時に必要な範囲のエリアを指定してデータをダウンロードできます。 プレプラン オンデマンドとは異なり、マップの作成者が事前にオフラインで必要なエリアのデータをパッケージ化することができます(作成したデータはWeb GIS 内に格納されます)。そのため、オフラインデータが必要な際にかかるダウンロード時間を短縮することができます。 ② デスクトップ パターン ArcGIS のデスクトップ製品 の ArcGIS Pro を使用して地図データや住所検索・ルート検索のもととなるデータなどを作成します。作成したデータを端末にコピーして使用する読み取り専用のパターンです。 このパターンの特徴は、 ArcGIS Pro を使用して、オフラインでも持ち運び可能なモバイル マップ パッケージやモバイル シーン パッケージを作成することができ、一度データを準備し、デバイスに直接コピーするだけで済むことです。デスクトップ パターンは、データが静的で変更が少ない場合に適しています。このコンテンツには、フィーチャ、表形式データ、タイル キャッシュ、ルート検索のためのネットワーク データセット、ロケーターなどを含めることができ、 1 つのモバイル マップ パッケージまたはモバイル シーン パッケージ ファイルにパッケージ化することができます。 Topic 読み取り専用データ ( モバイル マップ パッケージやモバイル シーン パッケージ ) に加えて、シェープファイルや GeoPackage など、別途ファイルとしてデータを保持することによりデータの編集を行うことができます。 ※別ファイルで保持するデータの編集を行うためには Standard ライセンス以上が必要です。 データの特徴 上記で 2 つのワークフロー パターンについて紹介しました。 次に、各パターンで登場したデータ (オンデマンド、プレプラン、モバイル マップ パッケージ、モバイル シーン パッケージ) についてそれぞれの 特徴を表で紹介します。 ※以下は 2020 年 7 月 14 日現在の情報 機能 サービス パターン デスクトップ パターン プレプラン マップ オンデマンド マップ モバイル マップ パッケージ ( ArcGIS Pro ) モバイル シーン パッケージ ( ArcGIS Pro ) レイヤーの表示 識別、分析 〇 〇 〇 〇 データの編集 〇 〇 × × 編集データの同期 〇 〇 × × ユーザー間でのオフラインマップの共有 〇 × × × 定期的なオンラインデータ更新を受信 〇 × × × ジオコーディング × × 〇 〇 ルーティング × × 〇 〇 ラスター レイヤー × × 〇 〇 テーブル データ × × 〇 〇 まとめ いかがでしたでしょうか。今回は、 ArcGIS Runtime SDK を使って実現できるオフライン ワークフローについて説明しました。データの編集や、チームでの共有が必要な場合はサービス パターン、扱うデータが静的なものであればパッケージを作成してデスクトップ パターンでオフライン アプリを実現することができます。次回の連載では、今回紹介した、デスクトップ パターンを実現するための、データの準備方法、ポイントとなるコードについて紹介します。 次回 ArcGIS Runtime SDK で実現できるオフラインワークフロー ~デスクトップ パターン~ 関連リンク ・ ArcGIS 関連ページ ・ ArcGIS Runtime SDK for .NET (ESRI ジャパン製品ページ ) ・ ArcGIS for Developers (ESRI ジャパン製品ページ ) ・ ArcGIS Online (ESRI ジャパン製品ページ ) ・ ArcGIS Enterprise (ESRI ジャパン製品ページ ) ・ ArcGIS for Developer 開発リソース集 ・ ArcGIS Runtime SDK for .NET ( 米国 Esri ページ ( 英語 ) ) ・シリーズブログ関連ページ ・ 地図×モバイル アプリ開発③ ~ネイティブ アプリ開発編~ ・ デスクトップ地図アプリ開発 シリーズ
... View more
07-13-2020
10:37 PM
|
0
|
0
|
498
|
DOC
|
1. はじめに この記事は、 [ 続編 はじめての Web マッピングアプリケーション開発 ] のシリーズ記事として、はじめて地図アプリの開発を行う開発者の方に向けて、ウィジェットを使ったアプリ開発についてシリーズで紹介しています。 続編 はじめてのWeb マッピングアプリケーション開発:ウィジェット編 続編 はじめての Web マッピングアプリケーション開発:印刷ウィジェット編 続編 はじめての Web マッピングアプリケーション開発:編集ウィジェット編 続編 はじめての Web マッピングアプリケーション開発:ナビゲーション ウィジェット編 続編 はじめてのWeb マッピングアプリケーション開発:OAuth 2.0編 前回の記事では、印刷機能を実装するうえで、便利な 印刷ウィジ ェ ット を紹介しました。今回は、手軽に編集機能を実装できる編集ウィジェットを紹介いたします。 これまでの記事と同様に、ソースコードは ESRI ジャパンの GitHub で公開していますので、ご覧ください。 Web アプリ開発の実行環境をお持ちでない方は、 JSBin を使用して、 Web ブラウザー上でコードの入力・編集、アプリの実行を試すこともできます。 2. 編集ウィジェット とは 編集ウィジェットとは、シリーズ最初の ウィジェット編の記事 で紹介した、 ArcGIS API for JavaScript が提供する UI コンポーネント群の一つです。 マップは、背景となるベースマップ、現実世界にある建物や道路など表すフィーチャ レイヤーとそれに付随する属性情報 ( 施設用途、道路幅等 ) などによって構成されています。 マップを利用するユーザーは業務や目的に応じてマップに表示されているフィーチャに対して、属性の追加、変更をしたり、また、新規フィーチャの追加をするなど 、可視化されているデータを編集する ことがあると 思います。そんな時に使うのが編集機能です。 ArcGIS API for JavaScript で提供されている編集ウィジェットを使えば、数行のコードで編集機能を GIS アプリケーションに実装することができ、フィーチャの更新、削除、追加を簡単に実現することができます。 2-1. ウィジェットの実装 編集ウィジェットの実装は前回の記事で紹介した方法とほとんど変わりません。 ① Editor モジュールの追加 ※前回の記事、 印刷ウィジェット編 で作成したコードに編集ウィジェットを追加していきます。 初めに、 require ステートメントで Editor を追加します。 require([
"esri/Map",
"esri/views/MapView",
"esri/widgets/Search",
"esri/widgets/BasemapGallery",
"esri/widgets/Print",
"esri/widgets/Expand",
"esri/widgets/Editor"
], function(Map, MapView, Search, BasemapGallery, Print, Expand, Editor) {
② Editor ウィジェットの作成 require で追加した Editor モジュールを使用して、Editor クラスから Editor オブジェクトを作成します。Editor オブジェクトの View プロパティに View を設定します。 /************************************************************
* 省略
************************************************************/
// Editor ウィジェット
var editor = new Editor({
view: view
});
③ Expand ウィジェットに追加 前回の記事でも紹介しましたが、 Expand ウィジェットを活用することによってスマートな地図アプリを作成することができるので、今回作成する Editor ウィジェットも Expand ウィジェットに追加します。 /************************************************************
* 省略
************************************************************/
View.when(function() {
View.ui.add(createExpandWidgets([search, basemapGallery, print, editor]), ‘top-right’);
});
function createExpandWidgets(widgets){
return widgets.map(widget => new Expand({
view: view,
content: widget,
expanded: false,
group: ‘top-right’
}))
}
2-2. 編集用のレイヤーを追加 編集ウィジェットの機能を確認するために、マップにレイヤーを追加します。 レイヤーの追加については、この記事ではあまり深く説明しませんが、「 はじめてのWeb マッピングアプリケーション開発:レイヤー表示編 」のステップ 1 ~ 4 で紹介していますのでご参照ください。記事ではなくコードを参照したい方は、 ESRI ジャパンの GitHub の前回の記事のコード をご参照ください。 ① FeatureLayer モジュールの追加 require([
"esri/Map",
"esri/views/MapView",
"esri/layers/FeatureLayer",
"esri/widgets/Search",
"esri/widgets/BasemapGallery",
"esri/widgets/Print",
"esri/widgets/Expand",
"esri/widgets/Editor"
], function(Map, MapView, FeatureLayer, Search, BasemapGallery, Print, Expand, Editor) {
② FeatureLayer の作成 var featurelayer = new FeatureLayer({
url:"https://services.arcgis.com/wlVTGRSYTzAbjjiC/arcgis/rest/services/tree_inspection/FeatureServer/1"
});
③ map に FeatureLayer を追加 map.add(featurelayer); 3. 編集ウィジェットの使い方と機能 編集ウィジェットでは、フィーチャの編集とフィーチャの追加を行う機能が用意されています。 フィーチャを編集する場合は、フィーチャの編集を押下した後、編集を行いたい対象のフィーチャをマップで選択するとフィーチャに付随する属性の情報がウィンドウに表示されます。 この機能を使って、フィーチャの削除や、データの更新を行うことができます。 フィーチャを追加する場合は、フィーチャの追加を押下した後、追加するフィーチャの種類をウィンドウから選択して、マップ上の任意の場所をクリックすると、新しいフィーチャが追加されます。 この機能を使って、新しいフィーチャを追加することができます。 4. その他の編集ウィジェット 今回使用した Editor ウィジェットは編集に必要な汎用的機能が提供されていましたが、他にも属性の入力に特化した FeatureForm ウィジェットや、テンプレート表示や値のレンダリングを行うことができる FeatureTemplates ウィジェットなどが用意されています。 ● FeatureFome ウィジェット フィーチャの属性情報に基づいて入力フィールドを表示するフィーチャ フォーム ウィジェットです。 ● FeatureTemplate ウィジェット フィーチャ レイヤーに定義されたテンプレートを表示するフィーチャ テンプレート ウィジェットでテンプレートを表示するだけでなく、値をフィルタリングしたり、グループ化したりすることが可能です。 5. まとめ 今回は編集機能を手軽に実装できる編集ウィジェットを紹介しました。編集ウィジェットを使えばたった数行のコードで、汎用的に使える編集機能を実装できます。簡単に紹介したウィジェットも含めて、目的に合ったものをご活用ください。 今回作成したサンプルは以下で動作を確認することも可能です。 ● 編集ウィジェット:https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/widget-editor/widget-editor.html 次回はルーティング機能を実装する上で便利な、ナビゲーションウィジェットについてご紹介します。 6. さいごに 今回の記事では紹介しませんでしたが、フィーチャの編集以外にも、 図形の作成・編集が行える Sketch ウィジェットが用意されています。 ● Sketch ウィジェット MapView に点、線、面などのグラフィック要素を描画することが可能なスケッチ ウィジェットで新規にグラフィック要素を作成できるほか、既存のグラフィック要素を更新することも可能です。 そのほかにも、ESRIジャパンの ArcGIS API for JavaScript の機能紹介ページや ArcGIS for Developers に公開されている サンプルコードでもたくさんのウィジェットが紹介されているので、動作の確認やアプリケーションの実装にお役立てください。 7. 関連リンク ● はじめての Web マッピングアプリケーション開発 はじめての Web マッピングアプリケーション開発:地図表示編 はじめてのWeb マッピングアプリケーション開発:レイヤー表示編 はじめての Web マッピングアプリケーション開発:レイヤーの可視化編 はじめての Web マッピングアプリケーション開発:ポップアップの設定編 はじめての Web マッピングアプリケーション開発:Web マップの作成・表示編 はじめてのWeb マッピングアプリケーション開発:グラフィック編 はじめてのWeb マッピングアプリケーション開発:クエリ編 続編 はじめての Web マッピングアプリケーション開発:ウィジェット シリーズ編 続編 はじめての Web マッピングアプリケーション開発:印刷ウィジェット編 ● ArcGIS API for JavaScript ● ArcGIS for Developer 開発リソース集
... View more
04-07-2020
09:16 PM
|
0
|
0
|
476
|
DOC
|
※ この記事は、米国 Esri 社のブログ記事 「 How to map New York Times coronavirus time series data in ArcGIS Pro 」 を翻訳したものです。 ニューヨーク・タイムズ紙は、 2020 年 1 月 21 日にワシントン州で最初の流行が発生して以来、州や郡 ( 郡は 州 の下位行政区分 ) レベルで米国内のコロナウイルス症例の累積カウントを集計しています。同社が作成した GitHubページ にも記載されていますが、彼らは研究者,科学者,政府関係者がパンデミックの拡大をより理解するように、この時系列データを公開することを決めました。この github リポジトリは毎日更新され、また、各郡ごとの毎日のコロナウイルスの症例数のレコードを格納しています。公開している(CSVフォーマットの) テーブルは (https://github.com/nytimes/covid-19-data/blob/master/us-counties.csv) で確認いただけますが、各レコード (行) は、ある日の1つの郡での数を表しています。これにより、このデータを使用することで、米国内でのコロナウイルス発生の拡大状況を ArcGIS Pro を使用して簡単に確認することができます。 必要な作業は以下1~3です。 データをダウンロードして FGDB にコピーします 米国郡のポリゴンレイヤーに「 1 」でコピーした表を結合します タイムスライダーを使用して毎日の変化を表示します。 時系列データのダウンロード ArcGIS Online から次の python スクリプトをダウンロードします。 https://www.arcgis.com/home/item.html?id=b42b1e3daf96457b804a1246ee3d4a10 Zipを解凍し、テキストエディタで UpdateNYTimesCovid19TimeSeries.py を開きます。 9行目から 11 行目までの 3 つの変数の値を変更します。詳細は以下に記載します。 (a) csvファイルのダウンロード先 (b) ファイル ジオデータベース、またはエンタープライズ ジオデータベースの .sde 接続ファイルへのフルパス (c) 出力テーブルの名前 ファイルを保存します。 Python IDLE 、 Visual Studio Code などのツールを使用するか、コマンド ラインから直接スクリプトを実行します。 このスクリプトを実行するには、 ArcGIS Pro がインストールされている必要があります。 Windows のコマンドラインから実行する手順は以下の通りです。 ArcGIS Pro がインストールされているマシンで Windows コマンド プロンプトを開きます。 python フォルダに移動します。 cd C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3 このパスはArcGIS Pro のデフォルトインストール先です。別の場所にインストールした場合は、パスを変更してください。 コマンドプロンプトに入力 Python "<Python_scriptを保存した場所 >\更新したスクリプトファイル" と入力して Enter キーを押します。 数秒後、時系列 csv ファイルがダウンロードされ、出力先の ジオデータベースに テーブルとしてコピーされます。 米国の郡 のデータは以下からダウンロードします。 https://www.arcgis.com/home/item.html?id=53935d5d1c8540539d290072fcda77c1 「 10 」と同じジオデータベースに米国の郡のデータをコピーします(同じジオデータベースに格納すると描画パフォーマンスが向上します)。 米国の郡レイヤーと時系列テーブルを結合 ArcGIS Pro を開き、 マップを挿入 します。 米国の郡ポリゴン レイヤーと時系列テーブル の両方を 追加 します。 [ コンテンツ ] ペインから [NY Times Covid-19 Counties] レイヤー を選択します。 [ フィーチャー レイヤー ] タブグループ の [ データ ] タブの [ リレーションシップ ] グループの [ 結合 ] メニューで [ 結合 ] をクリックします。 以下 の値を、ジオプロセシングツールに入力します。 ・[レイヤー名、またはテーブルビュー]: NY Times Covid-19 Counties ・[ レイヤー、テーブルビューのキーとなるフィールド]: FIPS ・[ 結合テーブル]: NY Times Covid-19 Time Series Cases ・[ 結合テーブルのキーとなるフィールド]: FIPS [ 実行 ] をクリックします。 これらのデータは1:Nの関係性になっていて、 各郡のポリゴンに対して、時系列テーブルに 1 つ以上のレコードがあります。 例えば、ロサンゼルス郡をクリックすると、ポップアップウィンドウに1つ以上のレコードが表示されます。 適切な郡のシンボル設定 をします。 タイムスライダーを使って変化を可視化 右クリックのコンテキストメニューから「プロパティ」を選択して、「 NY Times Covid-19 Counties 」レイヤー のプロパティページを開きます。 時間タブに切り替えます。 「レイヤーの時間」項目から「各フィーチャに一つの時間項目があります」を選択します。 「時間フィールド」に「 date 」項目を設定します。 データは毎日更新されるので 、「ライブフィードデータ」をチェックします。 OK をクリックします。 タイムスライダーが表示されます。 [ マップ ] タブグループの [ 時間 ] タブの [ 表示 ] グループで [ 時間の有効化 ] をクリックします。 [ 現在の時間 ] グループで、開始を 20201/20 に、間隔を 1 日に設定します。 同じグループで、開始の除外をクリックすると、 1 日分のデータのみが表示されます - この場合、 2020 年 1 月 21 日分のデータのみが表示されます。開始の除外を設定していない場合、マップには 1 月 20 日と 21 日の両方のデータが表示されます。 [ 再生]グループから [ 再生 ] をクリックすると、時間を通してアニメーション化し、日々の変化を見ることができます。 結果 Kenneth Field 氏 は コロナウイルスのデータを 3D で見ることにあまり積極的ではないかもしれませんが、 3D データを使用することでパンデミックがどのように拡大したかをより簡単に確認することができるかと思います。 2月と3月第 1 週の変化を示す結果 パンデミックが郡全体に広がっただけでなく、感染者数が何倍にも増加していることがはっきりとわかります。そして、この変化をチャートで確認することができます。 時系列チャートの可視化 チャートを使用すると、さまざまな視点から結果を見ることができます。 ArcGIS Pro のチャート を使用して、時系列表から以下のようなチャートを作成することができます。 データを更新し続ける方法 ニューヨーク・タイムズは、この時系列データセットの日次更新に尽力しています。 データの更新は 1 日 1 回のため、手動で python スクリプトを実行するか、またはタスクスケジューラを使用してデータを定期更新することができます。 Windows のタスクスケジューラを開きます 。 左ペインのタスクスケジューラ ライブラリを右クリックし、「基本タスクの作成」を選択します。 ウィザードに従って名前を付け、トリガーを設定し、操作のセクションでプログラムの開始を選択します。 参照 ... ボタンをクリックして python の実行ファイルを選択します。 C:\Program Files\ArcGIS\Pro\bin\Python\envs\arcgispro-py3. 引数の追加 ( オプション ) テキストボックスに、 ( 時系列データのダウンロード ) でダウンロードした python スクリプトのフルパスを入力してください。 ログオンしていなくてもこのタスクを実行させたい場合は、 [ 完了 ] ボックスをクリックしたときにこのタスクのプロパティダイアログを開くにチェックを入れてください。 完了をクリックします。 タスクのプロパティダイアログを開きます。 ユーザーがログオンしているかどうかにかかわらず を選択します。 オプションで、資格情報を保存するかどうかを選択します。 OK をクリックします。 タスクスケジューラーの設定画面 Q:このデータを共有することは可能でしょうか? A: はい。オンプレミスの ArcGIS Enterprise にマップ イメージ レイヤーとしてマップを共有することができます ( マップ サービスとして公開することもできます ) 。ただし、いくつか の注意点があります。 サービスを公開する際に、「登録済みデータを参照」オプションを選択する必要があります。 「すべてのデータをコピー」 を選択した場合は、データを更新するたびにサービスを再公開する必要があります 。 ArGIS Online へサービスを公開する場合は、データをコピーしてサービスを公開するため、データを更新するたびにサービスを再公開する必要があります。 参考情報 ・アメリカ合衆国の地方行政区分
... View more
04-07-2020
06:40 PM
|
0
|
0
|
1377
|
DOC
|
はじめに 以前、GeoNet ブログで 2019/8/23 (金) に弊社永田町オフィスにて開催した「 ArcGIS 開発者のための最新アプリ開発塾 2019 」のハンズオン資料を公開しました。 その中には、米国 Esri社が、開発者向けにオープンソースとして提供している、Open Source Apps の中から「 Data Collection for .NET 」というデータ収集アプリを活用して行った 「 ArcGIS_プラットフォームを活用した街路樹調査アプリケーション構築までのハンズオン 」の情報も含まれています。 ※「 ArcGIS_プラットフォームを活用した街路樹調査アプリケーション構築までのハンズオン 」 で予習しておくと、本シリーズをよりスムーズに理解できると思います。 今回は、そのハンズオンで活用した、「 Data Collection for .NET 」アプリが持つ主要な機能について解説を行い、前半 / 後半 2 回にわたりご紹介したいと思います。 Data Collection for .NET の機能 まず、機能をご紹介する前に、このアプリは ArcGIS Online / ArcGIS Enterprise (Portal for ArcGIS) に公開されている Web マップとデータセットを使用して、オンラインや、オフラインの状態でデータの収集 を行うことができる汎用的なアプリです。ArcGIS for Developers のアカウント をお持ちであれば、独自の Web マップとデータセットを使用してご自身の環境で試すことができると思いますので、お試しいただければと思います。 ※今回ご紹介するアプリを試す場合は、ArcGIS Developer Subscription の無償の Essentials でも可能です。アプリのご利用方法についてはアプリ起動までの手順をご覧ください。 このアプリが持つ主要 な機能は以下の4つになります。 1. 認証 2. オフラインデータの作成 3. (オフライン)データの編集 4. オフラインデータとオンライン データの同期 前半では 1. 認証、 2. オフラインデータの作成 について機能の解説を行います。 1. 認証 下のイメージでは、アプリを起動して ArcGIS Online へログインを行っています。 このアプリでは、ArcGIS の指定ユーザーアカウントを利用して、ログイン認証を行うことで保護されたリソース (アクセス範囲が限定された Web マップなど) にアクセスして利用することができます。 以下のイメージは、認証の流れになります。 1. 保護されたリソースに対して要求が行われます。 2. ポータルは不正アクセスエラーで応答します。 3. チャレンジハンドラー* に 、ポータルの認証に必要な情報を要求します。 4. ユーザー認証 UI が表示され、ユーザーはユーザー名とパスワードの入力を求められます。 5. ユーザーが正常に認証されると、保護されたリソース へトークンを使ってアクセス要求します。 6. ポータルはトークンを保管し、 保護されたリソース に対するすべての要求に応答します。 * チャレンジハンドラー は保護されたリソースにアクセス要求した場合に、アクセスに必要なトークンを自動で作成したり、あらかじめサーバに設定した認証方法に従ってログイン情報を要求する仕組みです。 上記の認証は、アプリの起動処理時に「 AuthenticationManager 」クラスを使用することで実現することができます。 AuthenticationManager による ChallengeHandler の実装 AuthenticationManager は、アプリの起動時に設定を行い、チャレンジハンドラー を作成します。以下コードでチャレンジハンドラーを作成しています。 ※ ソースファイル: DataCollection.Shared\ViewModels\AuthViewModel.cs // Define the server information for ArcGIS Online var portalServerInfo = new ServerInfo { ServerUri = new Uri ( _arcGISOnlineURL ) , TokenAuthenticationType = TokenAuthenticationType . OAuthAuthorizationCode , OAuthClientInfo = new OAuthClientInfo { ClientId = _appClientID , RedirectUri = new Uri ( _redirectURL ) } , } ; // Register the ArcGIS Online server information with the AuthenticationManager Security . AuthenticationManager . Current . RegisterServer ( portalServerInfo ) ; // Create a new ChallengeHandler that uses a method in this class to challenge for credentials Security . AuthenticationManager . Current . ChallengeHandler = new ChallengeHandler ( CreateCredentialAsync ) ; 認証に失敗するとあらかじめ設定しておいたリダイレクト URL を使用してユーザー認証 UI を表示します。以下コードでリダイレクト URL を取得しています。 ※ ソースファイル: DataCollection.WPF\ViewModels\LoginWindowViewModel.cs public Task < IDictionary < string , string > > AuthorizeAsync ( Uri serviceUri , Uri authorizeUri , Uri callbackUri ) { if ( _tcs ? . Task . IsCompleted == false ) throw new Exception ( "Task in progress" ) ; _tcs = new TaskCompletionSource < IDictionary < string , string > > ( ) ; // Store the authorization and redirect URLs WebAddress = authorizeUri ; _callbackUrl = callbackUri . AbsoluteUri ; // Return the task associated with the TaskCompletionSource return _tcs . Task ; } ユーザーが正常に認証されると、トークンを使って保護されたリソースに再度アクセス要求を行います。 ※チャレンジハンドラーを使った認証のコードサンプルもあるので詳しくはこちらをご覧ください。 2. オフラインデータの作成 以下のイメージでは、Web マップからオフラインマップをダウンロードしています。 このアプリでは、現在の表示範囲からオフラインで使用するマップを切り出して作成することができます。 オフラインマップの作成は 「 GenerateOfflineMapJob 」 クラスを使用することで実現することができます。 GenerateOfflineMapJob によるオフラインマップ作成 オフラインマップ を作成する前に、オフラインにしたい範囲をマップ上で指定する必要があります。範囲指定後に GenerateOfflineMapJob を実行するのに必要なパラメータが作成されます。 パラメータの詳細は以下に記載します。 ※ ソースファイル: DataCollection.Shared\ViewModels\DownloadViewModel.cs private async Task DownloadPackageAsync ( Envelope extent ) { // ... // set extent based on screen var parameters = await syncTask . CreateDefaultGenerateOfflineMapParametersAsync ( extent ) ; // retrieve only records related to the features being taken offline parameters . DestinationTableRowFilter = DestinationTableRowFilter . RelatedOnly ; // set the job to generate the offline map GenerateOfflineMapJob = syncTask . GenerateOfflineMap ( parameters , DownloadPath ) ; // ... } パラメータ ・Extent ⇒ 表示範囲 (Map View の Extent) ・Downloadpath ⇒ ユーザーが指定する保存先フォルダ オフラインマップのダウンロードに成功すると、保存先のフォルダにモバイル マップ パッケージ (*.mmpk) としてデータが保存されます。 まとめ いかがでしたでしょうか。本記事では、Data Collection for .NET に実装されている「 認証 」 や 「 オフラインデータの作成 」 について簡単ですが、機能の解説を行いました。 Web マップを活用してオフラインで使用するアプリの開発を行う際には、本記事の内容を参考にしていただければと思います。また、Data Collection for .NET は 参照するWeb マップを変更するだけで、汎用的にご利用いただけますので、現在業務でお使いのデータでアプリを使用してみてください。 次回 次回は 3.(オフライン)データの編集、4.オフラインデータとオンラインデータの同期 について解説を行います。 関連リンク Data Collection Data Collection .NET (GitHub) Data Collection iOS (GitHub) ArcGIS Runtime SDK for .NET (ArcGIS for Developers) ArcGIS for Developer 開発リソース集
... View more
02-13-2020
08:55 PM
|
0
|
0
|
540
|
DOC
|
はじめに 2019/9/13 (金 ) に ArcGIS Pro SDK for .NET (以下 Pro SDK) を使用してアドイン拡張を学ぶためのハンズオン資料、そのハンズオンで使用するソース コードとデータを公開しました。 このハンズオンは、 独力での開発を行う手助けとなるような構成になっており、その中で 皆様に理解いただきたいポイントは以下の 2 つです。 開発手法の理解 開発時に参照する情報の把握 本記事では、今後、「 Pro SDK を使用した機能開発」というシリーズでの連載をはじめるにあたり、ハンズオン資料に含まれている、次についてご紹介したいと思います※。 Pro SDK が提供している API の構成 Pro SDK の使い方を調べるために有用なリソースの情報 ※ Pro SDK を使用するための基礎となる内容が盛り込まれていますので、予習しておくと、次からのシリーズ連載の理解がよりスムーズにできると思います。 ハンズオンの概要 ハンズオンの内容は大きく 2 つに分かれています。 前半: ArcGIS Pro SDK for .NET のコアコンセプトについて 後半: ArcGIS Pro SDK for .NET を用いた開発について 前半のコアコンセプトについては、 Pro SDK の概要、 API の構成、提供しているテンプレートや、実装方法など開発手法を理解するための情報について記述されています。 そして、後半の開発についてでは、 API の構成に含まれるカテゴリ ごとの使い方や実装方法、参照すべき情報について解説しています。 この、前半、後半を通して、とても大切なものが API の構成、 API を理解するためのリソースです。 今回はこの API の構成やリソースについて説明します。 Pro SDK が提供している API の構成 図:Pro SDK を構成する各API のイメージ Pro SDK は ArcGIS Pro の機能を操作するための API がコンセプトごとにカテゴリ分けされて構成されており、 API を通じて各カテゴリの要素や機能操作、制御などを行います。 例えば、「レイアウト」カテゴリの API では ArcGIS Pro のレイアウト機能に関する制御を行うクラスやメソッドを提供しており、「編集」カテゴリの API では地理空間データの作成や編集機能を提供しています。このように、 ArcGIS Pro の各機能に対して API がカテゴリごとに構成されており、 API の使い方を理解するためのリソースもカテゴリごとに説明やサンプルが提供されています。 API の使い方を理解するためのリソース Pro SDK の API を理解するうえで、よく使用するリソースとして以下が提供されています ※。 API のコンセプト/スニペット (API のカテゴリごとに用途説明とスニペット) API のリファレンス (クラスやメソッドに関する情報) Community Samples (API のカテゴリごとに提供されているサンプルプログラムとデータ) ※ ハンズオン資料 P13~P16 に記載 リソースの使い方を一つ上げてみます。 例えば、マップ ビューに対してマウス クリックなどのイベントが発生した際にある特定の操作をしたい場合、 API のコンセプト / スニペット、マップ ビューのコンセプトは 「 Map Exploration 」を確認します。 ここでマップ ビューに対して、どのような操作が提供されているか、操作するための簡単なコードのスニペットを確認します。 次に、提供されているクラスやメソッドに対して、引数やオプションなどの細かい仕様を API リファレンスを使って確認します。 最後に Community Samples から「 Map Exploration 」のカテゴリで、提供されているサンプルツールを確認して、動作の確認などを行います。 まとめ ここまで、 API の構成や理解に必要なリソースについて説明しました。 Pro SDK を使った開発を行うにあたって、 API の構成とカテゴリごとのコンセプト、それを理解するためのリソースを把握することが独力で開発をするための一番の近道です。 今回ご紹介した、ハンズオン資料とハンズオン データを使って学習し、 Pro SDK の基礎を身につけましょう。そして、次のシリーズ「 Pro SDK を使用した機能開発」では、実際に API を活用した開発について、実装と解説を交えた記事を連載予定です。ぜひ、開発のステップアップとしてご覧いただければと思います。 なお、Pro SDK を使った開発の入門編にあたる記事「Pro SDK を使用した ArcGIS Pro の拡張」シリーズを以前、GeoNet で連載しました。こちらには、環境の構築から簡単なアドインの作成までの記事を連載していますので、これから Pro SDK を使った開発を始める方はご覧ください。 連載予定シリーズ 第1回:1-ArcGIS Pro SDK for .NET を使用した機能開発 ~マップとの対話的な操作その1~ 第2回:2-ArcGIS Pro SDK for .NET を使用した機能開発 ~マップとの対話的な操作その 2~ 第3回:3-ArcGIS Pro SDK for .NET を使用した機能開発 ~レンダラーの設定~ 第4回:4-ArcGIS Pro SDK for .NET を使用した機能開発 ~アノテーションの操作~ 第5回:5-ArcGIS Pro SDK for .NET を使用した機能開発 ~ジオメトリ変換~ 関連リンク ArcGIS Pro SDK for .NET を使用した ArcGIS Pro の拡張シリーズ ArcGIS Pro SDK for .NET ArcGIS Pro SDK for .NET コンセプト (GitHub) ArcGIS Pro SDK for .NET サンプル集 (GitHub) ArcGIS Pro SDK for .NET API リファレンス ArcGIS Pro SDK for .NET ハンズオン
... View more
11-07-2019
06:34 PM
|
0
|
0
|
853
|
DOC
|
はじめに 2019年 5 月 22 日 ( 水 ) ~ 24 日 ( 金 ) 、東京ミッドタウン 六本木にて第 15 回 GIS コミュニティフォーラム及びプレフォーラム・セミナーが開催されました! 公開可能なセッションの発表資料は ESRIジャパンのサポートサイトで公開しております。また、 GeoNet ブログでは開発者向けのセッションで使用したコードなどを順次ご紹介していきます。発表資料や GeoNet 記事、 GitHub へのリンクなどの詳細は第 15 回 GIS コミュニティフォーラム開催報告記事をご覧ください。 この記事は「ArcGIS ユーザーのためのデータハンドリング ~さまざまなデータ活用の第一歩~」セッションのスピンオフです。 概要 本編ではいくつかのデータを例に Python を活用したデータハンドリングの手法をご紹介しました。今回のブログでは、その中の、「ひと手間必要なデータ④」でご紹介した、気象庁が提供している XML電文 (震源・震度に関する情報) と予報区の GIS データをハンドリングしてマップに可視化する手法に、本編ではご紹介しきれなかった、 Web スクレイピング処理を加えた、一連の処理をご紹介します。 今回は、 Python を使って気象庁が提供している XML 電文を Web スクレイピング処理によって抽出、成型し、「予報区の GIS データ」から作成するポリゴン フィーチャと結合します。そして地震発生時点のフィーチャ クラスとして保存します。 次の流れでコードを解説します。 気象庁のサイトより XML の情報を取得 XML から必要な情報の抽出とポリゴン フィーチャの作成 抽出した情報とポリゴン フィーチャを結合 コードと解説 Tips:スクレイピング実施時の注意について Web ページ上の情報には著作権や利用規約が存在します。 また、過度なアクセスは Web サーバーに負荷をかけてしまうことになります。 スクレイピングを行う際は、あらかじめサービス側の規約で許可されているか確認の上ご対応お願いいたします。 1)気象庁のサイトより XML の情報を取得 まずは処理を実行するために必要なパッケージのインポートと変数を定義します。 本編で説明した、XML の操作を行うために必要な「xml.etree.ElementTree 」と GIS データを操作するために必要な「arcpy 」に加え、本編では使用しなかった「urllib.request 」をインポートします。 Urllib.request は URL への接続、ファイルの読込みに使用します。 import xml.etree.ElementTree as ET
import urllib.request
import arcpy
WORK_SPACE = r"D:\data\DemoProject\DemoProject.gdb"
SHAPE_FILE = r"D:\data\DemoProject\20190125_AreaForecastLocalE_GIS\地震情報/細分区域.shp" そして、「 urllib.request 」の機能を使用して 指定した URL ( http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml ) から XML データを取得し、「 xml.etree.ElementTree 」の機能を使用して 取得した情報から title タグが「震源・震度に関する情報」となっている情報のみを再抽出しています。 def load_xml():
"""
気象庁のサイトよりXMLの情報を取得する
"""
url = 'http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'
xml_string = download(url)
elem = ET.fromstring(xml_string)
target_dict = {}
atom_ns = 'http://www.w3.org/2005/Atom'
for e in elem.findall('.//{%s}entry' % atom_ns):
s_title = e.find('./{%s}title' % atom_ns).text
s_updated = e.find('./{%s}updated' % atom_ns).text
s_url = e.find('./{%s}link' % atom_ns).attrib
s_content = e.find('./{%s}content' % atom_ns).text
if s_title=='震源・震度に関する情報':
target_dict[s_content] = [s_url, s_updated]
# コンテンツごとのURLを作成
for key in target_dict.keys():
d = target_dict[key]
_url = d[0]['href']
_xml_string = download(_url)
#XML読込
read_xml(_xml_string)
def download(url):
"""
URL で指定したXMLを取得する
"""
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
xml_string = response.read()
return xml_string Tips : XML の名前空間について コード上で指定している「 atom_ns = 'http://www.w3.org/2005/Atom' 」は XML の名前空間です。 XML はタグを独自に作成することが魅力の一つですが、同一名のタグを作成することもできてしまうため、重複することもあります。そのため、 XML には " 名前空間 " という仕組みがあり、同一のタグ名でも名前空間が異なれば異なる要素として取り扱うことができます。 2)XML から必要な情報の抽出とポリゴン フィーチャの作成 XML ファイルから「地震発生時刻」と「震度」、「エリアコード」の情報を抽出しています。そして、「arcpy」の機能を使い、ジオプロセシングツールを使用して予報区の GIS データ (地震情報/細分区域.shp) から抽出した「地震発生時刻」の値を名称にポリゴン フィーチャを作成しています。 def read_xml(_xml_):
"""
XMLをパースします。Area要素内のCodeがフィーチャクラスに存在する場合、
MaxIntを使用してフィーチャクラスの震度カラムを更新します。
"""
elem = ET.fromstring(_xml_)
for elem in elem.iter():
if elem.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}OriginTime":
s_originTime = elem.text #地震発生時刻を取得
#フィーチャクラスの名前作成
outfc = arcpy.ValidateTableName("地震情報_" + s_originTime)
#フィーチャクラスの作成
create_flg = create_feature(outfc)
if create_flg == False:
break
if elem.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Pref":
for el in list(elem):
if el.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Area":
for e in list(el):
code = el.find("{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Code") #コード取得
maxInt = el.find("{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}MaxInt") #震度取得
update(maxInt.text, code.text, outfc) #フィーチャクラスの更新
def create_feature(outfc):
#ワークスペースにすでに同一名のフィーチャクラスがないかチェック
if arcpy.Exists(outfc):
return False
#Shapeファイルをフィーチャクラスに変換
arcpy.CopyFeatures_management(SHAPE_FILE, outfc)
#フィーチャクラスにカラム追加
arcpy.AddField_management(outfc, "震度", "Text")
#座標系変換
arcpy.DefineProjection_management(outfc, arcpy.SpatialReference(4612))
return True 3)抽出した情報とポリゴン フィーチャを結合 処理 2 )で抽出した「震度」と「エリアコード」の情報を「 arcpy 」のカーソル機能を使用して、ポリゴン フィーチャがもつエリアコードと紐づけを行い、該当するフィーチャに対して震度の情報を更新しています。 def update(maxInt, code, outfc):
"""
フィーチャクラスを更新します
"""
with arcpy.da.UpdateCursor(outfc,"震度", "code = %s" % "'" + code + "'") as cursor:
for row in cursor:
row[0] = maxInt #震度カラムを更新
cursor.updateRow(row) 全体コード これまで説明したコードを一つにまとめると以下のようなコードになります。 変数に指定しているデータをご自身の環境に合わせて変更していただければそのまま使用できます。 import xml.etree.ElementTree as ET
import urllib.request
import arcpy
WORK_SPACE = r"D:\data\DemoProject\DemoProject.gdb"
SHAPE_FILE = r"D:\data\DemoProject\20190125_AreaForecastLocalE_GIS\地震情報/細分区域.shp"
def read_xml(_xml_):
"""
XMLをパースします。Area要素内のCodeがフィーチャクラスに存在する場合、
MaxIntを使用してフィーチャクラスの震度カラムを更新します。
"""
elem = ET.fromstring(_xml_)
for elem in elem.iter():
if elem.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}OriginTime":
s_originTime = elem.text #地震発生時刻を取得
#フィーチャクラスの名前作成
outfc = arcpy.ValidateTableName("地震情報_" + s_originTime)
#フィーチャクラスの作成
create_flg = create_feature(outfc)
if create_flg == False:
break
if elem.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Pref":
for el in list(elem):
if el.tag == "{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Area":
for e in list(el):
code = el.find("{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}Code") #コード取得
maxInt = el.find("{http://xml.kishou.go.jp/jmaxml1/body/seismology1/}MaxInt") #震度取得
update(maxInt.text, code.text, outfc) #フィーチャクラスの更新
def create_feature(outfc):
#ワークスペースにすでに同一名のフィーチャクラスがないかチェック
if arcpy.Exists(outfc):
return False
#Shapeファイルをフィーチャクラスに変換
arcpy.CopyFeatures_management(SHAPE_FILE, outfc)
#フィーチャクラスにカラム追加
arcpy.AddField_management(outfc, "震度", "Text")
#座標系変換
arcpy.DefineProjection_management(outfc, arcpy.SpatialReference(4612))
return True
def update(maxInt, code, outfc):
"""
フィーチャクラスを更新します
"""
with arcpy.da.UpdateCursor(outfc, "震度", "code = %s" % "'" + code + "'") as cursor:
for row in cursor:
row[0] = maxInt #震度カラムを更新
cursor.updateRow(row)
def load_xml():
"""
気象庁のサイトよりXMLの情報を取得する
"""
url = 'http://www.data.jma.go.jp/developer/xml/feed/eqvol.xml'
xml_string = download(url)
elem = ET.fromstring(xml_string)
target_dict = {}
atom_ns = 'http://www.w3.org/2005/Atom'
for e in elem.findall('.//{%s}entry' % atom_ns):
s_title = e.find('./{%s}title' % atom_ns).text
s_updated = e.find('./{%s}updated' % atom_ns).text
s_url = e.find('./{%s}link' % atom_ns).attrib
s_content = e.find('./{%s}content' % atom_ns).text
if s_title=='震源・震度に関する情報':
target_dict[s_content] = [s_url, s_updated]
# コンテンツごとのURLを作成
for key in target_dict.keys():
d = target_dict[key]
_url = d[0]['href']
_xml_string = download(_url)
#XML読込
read_xml(_xml_string)
def download(url):
"""
URL で指定したXMLを取得する
"""
req = urllib.request.Request(url)
with urllib.request.urlopen(req) as response:
xml_string = response.read()
return xml_string
if __name__ == '__main__':
#ワークスペース指定
arcpy.env.workspace = WORK_SPACE
#XMLダウンロード
load_xml() コードを実行すると以下のような属性データを持つフィーチャ クラスのデータが作成されます 。 さいごに 今回のブログでは本編で語れなかった、スクレイピングの処理を追加したデータハンドリングをご紹介しました。 本記事でご紹介したコードは ESRIジャパンの GitHub でも公開しています。また、ハンドリングを行ったデータを使って Web GIS のデータに対する更新処理、タスクスケジューラーを使った定期更新の処理など、できることはたくさんあります。関連情報にも参考となる情報を記載いたしますので、 ArcGIS を活用した、今後のデータハンドリングにぜひお役立てください。 関連情報 Web GIS 用のフィーチャサービスの更新、定期更新 タスクスケジューラーの設定 気象庁オープンデータポータルサイト ESRIジャパンの GitHub 開発リソース集
... View more
06-13-2019
09:35 PM
|
1
|
0
|
719
|
DOC
|
はじめに この記事は ArcPy を使った処理の基本を紹介する「 Python を使って作業の効率化を図ろう!」のシリーズ記事です。 本シリーズ記事で使用するデータや関連資料は ESRI ジャパンの GitHub で公開していますので是非ご覧ください。 また、本シリーズ記事では ArcGIS Desktop (ArcMap) を利用しています。 前回の記事では、データの操作についてご紹介しました。 第 5 回目となる今回は、「独自のツール作成方法」です。 独自のツールについて まず、独自のツールとは「ツールボックス」のことです。 ArcGIS で作成できるツールボックスはカスタム ツールボックスと Python ツールボックス の 2 種類があり、それぞれに特徴がありますが、 今回はカスタム ツールボックスを例にご説明します。 また、今回カスタム ツールボックスに登録するスクリプトについては処理の内容を細かく説明はしませんが、 CSV ファイルからポイント フィーチャを作成し、マップに表示した後、 PDF ファイルとして出力するという内容になっています。 処理の説明や スクリプトにつきましては 冒頭でご説明いたしました ESRI ジャパンの GitHub をご覧いただき、本記事を読みながら一緒に作業をしていただければより理解が深まると思います。 それでは、ここからカスタム ツールボックスを作成する手順をご説明します。 カスタム ツールボックスの作成 カスタム ツールボックスは 3 つのステップで作成します。 スクリプトを作成 ArcMap を使ってカスタム ツールボックスの作成 カスタム ツールボックスにスクリプトを追加 以下よりステップに沿ってご説明します。 スクリプトを作成 今回は、 GitHub で公開しているスクリプト( create_report.py )を使います。 次のステップの準備として、 GitHub よりダウンロードしたデータ一式を C :ドライブ直下に配置して使用します。 ArcMap を使ってカスタム ツールボックスの作成 ArcMap を起動します。 カスタム ツールボックスは ArcMap のカタログ ウィンドウから作成します。 カタログ ウィンドウのフォルダ接続より先ほど配置した 「 data 」 フォルダを接続しておきます。 次に、「 data 」フォルダを右クリック > 新規作成 > ツールボックスを選択します。 ツールボックスが作成されるので、任意のツールボックス名を記述してください。 本記事では「 Toolbox.tbx 」という名称を付けます。 これで カスタム ツールボックスの作成は完了です。 次のステップでこのカスタム ツールボックスにスクリプトの登録を行い、ツールを完成させます。 カスタム ツールボックスにスクリプトを追加 次に、カスタム ツールボックスにスクリプトを追加します。 カタログ ウィンドウで「 Toolbox.tbx 」を右クリック > 追加 > スクリプトを選択します。 スクリプト追加のウィザードが起動します。 ウィザードに「名称」と「ラベル」を記述して [ 次へ ] ボタンを押下します。 ※本記事では名称・ラベルともに「 Print 」と入力しています。 スクリプト ファイルの選択では、「 data 」フォルダに格納されている「 create_report.py 」を選択し、 [ 次へ ] ボタンを押下します。 「表示名」と「データタイプ」にツールで使用するパラメータを定義し、 [ 完了 ] ボタンを押下します。 ※今回登録した「 create_report.py 」スクリプトでは CSV ファイルを入力値、 PDF ファイルの出力先を出力値として使用するため、 2 つのパラメータを定義しています。 これでカスタム ツールボックスに Print という名称でスクリプトが登録され、ツールの作成が完了です。 Print スクリプトをダブルクリックしてみます。 下記のような画面が表示されツールを使用することができます。 このツールは既存のジオプロセシングツールと同じように使用することができます。 おわりに 本記事では 独自のツール作成方法についてご紹介しました。 GitHub には ArcGIS Pro 用のスクリプトファイル (create_report_pro.py) もありますので ArcGIS Pro をご利用されている方はそちらを使用してカスタム ツールボックスを作成してみてください。 次回は、アドイン の作成方法についてご紹介します。 関連リンク ArcPy とは ArcPy 関数一覧 ArcPy クラス一覧
... View more
11-29-2018
06:00 PM
|
0
|
0
|
1530
|
DOC
|
はじめに この記事は ArcPy を使った処理の基本を紹介する「 Python を使って作業の効率化を図ろう!」のシリーズ記事です。本シリーズ記事で使用するデータや関連資料は ESRI ジャパンの GitHub で公開していますので是非ご覧ください。また、本シリーズ記事では ArcGIS Desktop (ArcMap) を対象としております。 前回の記事では、 ArcPy の基礎についてご紹介しました。 第 2 回目となる今回は「マップ・レイヤーの操作」についてご紹介します。 マップ ・ レイヤーの操作について 前回の記事でご紹介したように、マップを操作するためにはマッピング モジュールを使用します。 このマッピング モジュールを使用する上でまず覚えていただきたいことは、マップ ドキュメント、データ フレーム、レイヤーのオブジェクトの階層構造です。 下記の図に示した通り、マップ ドキュメント配下にデータ フレームが存在し、データ フレーム配下にレイヤーのリストが存在します。 その階層構造をたどってレイヤーのオブジェクトを取得し、いろいろな解析や地図表現を実施します。 それでは、このたどり方、「マップ ドキュメント」 > 「データ フレーム」 > 「レイヤー」という階層を念頭に置いていただきましたら、マッピング モジュールを使ったマップの操作方法をご紹介します。 マップ ドキュメントの参照 マッピング モジュールを使用してマップ ドキュメントを取得します。 前回のおさらいになりますが、マッピング モジュールを使用するには、 arcpy.mapping と記述して用途に合ったメソッドを記述します。 マップ ドキュメントを参照するには、 MapDocument 関数を使用することでオブジェクトの作成を行うことができます。 次の例は、 MapDocument 関数を使用して ArcMap で現在開いているマップ ドキュメントのオブジェクトを作成しています。 MapDocument 関数の使い方 # “CURRENT” キーワードを使用
Mxd = arcpy.mapping.MapDocument(“CURRENT”) MapDocument 関数はパラメータとして取得するマップ ドキュメント ファイルのパスを指定することで該当のマップ ドキュメントを参照することができます。 上記の例では、 MapDocument 関数のパラメータに CURRENT キーワードを使用して現在アクティブになっているマップ ドキュメントのオブジェクトを取得しています。 下記のような構成の場合は「 arcpy.mxd 」という名前のマップ ドキュメントが該当します。 データ フレームの参照 次に、データ フレームのオブジェクトの作成方法です。 データ フレームはマップ ドキュメントに含まれるレイヤーのコレクションです。 マップ ドキュメント オブジェクトから ListDataFrames 関数 を使用してデータ フレームのリストを取得することができます。 次の例は ListDataFrames 関数を使用してマップ ドキュメント オブジェクトからデータ フレーム オブジェクトのリストを作成しています。 ListDataFrames 関数の使い方 # 先ほど作成したマップ ドキュメント オブジェクトに含まれるデータ フレームのリスト
dfs = arcpy.mapping.ListDataFrames(mxd) ListDataFrames 関数はパラメータとしてマップ ドキュメント オブジェクトを指定することで該当のオブジェクトに含まれるデータ フレームのリストを取得することができます。下記のような構成の場合は「マップレイヤー」という名前のデータ フレームが該当します。 レイヤーの参照 次に、レイヤー オブジェクトの作成方法です。 レイヤーのリストは ListLayers 関数を使用して取得することができます。 次の例は、 ListLayers 関数を使用してデータ フレーム オブジェクトからレイヤー オブジェクトのリストを作成しています。 ListLayers 関数の使い方 # データ フレームに含まれるレイヤーの一覧を取得します。
Lyrs = arcpy.mapping.ListLayers(mxd, “”, dfs[0]) ListLayers 関数はパラメータとしてマップ ドキュメント オブジェクトとデータ フレーム オブジェクトを指定することで該当のオブジェクトに含まれるレイヤーのリストを取得することができます。 下記のような構成の場合は赤枠で囲んだレイヤーのリストが該当します。 レイヤーの操作 次は、レイヤー オブジェクトを使った操作です。 いままで、オブジェクトの参照方法についてご説明してきました。 ここでは、実際に取得したオブジェクトを使って操作を行ってみたいと思います。 先ほどの ListLayers 関数で作成したレイヤーのリストを使ってレイヤーの表示・非表示の切り替えを行ってみたいと思います。 次の例は、レイヤー オブジェクトの Visible プロパティの値を変更してすべてのレイヤーを非表示にしています。 Visible プロパティの設定 # 表示の場合は True
for lyr in lyrs:
lyr.visible = False
arcpy.RefreshTOC()
arcpy.RefreshActiveView() Visible プロパティはレイヤーの表示状態を制御するプロパティです。 ArcMap のコンテンツウィンドウでチェックボックスのオン・オフを切り替えた時と同じ動きをします。 ※プロパティの変更後にコンテンツ ウィンドウとマップ ビューを更新しています。 このようにマップ ドキュメントからの階層構造をたどって目的のレイヤーを取得して、地図表現の変更や解析に活用することができます。 次の節ではマッピング モジュールを使ったマップ ドキュメントの出力について簡単にご説明します。 マップ ドキュメントの出力 マッピング モジュールを使うと作成した地図をファイルとして出力したり、印刷することができます。 現在、表示しているマップを出力することもできますし、あらかじめ作成したフォーマットを使用したり、データ ドリブン ページ で指定した図郭ごとに出力することも可能です。 次の 2 つの例では、「現在表示しているマップを PDF ファイルとして出力」、「データ ドリブンで指定した図郭ごとに PDF ファイルとして出力」しています。 マッピング モジュールが持つ ExportToPDF 関数の使い方(現在表示しているマップを PDF ファイルとして出力) # すべてのオプションのデフォルト値を使用してページレイアウトを PDF 出力
arcpy.mapping.ExportToPDF(mxd, r”C:\data\output\Sample.pdf”) ExportToPDF 関数はパラメータとしてマップ ドキュメント オブジェクトと出力する PDF ファイルのフルパスを指定することでマップを出力することができます。 マップ ドキュメントが持つ dataDrivenPages クラスの ExportToPDF 関数の使い方(データ ドリブンで指定した図郭ごとに PDF ファイルとして出力) # データ ドリブン ページで指定した図郭をページとして、1 つの PDF へ出力
mxd = arcpy.mapping.MapDocument(“CURRENT”)
mxd.ataDrivenPages.exportToPDF(r”C:\data\output\DataDriven.pdf”) dataDrivenPages クラスの ExportToPDF 関数はパラメータに PDF ファイルのフルパスを指定することでマップ ドキュメントに設定されている図郭ごとにマップを出力することができます。 おわりに 本記事では ArcPy を使ったマップ・レイヤーの操作についてご紹介しました。次回は ArcPy を使ったジオプロセシングツールの操作とデータの操作についてご紹介します。 関連リンク ArcPy とは ArcPy 関数一覧 ArcPy クラス一覧
... View more
11-14-2018
09:57 PM
|
0
|
0
|
3340
|
DOC
|
はじめに この記事は、「 Pro SDK を使用した ArcGIS Pro の拡張」シリーズの第4弾の記事です。 当ブログシリーズでは、 ArcGIS Pro SDK ( 以下、 Pro SDK) を使用した ArcGIS Pro の拡張方法をご紹介していきます。 前回 の記事 では、 Pro SDK のアドインプロジェクトの構成についてご紹介しました。 第4弾では、第3弾の構成を使って、実際に Pro SDK での簡単なアドイン開発を行う流れをご紹介します。 アドイン開発と開発ステップ 今回この記事の中では ArcGIS Pro にドックパネルを追加し、ドックパネル内で選択したレイヤーにズームする機能をアドインとして開発します。 ※完成イメージ 次のステップに沿って、アドインの開発方法を紹介していきます。 アドインプロジェクト作成 UI 要素の作成 ロジックの実装 デバッグ実行 それではここからアドインの作成を行っていきます。なお、本記事で記載の開発環境は、 Visual Studio 2017 、 Pro SDK 2.2 を利用しています。 1. アドインプロジェクト作成 まず、 Visual Studio を起動して新規プロジェクトを作成します。 次に、 ArcGIS のグループから「 ArcGIS Pro モジュール アドイン」のテンプレートを選択し、 OK ボタンを押下します。 ※本記事では以下の設定によりプロジェクトを作成していますが、任意の設定で作成してください。 名前: ProAppModule1 場所: D:\workspace\ ソリューション名: ProAppModule1 下のイメージのようにプロジェクトが作成されればステップ1のアドインプロジェクト作成は完了です。 2. UI 要素の作成 次に、 Pro SDK が提供するテンプレートを使用して新しいドックパネルを作成します。 ソリューション エクスプローラーで作成したプロジェクトを右クリックし、「新しい項目の追加」を選択します。 ArcGIS のグループから「 ArcGIS Pro ドッキング _ ウィンドウ」を選択し、追加ボタンを押下します。 ※本記事では以下の設定により項目を追加していますが、任意の設定で追加してください。 名前: Dockpane1.xaml 下のイメージのように項目が追加されているはずです。 テンプレートを使用すると Dockpane1.xaml を継承した Dockpane1ViewModel.cs ファイルも自動で作成され、 MVVM モデルを考慮した要素も一緒に作成されます。 また、新しい項目を追加したことにより、 Config.daml ファイルにもコントロールの定義が自動で追記されます。 次に、 Dockpane1.xaml ファイルを開きます。 Dockpane1.xaml ファイルにレイヤーの一覧を表示するためのコンボボックスとズームボタンを実装します。 ※ Dockpane1.xaml < DockPanel LastChildFill ="true"> < Grid > < Grid.RowDefinitions > < RowDefinition Height ="100" /> < RowDefinition Height ="*" /> < RowDefinition Height ="100" /> </ Grid.RowDefinitions > < Grid Grid.Row ="0"> < Grid.ColumnDefinitions > < ColumnDefinition Width ="Auto" /> < ColumnDefinition Width ="*" /> </ Grid.ColumnDefinitions > <!-- レイヤー の一覧を表示するコンボボックスを定義 --> < TextBlock Grid.Column ="0" VerticalAlignment ="Center" Text =" レイヤー一覧 : " /> < ComboBox Grid.Column ="1" Height ="40" VerticalAlignment ="Center" ItemsSource ="{ Binding Layers }" SelectedItem ="{ Binding SelectedLayer , Mode =TwoWay}" /> </ Grid > <!-- ズームボタンを定義 --> < StackPanel Grid.Row ="2"> < Button Height ="50" Command ="{ Binding ZoomInCmd }" Content =" レイヤーにズーム " /> </ StackPanel > </ Grid > </ DockPanel > ここまでで、ステップ 2 の UI 要素の作成は完了です。 3. ロジックの実装 次に、レイヤーを選択してズームするために必要なロジックを実装していきます。 Dockpane1ViewModel.cs ファイルを開きます。 初めに、今回使用する以下の名前空間を追加します。 using System.Collections.ObjectModel; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Input; using ArcGIS.Desktop.Framework; using ArcGIS.Desktop.Framework.Contracts; using ArcGIS.Desktop.Framework.Threading.Tasks; using ArcGIS.Desktop.Mapping; using ArcGIS.Desktop.Mapping.Events; 次に、イニシャライズのメソッドを定義します。 ※ Dockpane1ViewModel クラス内に定義すること Map _activeMap; protected override Task InitializeAsync() { if (MapView.Active == null ) return Task.FromResult(0); _activeMap = MapView.Active.Map; return UpdateForActiveMap(); } xaml ファイルに定義したコンボボックス、ボタンにバインディングするプロパティを定義します。 ※ Dockpane1ViewModel クラス内に定義すること #region Bindable Properties // ズームボタンにバインドするコマンド public ICommand ZoomInCmd { get ; set ; } // コンボボックスにバインドするコレクション private ObservableCollection<BasicFeatureLayer> _layers = new ObservableCollection<BasicFeatureLayer>(); public ObservableCollection<BasicFeatureLayer> Layers { get { return _layers; } } // コンボボックスで現在選択しているもの private BasicFeatureLayer _selectedLayer; public BasicFeatureLayer SelectedLayer { get { return _selectedLayer; } set { SetProperty( ref _selectedLayer, value, () => SelectedLayer); if (_selectedLayer == null ) { FrameworkApplication.SetCurrentToolAsync( "esri_mapping_exploreTool" ); return ; } _selectedLayerInfos[_activeMap].SelectedLayer = _selectedLayer; SelectedLayerChanged(); } } #endregion プログラムで使用するメソッドを定義します。 ※ Dockpane1ViewModel クラス内に定義すること #region Private Methods // マップに何かしらの変化が起きた時の処理 private Task UpdateForActiveMap( bool activeMapChanged = true , Dictionary<MapMember, List< long >> mapSelection = null ) { return QueuedTask.Run(() => { SelectedLayerInfo selectedLayerInfo = null ; if (!_selectedLayerInfos.ContainsKey(_activeMap)) { selectedLayerInfo = new SelectedLayerInfo(); _selectedLayerInfos.Add(_activeMap, selectedLayerInfo); } else selectedLayerInfo = _selectedLayerInfos[_activeMap]; if (activeMapChanged) { RefreshLayerCollection(); SetProperty( ref _selectedLayer, (selectedLayerInfo.SelectedLayer != null ) ? selectedLayerInfo.SelectedLayer : Layers.FirstOrDefault(), () => SelectedLayer); if (_selectedLayer == null ) { FrameworkApplication.SetCurrentToolAsync( "esri_mapping_exploreTool" ); return ; } selectedLayerInfo.SelectedLayer = SelectedLayer; } if (SelectedLayer != null ) { List< long > oids = new List< long >(); if (mapSelection != null ) { if (mapSelection.ContainsKey(SelectedLayer)) oids.AddRange(mapSelection[SelectedLayer]); } else { oids.AddRange(SelectedLayer.GetSelection().GetObjectIDs()); } } }); } // コンボボックスのコレクションにレイヤーを追加する private void RefreshLayerCollection() { Layers.Clear(); if (_activeMap == null ) return ; var layers = _activeMap.GetLayersAsFlattenedList().OfType<BasicFeatureLayer>(); lock (_lock) { foreach (var layer in layers) { Layers.Add(layer); } } } // コンボボックスで選択しているコレクションが変わったときのイベント private Task SelectedLayerChanged() { return QueuedTask.Run(() => { if (SelectedLayer != null ) { var selection = SelectedLayer.GetSelection(); } }); } // コンボボックスで値が選択されているかチェックする private bool ComboCheck() { if (SelectedLayer == null ) { return false ; } else { return true ; } } #endregion マップや、レイヤーに発生するイベントハンドラーを定義します。 ※ Dockpane1ViewModel クラス内に定義すること #region Event Handlers // マップにレイヤーが追加された時のイベント private void OnLayersAdded(LayerEventsArgs args) { foreach (var layer in args.Layers) { if (layer.Map == _activeMap && layer is BasicFeatureLayer) { Layers.Add((BasicFeatureLayer)layer); if (SelectedLayer == null ) SelectedLayer = (BasicFeatureLayer)layer; } } } // マップからレイヤーが削除された時のイベント private void OnLayersRemoved(LayerEventsArgs args) { foreach (var layer in args.Layers) { if (layer.Map == _activeMap) { if (Layers.Contains(layer)) Layers.Remove((BasicFeatureLayer)layer); } } if (SelectedLayer == null ) { SelectedLayer = Layers.FirstOrDefault(); SelectedLayerChanged(); } } // マップが削除されたときのイベント private void OnMapRemoved(MapRemovedEventArgs args) { var map = _selectedLayerInfos.Where(kvp => kvp.Key.URI == args.MapPath).FirstOrDefault().Key; if (map != null ) _selectedLayerInfos.Remove(map); } // マップの内容が変わったときのイベント private void id(MapSelectidEventArgs args) { if (args.Map != _activeMap) return ; UpdateForActiveMap( false , args.Selection); } // アクティブなマップが変わったときのイベント private void OnActiveMapViewChanged(ActiveMapViewChangedEventArgs args) { if (args.IncomingView == null ) { SetProperty( ref _selectedLayer, null , () => SelectedLayer); _layers.Clear(); return ; } _activeMap = args.IncomingView.Map; UpdateForActiveMap(); } #endregion 選択されたレイヤーの情報を保持するクラスを作成します。 internal class SelectedLayerInfo { public SelectedLayerInfo() { } public SelectedLayerInfo(BasicFeatureLayer selectedLayer, long ? selectedOID) { SelectedLayer = selectedLayer; SelectedOID = selectedOID; } public BasicFeatureLayer SelectedLayer { get ; set ; } public long ? SelectedOID { get ; set ; } } 最後に、コンストラクタとデストラクタに定義したイベントを監視して実行する処理を定義します。 ※ Dockpane1ViewModel クラス内に定義すること protected Dockpane1ViewModel() { System.Windows.Data.BindingOperations.EnableCollectionSynchronization(_layers, _lock); LayersAddedEvent.Subscribe(OnLayersAdded); LayersRemovedEvent.Subscribe(OnLayersRemoved); MapSelectidEvent.Subscribe(id); ActiveMapViewChangedEvent.Subscribe(OnActiveMapViewChanged); MapRemovedEvent.Subscribe(OnMapRemoved); ZoomInCmd = new RelayCommand(() => MapView.Active.ZoomToAsync(SelectedLayer), () => ComboCheck()); } ~Dockpane1ViewModel() { LayersAddedEvent.Unsubscribe(OnLayersAdded); LayersRemovedEvent.Unsubscribe(OnLayersRemoved); MapSelectidEvent.Unsubscribe(id); ActiveMapViewChangedEvent.Unsubscribe(OnActiveMapViewChanged); MapRemovedEvent.Unsubscribe(OnMapRemoved); } これでステップ3のロジックの実装は完了です。 4. デバッグ実行 最後のステップです。 Visual Studio のデバッガでアドイン プロジェクトを実行します。 デバッグを開始すると ArcGIS Pro が自動的に起動します。 ArcGIS Pro が起動すると作成したアドインが追加されています。 任意のプロジェクトを選択し、画面上段のリボンからアドインタブを選択して作成したドックパネルを操作してみましょう。 ※アドインではレイヤーを使用します。レイヤーが含まれるプロジェクト、またはプロジェクト起動後にレイヤーを追加してご確認ください。 次回 これで Pro SDK での簡単なアドイン開発を行う流れについての説明は終わりです。 次回は、 Pro SDK を使って構成管理の開発をご紹介していきます。 ■関連リンク Esri 社 Web サイト: ・ArcGIS Pro SDK ・ArcGIS Pro SDK コンセプト(GitHub) ・ArcGIS Pro SDK サンプル集(GitHub) ・ArcGIS Pro API リファレンス
... View more
09-27-2018
07:02 PM
|
1
|
0
|
1089
|
DOC
|
「デスクトップ地図アプリ開発」シリーズ の第4弾の記事です。 今回は、 第3弾 で作成した地図アプリに、レイヤーの一覧を表示する「レイヤー リスト」を追加します。 本記事で紹介する機能のサンプル コードは ESRIジャパン GitHub で公開しています。 レイヤー リストの追加 アプリの画面に簡易版の「コンテンツ ウィンドウ」を作成し、その中にレイヤー リストを実装します。また、レイヤー リストには凡例とレイヤーの表示・非表示をチェックボックスで切り替える機能も併せて実装します。 1. MainWindow.xaml に、レイヤーを表示する枠組みを作成します。 TreeView コントロール を使用してレイヤーと凡例が階層で表示されるように実装し、TreeView の中ではレイヤー名を表示するための 「 Binding myLayerName 」 と凡例表示の画像を表示するための 「 Binding mySymbolImage 」を設定します。 < TreeView Name ="ContentsTree"> < TreeView.Resources > < HierarchicalDataTemplate DataType ="{ x : Type self : myLayerInfo }" ItemsSource ="{ Binding Members }"> < StackPanel Orientation ="Horizontal"> < CheckBox Margin ="1" IsChecked ="{ Binding IsChecked }" Click ="CheckBox_Click" Tag ="{ Binding myLayerID }"> < TextBlock Text ="{ Binding myLayerName }" /> </ CheckBox > </ StackPanel > </ HierarchicalDataTemplate > < DataTemplate DataType ="{ x : Type self : mySymbolInfo }"> < StackPanel Orientation ="Horizontal"> < Image Source ="{ Binding mySymbolImage }" Margin ="0,0,5,0" /> < TextBlock Text ="{ Binding mySymbolName }" /> </ StackPanel > </ DataTemplate > </ TreeView.Resources > </ TreeView > 2. MainWindows.xaml.cs を実装します。初めに、今回使用する以下の名前空間を追加します。 using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.CompilerServices; 3. レイヤー情報を保持するクラスを作成して、バインディング するプロパティを設定します。 次のサンプルでは手順 1 で定義したレイヤー リストに表示するためのレイヤーの名称とシンボルの情報をバインドするクラスを定義しています。 // コンテンツ ウィンドウに表示するレイヤーの DataContext プロパティ
public class myLayerInfo: BindableBase
{
public myLayerInfo ()
{
this.Members = new ObservableCollection<mySymbolInfo>();
}
public string myLayerName { get; set; }
public string myLayerID { get; set; }
public ObservableCollection<mySymbolInfo> Members { get; set; }
private bool _IsChecked = true;
public bool IsChecked
{
get { return _IsChecked; }
set { this.SetProperty(ref _IsChecked, value); }
}
}
// コンテンツ ウィンドウに表示するシンボル画面の DataContext プロパティ
public class mySymbolInfo
{
public BitmapFrame mySymbolImage { get; set; }
public string mySymbolName { get; set; }
}
public class BindableBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual bool SetProperty<T>(ref T field, T value, [CallerMemberName]string propertyName = null)
{
if (Equals(field, value)) { return false; }
field = value;
var h = this.PropertyChanged;
if (h != null) { h(this, new PropertyChangedEventArgs(propertyName)); }
return true;
}
} 4. 次に、マップに追加されているレイヤーの情報を取得します。 サンプルではマップ オブジェクトからレイヤー オブジェクトの リストを取得して、そこからレイヤーの名称、シンボルの情報を取得しています。 取得した情報をもとにレイヤー情報を格納する myLayerInfo オブジェクトのリストを新たに作成し、前の手順で作成した TreeView にバインドします。 public async void TreeViewMultipleTemplatesSample()
{
long i = 0;
// TreeView にバインドする値を保持するためのレイヤー情報を格納する myLayerInfo の List オブジェクトを定義する
List<myLayerInfo> layers = new List<myLayerInfo>();
// マップに追加されているレイヤーの一覧を取得
foreach(var mylayer in MyMapView.Map.AllLayers)
{
// マップに格納されているレイヤーにユニークな ID を設定 (レイヤーの表示・非表示機能を実装する際に使用する)
mylayer.Id = i.ToString();
// レイヤー名 (レイヤー オブジェクトから取得) とレイヤー ID をセットして myLayerInfo オブジェクトを作成する
myLayerInfo myLayerInfo = new myLayerInfo() { myLayerName = mylayer.Name, myLayerID = mylayer.Id };
// レイヤーに設定されているシンボル情報 (シンボル画像とその名称) を取得する
var legendinfos = await mylayer.GetLegendInfosAsync();
if (legendinfos != null)
{
foreach(var item in legendinfos)
{
// シンボルを BitmapFrame 型に変換し画像として取得する
var sym = item.Symbol;
var imageData = await sym.CreateSwatchAsync(1 * 96);
var imgst = await imageData.GetEncodedBufferAsync();
var img = System.Drawing.Bitmap.FromStream(imgst);
// メモリストリームに BitmapFrame を保存して myLayerInfo オブジェクトにシンボルの画像と名称をセットする
using (Stream stream = new MemoryStream())
{
img.Save(stream, ImageFormat.Png);
stream.Seek(0, SeekOrigin.Begin);
myLayerInfo.Members.Insert(0, new mySymbolInfo() { mySymbolImage = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad), mySymbolName = item.Name });
}
}
}
// List オブジェクトの一番上に myLayerInfo を追加する
layers.Insert(0, myLayerInfo);
i = i + 1;
}
// 作成した List オブジェクトの値を TreeView に反映する
ContentsTree.ItemsSource = layers;
} Tips: レイヤーの名称は Map クラスが持つ AllLayers プロパティを使用することで取得でき、シンボルの情報は Layer クラスが持つ GetLegendInfosAsync() メソッドで取得できます。サンプルで使用している主題図用のレイヤーは、土地利用の種別によって異なるシンボルが設定されています。 GetLegendInfosAsync() ではレイヤーに設定されている各シンボルとその名称のセットが返されます。 5. 次に、アプリケーションを起動したときにレイヤー リストを作成するためのイベント呼び出し処理を記述します。 Initialize メソッドの最後に手順 4 で定義したメソッドの呼び出しを追記します。 public async void Initialize()
{
// 中略
// マップに追加されているレイヤーの一覧取得
TreeViewMultipleTemplatesSample();
} ここまでで、レイヤーの一覧を取得してレイヤー リストを作成する実装ができました。 6. 次に、レイヤー リストに表示しているチェックボックスにレイヤーの表示・非表示を切り替える機能を実装します。 MainWindows.xaml.cs にチェックボックスのイベントハンドラーを実装します。 // コンテンツ ウィンドウのチェックボックスのイベントハンドラー
private void CheckBox_Click(object sender, RoutedEventArgs e)
{
var checkBox = (CheckBox)sender;
// レイヤーの表示・非表示を切り替える
visivleLayer(checkBox.Tag.ToString());
} 7. 続いて、チェックボックスのイベントハンドラーの中で呼び出しを行う、visivleLayer メソッドを定義します。 メソッドの中では、チェックボックスの tag プロパティに格納したレイヤー ID とマップ オブジェクトに格納されているレイヤーの ID (手順 4 で設定) を比較し、 ID が一致したレイヤーの表示・非表示を切り替えます。 // レイヤーの表示・非表示
private void visivleLayer(string layername)
{
foreach (var mylayer in MyMapView.Map.AllLayers)
{
if (mylayer.Id == layername)
{
if (mylayer.IsVisible)
{
// レイヤーを非表示にする
mylayer.IsVisible = false;
}
else
{
// レイヤーを表示する
mylayer.IsVisible = true;
}
}
}
} Tips: レイヤーの表示・非表示は、 Layer クラスが持つ IsVisible プロパティ を使って切り替えを行います。 ※マップの作成方法によりデフォルトではレイヤー ID を保有していないレイヤーも存在するため、手順 4 で新たにレイヤーにユニークな ID を設定してレイヤーの識別を行っています。 アプリケーションを実行してレイヤーの表示・非表示を切り替えてみます。 第4弾「レイヤー リストの作成」ではマップに含まれるレイヤーの一覧を表示するレイヤー リストの作成方法をご紹介しました。次回の第5弾では、開発したアプリケーションを配布するために必要な ArcGIS Runtime SDK の「ライセンス認証方法」をご紹介する予定です。 関連リンク デスクトップ地図アプリ開発 (連載記事の紹介) ArcGIS Runtime SDK for .NET (米国 Esri 社/ESRIジャパン)
... View more
07-16-2018
06:17 PM
|
0
|
0
|
836
|