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 など、別途ファイルとしてデータを保持することによりデータの編集を行うことができます。 ※別ファイルで保持するデータの編集を行うためには Basic または 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
|
1532
|
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
|
1616
|
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
|
2919
|
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
|
1328
|
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
|
2438
|
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
|
1493
|
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
|
3914
|
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
|
8709
|
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
|
3872
|
DOC
|
「デスクトップ地図アプリ開発」シリーズの第9弾の記事です。 今回は、第8弾で作成した地図アプリに、レイヤー リストの機能を追加します。本記事で紹介する機能のサンプル コードは ESRIジャパン GitHub で公開しています。 レイヤー リストの作成 マップ上にあるすべてのレイヤーを一覧表示し、各レイヤーのフィーチャのシンボルが何を表しているかを示すための凡例も一緒に表示します。また、レイヤー名のチェックボックスをオン/オフして、レイヤーの表示/非表示を切り替える機能も実装します。 1. MainWindow.xaml に、レイヤー リストを表示するレイアウトを作成します。TreeView コントロールを使用してレイヤーと凡例が階層で表示されるように実装し、TreeView の中ではレイヤー名を表示するための 「Binding LayerName」 と凡例の画像を表示するための 「Binding SymbolImage」を設定します。 MainWindow.xaml
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.2*"></ColumnDefinition>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="0.8*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<TreeView Name="ContentsTree" Grid.Column="0" ItemsSource="{Binding Layers, Source={StaticResource MapViewModel}}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:LayerInfo}" ItemsSource="{Binding SymbolMembers}">
<StackPanel Orientation="Horizontal">
<CheckBox Margin="1" IsChecked="{Binding LayerChecked}" Click="LayerCheckBox_Click" Tag="{Binding LayerID}">
<TextBlock Text="{Binding LayerName}" />
</CheckBox>
</StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:SymbolInfo}">
<StackPanel Orientation="Horizontal">
<Image Source="{Binding SymbolImage}" Margin="0,0,5,0" />
<TextBlock Text="{Binding SymbolName}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
<GridSplitter Grid.Column="1" Width="5" HorizontalAlignment="Center"/> 2. これまでに追加したコントロールに対してカラムを設定します(各コントロールに Grid.Column="2" を追加)。 MainWindow.xaml
<esri:MapView x:Name="MainMapView" Grid.Column="2" Map="{Binding Map, Source={StaticResource MapViewModel}}" ・・・・/>
<esri:OverviewMap x:Name="OverviewMapView" Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" Margin="10,10,10,30"/>
<StackPanel Grid.Column="2" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5">
・・・・
</StackPanel>
<Border Grid.Column="2" HorizontalAlignment="Right" VerticalAlignment="Top" Background="White" BorderThickness="0.5" BorderBrush="Gray" Margin="10" Padding="10" Width="250">
・・・・
</Border> 3. Visual Studio のメニューから [ツール] → [NuGet パッケージ マネージャー] → [ソリューションの NuGet パッケージの管理] をクリックして、System.Drawing.Common NuGet パッケージをインストールします。 4. MapViewModel.cs に、手順 1 で定義したレイヤー リストに表示するためのレイヤー名やシンボル情報などをバインドするクラスを定義します。 MapViewModel.cs
namespace mapApp
{
// レイヤー リストに表示するレイヤー名や凡例画像などの DataContext プロパティ
public class LayerInfo
{
public LayerInfo()
{
this.SymbolMembers = new ObservableCollection<SymbolInfo>();
}
public string? LayerName { get; set; }
public string? LayerID { get; set; }
public bool? LayerChecked { get; set; }
public ObservableCollection<SymbolInfo>? SymbolMembers { get; set; }
}
public class SymbolInfo
{
public System.Windows.Media.Imaging.BitmapFrame.BitmapFrame? SymbolImage { get; set; }
public string? SymbolName { get; set; }
} 5. TreeView コントロールのコンテンツとして設定するデータコレクションをバインドするクラスを定義します。 MapViewModel.cs
public class MapViewModel : INotifyPropertyChanged
{
///中略///
private ObservableCollection<LayerInfo>? _layers;
public ObservableCollection<LayerInfo>? Layers
{
get { return _layers; }
set
{
_layers = value;
OnPropertyChanged();
}
} 6. 次に、マップに追加されているレイヤー情報を取得して、TreeView に表示する処理を作成します。下記のコードでは Map オブジェクト(GeoModel を継承)から Layer オブジェクトのリストを取得して、そこからレイヤー名、シンボル情報を取得しています。取得した情報をもとにレイヤー情報を格納する LayerInfo オブジェクトのリストを新たに作成し、TreeView にバインドします。 MapViewModel.cs
public async void CreateToc()
{
long layerCount = 0;
// TreeView にバインドする値を保持するためのレイヤー情報を格納する LayerInfo のコレクションを作成する
Layers = new ObservableCollection<LayerInfo>();
// マップに格納されているレイヤーの一覧を取得する
foreach (var layer in Map.AllLayers)
{
// マップに格納されているレイヤーにユニークな ID を設定する(レイヤーの表示/非表示機能を実装する際に使用する)
layer.Id = layerCount.ToString();
// レイヤー名 (Layer オブジェクトから取得) とレイヤー ID をセットして、LayerInfo オブジェクトを作成する
LayerInfo layerInfo = new LayerInfo() {
LayerName = layer.Name,
LayerID = layer.Id,
LayerChecked = layer.IsVisible
};
// レイヤーに設定されているシンボル情報 (シンボル画像とその名称) を取得する
var legendInfos = await layer.GetLegendInfosAsync();
if (legendInfos != null)
{
foreach (LegendInfo item in legendInfos)
{
// シンボルを BitmapFrame 型に変換し画像として取得する
Symbol symbol = item.Symbol!;
RuntimeImage swatch = await symbol!.CreateSwatchAsync(1 * 96);
Stream imageData = await swatch.GetEncodedBufferAsync();
System.Drawing.Image image = Bitmap.FromStream(imageData);
// メモリストリームに BitmapFrame を保存して LayerInfo オブジェクトにシンボルの画像と名称をセットする
using (Stream stream = new MemoryStream())
{
image.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
stream.Seek(0, SeekOrigin.Begin);
BitmapFrame symbolImage = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
SymbolInfo symbolInfo = new SymbolInfo() {
SymbolImage = symbolImage,
SymbolName = item.Name
};
layerInfo.SymbolMembers!.Insert(0, symbolInfo);
}
}
}
// TreeView コンテンツのコレクションの一番上に LayerInfo オブジェクトを追加する
Layers.Insert(0, layerInfo);
layerCount = layerCount + 1;
}
} Tips: レイヤー名は Map クラスが持つ AllLayers プロパティを使用することで取得でき、シンボルの情報は Layer クラスが持つ GetLegendInfosAsync() メソッドで取得できます。GetLegendInfosAsync() ではレイヤーに設定されている各シンボルとその名称のセットが返されます。 7. マップのロードが完了した後に、前の手順で作成した CreateToc() メソッドを呼び出します。 MapViewModel.cs
private async Task SetupMap()
{
///中略///
await Map.LoadAsync();
// レイヤー リストを作成する
CreateToc(); 8. ここまでで、マップに追加されている各レイヤーの情報を表示するレイヤー リストを作成できました。 9. 次に、ベースマップのレイヤー名が英語(World_Basemap_v2/Elevation)で表示されているので、CreateToc() メソッドを呼び出す前に Layer オブジェクトの Name プロパティを設定して、日本語で表示されるように修正します。 MapViewModel.cs
// マップをロードする
await Map.LoadAsync();
// ベースマップのレイヤー名を変更
localizedBasemap.BaseLayers[0].Name = "陰影起伏図";
localizedBasemap.BaseLayers[1].Name = "地形図";
// レイヤー リストを作成する
CreateToc(); 10. アプリを実行して、ベースマップのレイヤー名が日本語で表示されているか確認します。 11. 次に、各レイヤー名の左横に表示されているチェックボックスをクリックして、レイヤーの表示/非表示を切り替える機能を実装していきます。CheckBox コントロールに Click イベントを作成します(Click="LayerCheckBox_Click" を追加)。 MainWindows.xaml
<CheckBox Margin="1" IsChecked="{Binding LayerChecked}" Click="LayerCheckBox_Click" Tag="{Binding LayerID}">
<TextBlock Text="{Binding LayerName}" />
</CheckBox> 12. MainWindows.xaml.cs にチェックボックスのイベントハンドラーを実装します。 MainWindows.xaml.cs
// レイヤー リストのチェックボックスのイベント ハンドラー
private void LayerCheckBox_Click(object sender, RoutedEventArgs e)
{
var checkBox = (CheckBox)sender;
var currentMapViewModel = (MapViewModel)this.FindResource("MapViewModel");
// レイヤーの表示/非表示を切り替える
currentMapViewModel.setVisibleLayer(checkBox.Tag.ToString()!);
} 13. レイヤーの表示/非表示を切り替える setVisivleLayer メソッドを定義します。チェックボックスの tag プロパティに格納したレイヤー ID と Map オブジェクトに格納されているレイヤーの ID(手順 6 で設定)を比較し、 ID が一致したレイヤーの表示・非表示を切り替えます。 MapViewModel.cs
// レイヤーの表示/非表示の切替え
public void setVisibleLayer(string checkedLayerId)
{
foreach (Layer layer in Map.AllLayers)
{
if (layer.Id == checkedLayerId)
{
if (layer.IsVisible) {
// レイヤーが表示されている場合は非表示にする
layer.IsVisible = false;
} else {
// レイヤーが非表示の場合は表示する
layer.IsVisible = true;
}
}
}
} Tips: レイヤーの表示/非表示は、Layer クラスが持つ IsVisible プロパティを使って切り替えを行います。マップの作成方法によりデフォルトではレイヤー ID を保有していないレイヤーも存在するため、手順 6 で新たにレイヤーにユニークな ID を設定してレイヤーの識別を行っています。 14. アプリを実行してレイヤーの表示/非表示を切替えてみましょう。 第9弾「レイヤー リストの作成」ではマップに含まれる各レイヤーの情報を表示するレイヤー リストの作成方法をご紹介しました。次回の第9弾では、開発したアプリを配布するために必要なライセンス認証について紹介します。 関連リンク デスクトップ地図アプリ開発 (連載記事の紹介) ArcGIS Maps SDK for .NET (米国 Esri 社/ESRIジャパン)
... View more
07-16-2018
06:17 PM
|
0
|
0
|
2087
|
DOC
|
2018 年 4 月 12 日(木)に、第 14 回目となる GeoDev Meetup を開催しました。 “3D” や “Python ハンズオン”など様々なテーマで開催していますが、今回は ArcGIS で可視化できるコンテンツをご用意して、みなさんと「もくもく」した様子をお届けします! GeoDev Meetup とは? 地理情報や地図・位置データを扱う(扱ってみたい)エンジニアやデザイナーの交流の場 ArcGIS を使ったデータ可視化・解析やアプリ開発をやってみる D3.js や Leaflet などのオープン ソースの技術と連携したいという方も大歓迎! という主旨で開催しています。 GeoDev Meetup は、新しい仲間に出会えることができる場や、もしくは、ArcGIS を利用することで新しいビジネスの創出や事業を開発するきっかけなどが生まれる場にすることができればと考えています。GIS を通じた大きなコミュニティが日本でもさらに活発になるようにしていきたいと思います。 (過去の Meetup の様子は 開催レポート をご覧ください) もくもくコンテンツ! 今回は、「実践 ArcGIS で可視化してみよう」という、毎回 Meetup の冒頭で「ArcGIS でできること」として説明している内容をコンテンツとして公開しました! Web マップを作成してから、ノーコーディングで簡単な Web アプリを作るまでをトライすることができます。 今回の参加者のみなさんは、上記のコンテンツに沿って Web マップや Web アプリを作成したあと、ArcGIS にたくさん用意されている地図表示用のシンボルを一通り試したり、Web アプリに追加できる GIS 機能(グラフ表示など)のウィジェットをいろいろ試してみたり、試行錯誤しながら「もくもく」されている様子でした。 次回に向けて、今回のコンテンツの発展編を作成することも検討しておりますので、お楽しみに! もくもく中の会場の様子 Hello New Map 「みなさんにもっと地図表現について知ってもらいたい!」という思いから、米国 Esri が公開する興味深いマップを紹介する「Hello New Map」 というコーナーを始めました! 記念すべき第 1 回目は、米国の世帯別の優良収入マップをご紹介しました。 「ホタル」というシンボルを使用しており、収入別に色や大きさが異なるきれいな見た目で表現されております。 今後も、いろいろなマップを紹介します!! LTタイム! LT①オープンデータチャレンジに参加して(asuzuki) 弊社社員が、東京公共交通オープンデータチャレンジに参加した時のことについて LT を行いました。 応募した経緯から、社内で行ったアイディアソン、アプリの作成に苦労した点や、作成の手順について熱く LT させていただきました! 実際に応募したアプリは「リアルタイム列車遅延マップ」という Web アプリで、各路線の遅延情報を可視化して列車の遅延情報が確認できます。 また、気象情報や、遅延に関する Twitter の情報も併せて確認できる便利なアプリです。また、アプリの概要やアプリ作成秘話を書いたブログもありますので、是非そちらもご覧ください。 LT②The (Data) Science of Where(Hnakamrua) 2本目は、「Hands-On Machine Learning with Scikit-Learn and TensorFlow」 という本を参考に、ArcGIS API for Python を使用して行った解析についての LT です。 アメリカの不動産価格のデータを用いて、Jupyter Notebook 上で収入や立地情報から相関関係などの解析を行いました。 おわりに ご参加いただいたみなさま、ありがとうございました! もくもくタイムでは新しいコンテンツに挑戦いただき、「ArcGIS でできることが何となくつかめた」、「GIS に興味が出てきた」などのお声を頂くことができ、うれしい限りです。今後も新しいコンテンツを取り入れながら、定期的に開催いたします!またみなさまにお会いできることを楽しみにしています! 関連リンク ArcGIS 関連ページ ・GeoDev Meetup 開催レポート ・ArcGIS for Developers ・ArcGIS for Developers 開発リソース集 ・ArcGIS Online ・ArcGIS Open Data
... View more
04-19-2018
03:07 AM
|
0
|
0
|
528
|
Title | Kudos | Posted |
---|---|---|
1 | 06-13-2019 09:35 PM | |
1 | 09-27-2018 07:02 PM |
Online Status |
Offline
|
Date Last Visited |
11-11-2020
02:25 AM
|