DOC
|
はじめに 2020年に「はじめてのArcGIS API for Python」として、「第29回 地理情報システム学会 学術研究発表大会GIS」のハンズオンセッションで用いた資料をもとに、本ブログで2本の記事を公開させていただきました。それから2年あまり経過し、その間にもArcGIS Online のアップデートされたのもあり、一部の画面が過去の記事とは異なっている箇所が出ていました。 そこで、今回は Learn ArcGIS の「ArcGIS Notebooks での Python の使用方法の理解」のラーニングパスに掲載されている英語ノートブックを翻訳して、「ArcGIS Notebooks での Python の使用方法の理解」のノートブック集 として公開しました。 過去の記事で取り上げた「Notebook の紹介」と「ArcGIS Notebooks を使用して、Web GIS を教える」も最新化したものがありますので、これからArcGIS API for Python を学びたい方は、上記のノートブック集をご参照ください。 ノートブック集 2022年10月14日現在、翻訳した5 つのノートブックをGitHub で公開しています。それぞれの説明は、ノートブック集に記載しておりますので、ここでは概要のみ引用して記載します。 初めてのノートブック 演習時間30分:ArcGIS Online でノートブックを作成して使用する方法を学習します。「Notebook の紹介」を最新化した内容です。(HelloNotebook_ja.ipynb) ArcGIS Notebooks を用いた Web GIS の概要 演習時間45分:ArcGIS Notebooks でのマッピングと解析を探索します。「ArcGIS Notebooks を使用して、Web GIS を教える」を最新化した内容です。(Understanding_Web_GIS_Using_ArcGIS_Notebooks_ja.ipynb) ArcGIS Notebooks での arcpy の使用 演習時間45分:ArcGIS Notebooks で arcpy を操作する方法と arcpy ではなく arcgis を使用する必要があるケースを学習します。(Using_arcpy_in_ArcGIS_notebooks_ja.ipynb) ArcGIS Notebooks でのスマート マッピング 演習時間45分:ArcGIS Notebooks で ArcGIS API for Python を使用して見栄えのするマップを作成するためにスマート マッピングを使用する方法を学習します。(Smart_Mapping_with_ArcGIS_Notebooks_ja.ipynb) 空間対応のデータフレームでのデータの視覚化 演習時間45分:ArcGIS Notebooks の Python で空間対応のデータフレーム(Spatially Enabled DataFrame)をデータの解析と視覚化に使用する方法を学習します。また、Matplotlib、pandas、seaborn、Plotly などを使用した簡単な演習もはいっています。(Data_visualization_with_the_spatially_enabled_dataframe_ja.ipynb) ページには、ノートブックへのリンクも記載してありますので、直接、Web ブラウザで参照して、確認いただくことが可能です(ただし、直接参照した場合、Markdownセルで見出し単位での折り畳みが出来ない、内部リンクをクリックした場合に404エラーになる等の制限があります)。 図 - ノートブック(*.ipynb) を直接Web ブラウザから参照した例 また、ダウンロードしたノートブック(*.ipynb) は、ご自身のArcGIS Online の組織にアップロードし、説明を読みながらコードセルを実行することも可能です。 しかしながら、ノートブックで説明している手順を理解し、ArcGIS API for Python を習得するためには、新しいノートブック を作成し、ノートブックで記載されている演習をご自身でコードを書いて、完了することをお勧めします。 おわりに 過去の記事の時にも書きましたが、ArcGIS Online では2020年 6月のアップデートからリリース版としてArcGIS Notebooks が利用できるようになり、環境を構築することなく、より手軽にArcGIS API for Python を利用可能な環境が使えます(詳細は「ArcGIS Online (2020 年 6 月アップデート) の新機能」をご参照ください)。 今回はその環境を利用した2つの演習素材を最新化し、さらに3つのノートブックを加えて、公開しました。ArcGIS API for Python を習得するための、一助としてご利用ください。 関連情報 ArcGIS Online ヘルプ ノートブックの基本操作—ArcGIS Online ヘルプ | ドキュメント サンプル ノートブック—ArcGIS Online ヘルプ | ドキュメント Learn ArcGIS ArcGIS Notebooks での Python の使用方法の理解 / 「ArcGIS Notebooks での Python の使用方法の理解」のノートブック集 Esri Canada | Education & Research Working with Python Notebooks シリーズ ブログ ArcGIS API for Python を使ってみよう さわって覚える ArcGIS API for Python ArcGIS Developers 開発リソース集 ArcGIS API for Python のガイド集 ArcGIS API for Python をさらに学ぶためのリンク
... View more
10-18-2022
07:42 PM
|
0
|
0
|
1215
|
DOC
|
はじめに ※本記事は、米国Esri 社のブログ記事「Animating your data with the ArcGIS API for JavaScript」を翻訳したものに、一部加筆したものです。 アニメーションは、ジオメトリや属性の変化に伴うデータのパターンを見つけたり、可視化するのに便利です。アプリケーションにアニメーションを追加すると、データに命を吹き込むことができ、一見しただけではわからない空間的なパターンを知ることができます。 live sample - Animating hurricanes as they move over time. この記事では、ArcGIS API for JavaScript を使用して、さまざまな種類のアニメーションを作成する方法を説明します。アニメーションは楽しいものであり、物事が起こっている感覚を作り出すのに役立ちますが、自分自身に問いかけることを忘れないようにすることが重要です。 今、何を見たのか? アニメーションによって、データはどのように変化したのか? データのアニメーションには、”位置(移動するフィーチャ)のアニメーション”、”属性(静止しているフィーチャ)のアニメーション”、の2つのカテゴリーがあります。 “位置のアニメーション” を行う場合はレンダラーを固定し、データにフィルターを適用することをお勧めします。 “静止しているフィーチャの属性のアニメーション” を行う場合は、視覚的変数やデータ変数のアニメーションを使用することをお勧めします。 1. 位置のアニメーション (Animating locations) 1-a) データ フィルター アニメーション (Data filter animation) 2. 属性のアニメーション (Animating attributes) 2-a) 視覚的変数 アニメーション (Visual variable animation) 2-b) データ変数 アニメーション (Data variable animation) 1. 位置のアニメーション (Animating locations) 位置をアニメーション化することで、データのパターンや変化を見つけるのに役立ちます。例えば、位置やジオメトリが時間とともに変化する場合、アニメーションを追加することによって、いつ、どのようにデータが移動したか、または変化したのかを理解するのに役立ちます。 1-a) データ フィルター アニメーション (Data filter animation) データ フィルター アニメーションは、データをアニメーション化するために、レイヤーのフィルターを更新します。レンダラーを固定したまま、属性、ジオメトリ、時間範囲にフィルターを適用することが可能です。 フィーチャの属性、ジオメトリをもとにしたデータ フィルター アニメーションを実行するには、layerView.filter を使用します。 これには、アニメーションを行いたいすべてのデータを MapView 内で利用できるようにしておく必要があります。与えられたフィルターに該当するフィーチャのみが表示されます。 TimeSlider ウィジェット – 時系列データのフィルタリング 時系列データのアニメーション化は、時間の経過に伴う変化やパターンを見つけるのに役立ちます。例えば、フィーチャの位置やジオメトリが時間とともにどのように変化するか、静止しているオブジェクトの場合は、その属性が時間とともにどのように変化するかを確認することができます。 時間データに基づいたアニメーションを行うには、TimeSlider ウィジェットを使用します。これには、レイヤー もしくは サービスに日付フィールド が存在するか、timeInfo が定義されている必要があります。 live sample - Smoke movement animated over the past two days. TimeSlider ウィジェット は、開発者のために時間データのアニメーション化をよりシンプルなものにします。もしサービスやレイヤーで時間が有効化されている (timeInfo が定義されている)場合、以下のコードのようにTimeSlider の view プロパティを設定するだけでよく、TimeSlider はレイヤーのtimeInfo に設定されます。 TimeSlider ウィジェット の“再生” を押すと、TimeSlider のtime extent の範囲内にあるフィーチャだけが表示されます。 timeInfo がサービスやレイヤーに設定されていない場合、サービス内の任意の日付フィールドを使用してデータをアニメーション化することが可能です。 2019年のKincade Fire (翻訳者注釈;Kincade Fire は2019年10月に米国カリフォルニア州で発生した山火事名です) の延焼を示す例で、その方法を見てみましょう。 live sample - Animating the Kincade Fire to show how it spread over time. このアプリのレイヤーでは、サービスに timeInfo が定義されていなかったので、代わりにサービスのperimeterdatetime フィールドを使用して、TimeSlider の stops と fullTimeExtentを手動で設定しています。 そして、timeSlider.timeExtent プロパティを監視し、layerView.filterを使ってレイヤー内のデータをその日付でフィルタリングしています。 属性によるデータのフィルタリング データ フィルター アニメーションは、必ずしも時間によって行われる必要はありません。レイヤーの属性をフィルタリングすることによっても、アニメーションを作成することが出来ます。この種のアニメーションは、選挙結果, 人口統計, 所得などを見るときに便利です。 次の例では、ロサンゼルスの所得の中央値を layerView.effectを使ってアニメーション表示しています。Effect は与えられたフィルターを満たすフィーチャを強調したり、強調を抑えたりします。layerView.filterと異なり、 effect では全ての利用可能なフィーチャがマップに表示されますが、フィルターを満たすフィーチャに効果(effect )が適用されます。 live sample - Los Angeles block groups animated by median income. このサンプルでは、アニメーション スライダーを変更したとき、スライダーの最小値と最大値に基づいて、effect のフィルターを更新しています。 このフィルターに該当するフィーチャを強調したいので、 includedEffect に bloom と saturateを設定しています。また、フィルターを満たさないフィーチャを目立たなくするために、少し blur の設定と、brightnessを下げる設定をしています。 function createEffect(min, max) { featureLayerView.effect = { filter: { where: "MEDHINC_CY > " + min + " AND MEDHINC_CY < " + max }, includedEffect: "bloom(150%, 1px, 0.2) saturate(200%)", excludedEffect: "blur(1px) brightness(65%)" } } 2. 属性のアニメーション (Animating attributes) 属性のアニメーションは、行政界(国、州、郡)を示す地図など、ジオメトリや位置が固定されているレイヤーに、アニメーションを追加するのに便利な方法です。レイヤーの属性をアニメーション化するには、アニメーション フレームまたはスライダーの変更のたびに、レンダラーを更新します。 2-a) 視覚的変数 アニメーション(Visual variable animation) このタイプのアニメーションでは、データ変数を固定したまま、アニメーション フレーム又はスライダーの変更のたびに、レンダラーの視覚的変数の閾値(stop )を更新します。このタイプの可視化では、テーブル内の単一フィールドまたは単一列のみを見ます。 live sample - Building footprints in New York City animated by the year they were built. この例では、ニューヨークの建物フットプリントを建築年ごとに可視化し、建物がいつ建設されたかを示すアニメーションを追加しています。 スライダーで各年を移動できるように設定されています。建物が建てられた年に、そのフットプリントが明るい青色で光り、年を追うごとに徐々に紫色に変わっていくので、これらの既存の建物フットプリントが、より最近の年はどこにあるのかを見ることができるのです。 どのように行われているのか、コードを見てみましょう。 animate 関数 (下図) はスライダーが更新されるたびに呼び出され、年の値を更新して、その値を setYear 関数に渡します。setYear はいくつかの UI 要素を更新しますが、より重要なのは年の値をもとに、レンダラーを更新することです。 createRenderer 関数は、視覚的変数の閾値(stop )の値を更新するので、スライダー上の現在の年に建てられた建物は常に明るい青色で表示され、10年前に建てられた建物はマゼンタ色で、50年前は暗い紫色で表示されます。ここで重要なのは、変化しているのは閾値(stop )の値だけで、それぞれの閾値(stop )の色はデータ フィールドと同じように一定であることです。 2-b) データ変数 アニメーション (Data variable animation) なぜ、最初にすべてのデータをロードし、フィルターを使ってアニメーション化することをしないのでしょうか? 私たちはこれを試しましたが、結果的にアプリのパフォーマンスに大きな影響を与えました。 このレイヤーは、2,500 以上のフィーチャと、約140のフィールドが含まれています。 各データ値に対して1つのポイントが存在する場合、350,000ポイントになります😳。 データ変数を更新することで、一度に読み込まれるフィーチャは350,000 でなく2,500 のみとなり、 そのため、パフォーマンスが向上しています。 視覚的変数 アニメーションと同様に、データ変数 アニメーションも固定されたジオメトリや位置を使用しますが、視覚的変数の閾値(stop )を更新する代わりに、レイヤーをレンダリングするために使用するデータ変数を更新します。 このため、時間間隔ごとに各属性のフィールドを用意する必要があります。データ量によっては、非常に幅の広いテーブルになってしまうかもしれません。これは必ずしも時間によるアニメーションの必要はなく、別の次元(深度など)でもかまいません。 時間によるデータ変数 アニメーション (Data variable animation by time) 次の例では、過去100年以上にわたる世界の気温異常を示しています。このレイヤーには、1880年から2018年までの各年について1つのフィールドが含まれており、スライダーが更新されると、スライダーに一致するフィールドを指し示すようにし、レンダラーを更新しています。 その結果、以下のようなアニメーションが得られました。青色が平年より気温が低い地域を、赤色が平年より気温が高い地域を表しています。このデータをアニメーションにすると、かつて涼しかった世界が、どんどん暖かくなっていることがわかります。 下のGIFをクリックしてアプリを開き、スライダーを更新するときのパフォーマンスに注目してくださいーレンダラの更新がとても速いです! live sample - Visualizing temperature anomalies over time. より高度なアニメーションをお探しの方は? JSAPI は、既存のレイヤーの種類を拡張できるカスタム WebGL レイヤーを通じて、より高度なアニメーションをサポートすることも可能です。カスタム WebGL レイヤービューを使用したアニメーションの詳細については、 このサンプルを参照してください。 カスタム レイヤー ビューによるデータのアニメーションについて、より深く掘り下げるために、Dario D’Amico が「 visualizing and animating flow with a custom WebGL layer」 で詳細なブログを投稿しています。その結果はとても素晴らしいものですので、ご覧ください。 本記事の翻訳前のブログ記事「Animating your data with the ArcGIS API for JavaScript」)は、2021 Esri Developer Summit の ArcGIS API for Javascript: Data-Driven Animations のプレゼンテーション( Kristian Ekenes と Undral Batsukh が発表)をもとに作成されたものです。 終わりに 本記事だけですべてを理解するのは難しいかもしれませんので、紹介している6つの例のLive サンプルアプリケーションと、ソースコードをリンクとしてまとめておきます。ご自身のアプリケーションにアニメーションを追加する際には、本記事と一緒に参考にしていただければと思います。 Animating hurricanes as they move over time. Live サンプルアプリ; https://ekenes.github.io/conferences/ds-2021/data-driven-animations/demos/filter-animation/hurricanes/ ソースコード; https://github.com/ekenes/conferences/tree/master/ds-2021/data-driven-animations/demos/filter-animation/hurricanes Smoke movement animated over the past two days. Live サンプルアプリ; https://ubatsukh.github.io/arcgis-js-api-demos/devsummit2021/effect-wildfires/ ソースコード; https://github.com/ubatsukh/arcgis-js-api-demos/tree/master/devsummit2021/effect-wildfires Animating the Kincade Fire to show how it spread over time. Live サンプルアプリ; https://ubatsukh.github.io/arcgis-js-api-demos/devsummit2021/fire-perimeter/ ソースコード; https://github.com/ubatsukh/arcgis-js-api-demos/tree/master/devsummit2021/fire-perimeter Los Angeles block groups animated by median income. Live サンプルアプリ; https://annelfitz.github.io/DevSummit-presentations/DS-2021/plenary/age-income-in-LA/ ソースコード; https://github.com/annelfitz/DevSummit-presentations/tree/main/DS-2021/plenary/age-income-in-LA Building footprints in New York City animated by the year they were built. Live サンプルアプリ (UI日本語化済); https://esrijapan.github.io/arcgis-samples-4.0-js/samples/animation/visualization-vv-color-animate-ja.html ソースコード (日本語コメント追加済); https://github.com/EsriJapan/arcgis-samples-4.0-js/blob/gh-pages/samples/animation/visualization-vv-color-animate-ja.html Visualizing temperature anomalies over time. Live サンプルアプリ (UI日本語化済); https://esrijapan.github.io/arcgis-samples-4.0-js/samples/animation/visualization-update-data-ja.html ソースコード (日本語コメント追加済); https://github.com/EsriJapan/arcgis-samples-4.0-js/blob/gh-pages/samples/animation/visualization-update-data-ja.html
... View more
05-24-2022
06:48 PM
|
0
|
0
|
1964
|
DOC
|
はじめに GIS のソフトウェアを使っているときに、一度は必ず遭遇するのはシェープファイルの文字化けではないでしょうか? 長年、GIS と慣れ親しんでいる方だと対処方法がわかっているので、問題なく対処できると思いますが、最近、大学での授業をお手伝いするなかでも、一度は学生さんから質問される内容の一つです。 対面の場合には、対処方法をその場でお知らせすれば済むのですが、なかなかそうもいかないご時世なのもあり、先日、改めて次の内容をとりまとめたページを弊社の GitHub で公開しました。 ArcGIS の dBASE ファイルのコード ページ変換機能 (名称: dbfDefault) ESRI ジャパンで提供している「シェープファイル文字コード設定ユーティリティ 」の役割 シェープファイルで文字化けが発生する原因の解説と原因を可視化するサンプル 文字化けへの対処方法として *.cpg ファイルを作成して対処するサンプル 上記の内容を確認したい方は、以下のリンクからアクセスしてください。 「シェープファイル または dBASE ファイル の LDID(Language driver ID)と *.cpg ファイル を調べる 」 また、サンプルとして「ノートブック」 と「Python ツールボックス」 も公開していますので、Python での書き方に興味があるかたは、直接そちらを参照いただくことも可能です。 さて、本ブログは開発者向けと名乗っていることもあり、上記とは別のアプローチ「ArcPy がインストールされていないArcGIS API for Python の環境」※で、Shift-JIS のシェープファイルをSpatially enabled DataFrame へ読み込むまでの2つの方法をご紹介します。 Spatially enabled DataFrame って何?という方は、本ブログシリーズで過去に紹介した、「さわって覚える ArcGIS API for Python : Spatially Enabled DataFrame 編 」の解説や、より詳しい解説やサンプルはGuide ページにある、「Part-1 Introduction to Spatially enabled DataFrame」 、「Part-2 Data IO with SeDF - Accessing Data」 、「Part-3 Data IO with SeDF - Exporting Data 」をご参照ください。 ※ ArcPy が入っていないArcGIS API for Python の環境は、Installation and using Anaconda for Python Distribution に記載している手順で一から構築した環境や、ArcGIS Online 上のArcGIS Notebook のStandard のランタイムが相当します。 ArcPy がインストールされていないArcGIS API for Python の環境でのアプローチ a) 状況の確認 ArcGIS API for Python を使う場合、シェープファイルをSpatially enable DataFrame に読み込みは、[2.2 Read in local GIS data] - [Reading a Shapefile] でも説明されているように、from_featureclass() を使います。しかし、実際、この関数を使ってArcPy が入っていない環境でShift-JIS のシェープファイルを読み込みすると、エラーになります。 エラーメッセージを観察して見ると、ArcPy が入っていない環境では、shapefile.py を使ってシェープファイルを読み込みしている部分でエラーが発生していることがわかります。この shapefile.py がpyshp というライブラリに相当し、ライブラリを確認すると2.0.0 からunicode テキストがフルサポートされ、shapefile.Reader のサンプルであるように、第二引数でencoding を指定できるようになっているようです。 一方、ArcGIS API for Python の from_featureclass() の呼び出し時、encoding の指定は現状は出来ないようです。そうなると別の方法を使う必要がありそうなことがわかります。 b) pyshp と shapely を経由して Shift-JIS の シェープファイル をSpatially enable DataFrame に読み込む 幸運なことに、pyshp と shapely を使ってPandas DataFrame に読み込みするコードは、Gist にありました。 Gist(aerispaha/read_shapefile.py)から引用: def read_shapefile(shp_path):
"""
Read a shapefile into a Pandas dataframe with a 'coords' column holding
the geometry information. This uses the pyshp package
"""
import shapefile
#read file, parse out the records and shapes
sf = shapefile.Reader(shp_path)
fields = [x[0] for x in sf.fields][1:]
#records = sf.records()
records =[list(i) for i in sf.records()] #IceMerman のコメントにあるpython 3.6 環境での書換
shps = [s.points for s in sf.shapes()]
#write into a dataframe
df = pd.DataFrame(columns=fields, data=records)
df = df.assign(coords=shps)
return df 一方、ArcGIS API for Python では、ジオメトリの処理エンジンとしてshapely または arcpy を使うことが説明されていますし、 実際にfrom_shapely() というshapely のジオメトリから、arcgis のジオメトリに変換する関数も存在しています。 そうなると、上記のGist のshapely のジオメトリをarcgis のジオメトリに、from_shapely() を使って変換できれば、最後は、from_df() を使って、Spatially ebaled DataFrame に読み込みすることが実現できそうです。 実際に見つけたコードを少し変更して、Spatially enable DataFrame として返却する関数を作成したものが以下になります。 ※1: pyshp は座標系をハンドリングしないようなので、shapely のジオメトリからarcgis のジオメトリに変換する際に座標系を設定しています。 ※2: また、コメントとして書いていますがArcGIS API for Python のバージョン2.0.0 を使っている場合、from_shapely で不具合があり、issues に書かれている回避方法を適用する必要があります。 # pd.DataFrame.spatial.from_featureclass でArcPyがない場合は、shift-jisのシェープファイルはエラーになる
#
# 回避方法としてPyShp, Shapely, ArcGIS API for Python を使って Spatially enabled DataFrame (SeDF) に変換する
#
# encodingを「**kwargs」のデータ型は可変長の辞書型(dictionary)で渡すようにすることもできるが今回はオプションにした
# 同じくPyShp はprjファイルは見ていないようなのでwkidもオプションにした
# (wkid: JGD2011:6668 、JGD2000:4612 、WGS84:4326)
def sedf_from_shapefile(shp_path, encoding='utf-8', wkid=4326):
"""
シェープファイルをPyShp で読み込み、
ArcGIS API for Python を使って Shapely のジオメトリから arcgis のジオメトリに変換後、
Spatially enabled DataFrame (SeDF) として返却する関数
"""
import shapefile
import pandas as pd
from arcgis.features import GeoAccessor
from arcgis.geometry import Geometry
#read file, parse out the records and shapes
sf = shapefile.Reader(shp_path, encoding=encoding)#encoding=kwargs['encoding'])
fields = [x[0] for x in sf.fields][1:]
records = [list(i) for i in sf.records()]
shps = sf.shapes() # Shapely のジオメトリ
arcshps = []
for shp in shps:
# Convert Shapely Geometry to ArcGIS Geometry; Version 2.0 にアップグレードしたら from_shapely がエラーになる
# 次期バージョンで修正されるまでは、次の対応をするとエラーは回避可能
# https://github.com/Esri/arcgis-python-api/issues/1173
geom = Geometry.from_shapely(shapely_geometry=shp, spatial_reference={'wkid': wkid})
arcshps.append(geom)
#write into a dataframe
df = pd.DataFrame(columns=fields, data=records)
df = df.assign(SHAPE=arcshps)
#Spatially enabled DataFrame へ変換
sdf = pd.DataFrame.spatial.from_df(df, geometry_column='SHAPE')
#不要なものを削除
del df, shps, arcshps, records, fields, sf
return sdf あとは、関数に必要なパラメータを指定し、Spatially enable DataFrame に読み込みします。 file_path=r"yourlocation\japan_ver83\japan_ver83.shp" #全国市区町村界はShift-JIS
sdf = sedf_from_shapefile(file_path, encoding='shift-jis', wkid=6668)
sdf.head() これでEsri が推奨している、Spatially enable DataFrame でのいろいろな操作が可能な状態になります。 c) Geopandas を経由してShift-JIS の シェープファイル をSpatially enable DataFrame に読み込み また、追加でGeopandas のインストールが必要となりますが、Geopandas が入っている環境であれば、Geopandas のDataFrame から、from_geodataframe() の関数を使って、より簡単にEsri が推奨している、Spatially enable DataFrame へ読み込むことも可能です。 import pandas as pd
import geopandas
from arcgis.features import GeoAccessor
file_path = r"yourlocation\japan_ver83\japan_ver83.shp" #全国市区町村界はShift-JIS
geo_df = geopandas.read_file(file_path, encoding='shift-jis') #geopandasはprjファイルも一緒に読み込むみたい
sdf2 = pd.DataFrame.spatial.from_geodataframe(geo_df)
sdf2.head() おわりに 本記事では、一度は必ず遭遇するシェープファイルの文字化け! その技術的な解説や原因や対処方法について記載してある、GitHub のページを紹介いたしました。 また、ArcPy が入っていないArcGIS API for Python の環境で、Shift-JIS の シェープファイルをSpatially enabled DataFrame(SeDF) へ読み込みする2つの方法について紹介しました。 Spatially enabled DataFrame(SeDF)の読み込み後の活用方法は、以前、「ArcGIS Field Maps で取得したトラッキングデータの保存とSpatially Enabled DataFrameを試す」でも触れたようにPandas のDataFrame でよく行う操作も可能ですし、米国Esri が提供しているGuide ページにもいろいろございますので、ご参照ください。 参考資料 ・シェープファイル または dBASE ファイル の LDID(Language driver ID)と *.cpg ファイル を調べる ・さわって覚える ArcGIS API for Python : Spatially Enabled DataFrame 編 ・Part-1 Introduction to Spatially enabled DataFrame ・Part-2 Data IO with SeDF - Accessing Data ・Part-3 Data IO with SeDF - Exporting Data
... View more
05-09-2022
07:45 PM
|
0
|
0
|
4038
|
DOC
|
はじめに 現地調査の際に、位置のトラッキングをお使いでしょうか? 位置のトラッキング は、ArcGIS Online(もしくはArcGIS Enterprise)の組織全体で利用できる機能で、ユーザーの現在地と過去の位置を記録する機能を提供します。 まだ利用したことがない方や、位置のトラッキングって何?、ArcGIS Field Maps でどのように使うの?という方は、最近、ArcGIS リソース集 にArcGIS Field Maps のスタートアップ ガイド が追加されましたので、そちらをご参照ください。 一方、ArcGIS API for Python を使用した位置のトラッキング機能の管理方法やデータへのアクセス方法は、Help に”Managing ArcGIS applications - Configuring Location Tracking” として説明されています。また、同じ内容を記載したノートブックが”Configuring Location Tracking and Track Views For Your Organization” として公開されており、それを翻訳したノートブックも公開 していますので、API でのアクセス方法が知りたい方は、そちらをご参照ください。 本ブログでは、ArcGIS Online 上のArcGIS Notebooks で作成した、次の操作を試すサンプル ノートブックの実装時のポイントを解説していきます。サンプル ノートブックは、整形したものをGitHub で公開 しておりますので、より詳細に内容を確認したい場合は、そちらを参照ください。 Field Maps で取得したトラック データへアクセス 特定の日時のデータをクエリして確認 Spatially Enabled DataFrame を試す クエリしたデータをフィーチャ レイヤー(Feature Layer)として保存 ※ ※ 上記の翻訳したノートブックでも記載していますが、ArcGIS Online のトラックは30日間のみ保存される仕様です。今回は、保存期間が経過した後でもデータとして利用するために、フィーチャ レイヤー(Feature Layer)としてArcGIS Online 上に保存しています。 なお、位置のトラッキングは、有償のArcGIS Developer Subscription で利用可能な「ArcGIS Online 組織向けプラン(開発およびテスト用途限定)」を利用し、ArcGIS Field Maps でトラッキングを行いました。 図:サンプル ノートブック ポイント解説 ここからは、ノートブックに書かれているコードの解説が中心になります。ArcGIS Online 上のArcGIS Notebooks の使い方に不安がある方は、最初に、以下の記事を一読いただくことをお勧めします。 はじめてのArcGIS API for Python : Notebook の紹介 はじめてのArcGIS API for Python:ArcGIS Notebooks を使用してWeb GIS を教える 0) GIS モジュールへのアクセス 以下は、ArcGIS Online 上のArcGIS Notebook を新規作成時に自動的に生成され、GIS モジュールにアクセスするものですので、そのまま利用します。 from arcgis.gis import GIS gis = GIS("home") 1) Field Maps で取得したトラックデータへアクセス 組織で位置のトラッキング が有効化されると 位置トラッキング サービスという新しいアイテムが作成され、FieldMaps で取得したトラック データは、このサービスにアップロードされます。 位置トラッキング サービス は2つのレイヤーで構成され、最初のレイヤーであるTracks は、各ユーザーの過去の位置情報の履歴を保存し、2つ目のレイヤーであるLast Known Locations は、Field Maps 等のTracker モバイル アプリ を利用している各ユーザーの最新の位置情報を格納します。 これらのレイヤーにはLocationTrackingManager を通して簡単にアクセスできますが、今回利用するのは、Tracks レイヤー(tracks_layer)です。 from arcgis.apps.tracker import TrackView # LocationTrackingManager にアクセス location_tracking = gis.admin.location_tracking # Tracks レイヤー はプロパティからアクセス可能 tracks = location_tracking.tracks_layer 2) Tracks レイヤー から location_timestamp フィールドで日付と時間を指定してクエリ Tracks に記録されている時間はUTCなので、クエリの条件文を作成する際には注意が必要です。 (JST時間からUTC時間に変換する際には、JST時間から -9時間した時間をUTC時間に設定します) 今回、Field Maps で位置のトラッキングを行ったのは、JST時間で2022年01月10日の15時30分~19時の間です。そのため、MapViewer でのwhere句 を参考にJST時間から-9時間したUTC時間に変換した条件設定をすると、次のようになります。 (location_timestamp BETWEEN timestamp '2022-01-10 06:30:00' AND timestamp '2022-01-10 10:00:00') AND (1=1) 上記の条件で、FeatureLayer.query() でクエリを行い、さらに戻り値のFeatureSet のプロパティsdfで、Spatially Enabled DataFrame(SEDF)にしてします。 # 抽出条件をUTC時間で設定 wh = "(location_timestamp BETWEEN timestamp '2022-01-10 06:30:00' AND timestamp '2022-01-10 10:00:00') AND (1=1)" # FeatureLayer.query() の戻り値はFeatureSet、FeatureSetプロパティsdfでSEDFを取得可能 query_tracks = tracks.query(where = wh, out_fields='*').sdf 3) クエリしたデータをフィーチャ レイヤー(Feature Layer)として保存 Spatially Enabled DataFrame(SEDF)に、to_featurelayer() という便利なメソッドがあるので、それを利用して、フィーチャ レイヤーとして保存します。 # FeatureLayer として2022年1月10日のトラックを保存 lyr = query_tracks.spatial.to_featurelayer(title='tracks_20220110', tags='tracks') 以上のように、フィーチャ レイヤーとして保存するだけであれば、10行もコードを書かずに済みます。 それだけではあまり面白くないため、ここからは別のアプローチとして、PandasのDataFrame を使った場合の、抽出、保存、ついでにグラフ表示やマップに表示を試してみたコードも紹介します。 2)’ 別のアプローチ ; Tracks レイヤーをPandas のDateFrame で条件抽出 Help のTracks レイヤー(tracks_layer)に記載されているように、tracks_layer はFeatureLayer です。そのため、まずはSpatially Enabled DataFrame (SEDF) のfrom_layer() 関数でDataFrame にデータを読み込みます。 # Spatially Enabled DataFrame (SEDF) にTracks レイヤー を読み込みます import pandas as pd sdf = pd.DataFrame.spatial.from_layer(tracks) 次に、 location_timestamp フィールドで日付と時間を指定して、今回のField Maps で対象としているトラッキングデータのみを、別のDataFrame に読み込みます。 # 上記のFeature Layer の BETWEEN 相当の条件でDataFrame に読み込みします import datetime as dt #2022-01-10 query_sdf = sdf[(sdf['location_timestamp'] >= dt.datetime(2022,1,10,6,30,0)) & (sdf['location_timestamp'] < dt.datetime(2022,1,10,10,0,0))] 2)'' Pandas のDataFrame でよく行う操作、グラフ表示や地図表示 「さわって覚える ArcGIS API for Python : Spatially Enabled DataFrame 編」で紹介したように、Spatially Enabled DataFrame (SEDF) は、一般的な Pandas の DataFrame に spatial というカスタムネームスペースを挿入して、空間的な機能を持たせているものです。そのため、Pandas のDataFrame でよく行う操作も行うことが可能です。GitHub で公開しているノートブック(リンク予定)では、次の操作を試したコードと結果を公開していますが、冗長になるため、ここではコードのみ記載します。 要約統計量の算出 #要約統計量の算出 query_sdf.describe() 特定の列を指定した統計値 #特定の列を指定した統計値の算出 query_sdf['speed'].mean() query 関数での抽出し、要約統計量を算出 #query 関数を使って平均速度以上のレコードの抽出 over_sdf = query_sdf.query('speed >= 1.503300') over_sdf.describe() その他にも、matplotlib でのグラフ表示(UTC時間)、マップにTracks レイヤーを表示も行っております。同様に、冗長になるため、ここでは実現するまでのコードのみ記載します。 matplotlib でのグラフ表示(UTC時間) # UTC から JST に変換してx:時間、y:スピード でグラフに表示してみます # 警告の回避のため明示的にDataFrameをcopy() query_sdf = query_sdf.copy() query_sdf['location_timestamp_jst'] = pd.to_datetime(query_sdf['location_timestamp'], utc=True).dt.tz_convert('Asia/Tokyo') # JST 時間に変換済みのx軸でグラフ表示 query_sdf.plot(x='location_timestamp_jst', y='speed') マップにTracks レイヤーを表示 my_map = gis.map('埼玉県川越市') my_map #セルに地図を表示 # Tracks レイヤーを追加 my_map.add_layer(tracks) 3)' 別のアプローチ ; 計算したlocation_timestamp_jst を含むフィーチャ レイヤー(Feature Layer)として保存 3) と同様、Spatially Enabled DataFrame(SEDF)に、to_featurelayer() という便利なメソッドがあるので、それを利用して、フィーチャ レイヤーとして保存します。 ※これはDataFrame でいろいろ操作した結果でも、フィーチャ レイヤーとして保存可能かを確認している操作になります。そのため、3) で保存したフィーチャ レイヤーと本質的に変わりありません。 # FeatureLayer として2022年1月10日のトラックを保存 lyr = query_sdf.spatial.to_featurelayer(title='tracks_20220110', tags='tracks') 最後に 今回の記事では、ArcGIS Developer Subscription で利用可能な「ArcGIS Online 組織向けプラン(開発およびテスト用途限定)」を利用し、ArcGIS Notebooks で次の操作を試すサンプル ノートブックの実装時のポイントを解説しました。 FieldMaps で取得したトラック データへアクセス 特定の日時のデータをクエリして確認 Spatially Enabled DataFrame を試す クエリしたデータをフィーチャ レイヤー(Feature Layer)として保存 トラック データのより高度な分析は、Learn ArcGIS で「ArcGIS Field Maps で取得した追跡データを分析する」として、データのローカルへの保存にはじまり、ArcGIS Pro を使用したさまざまな分析や視覚化について、紹介されていますので合わせてご参照ください。 また、コードでのより高度な分析は、米国Esri のGitHub に「Tracker Scripts」として、ArcGIS API for Python を使用したさまざまな分析や可視化について、紹介されていますので合わせてご参照ください。 ※ ご自身の組織のトラック データを振り返って分析をする必要がある際には、データのバックアップも忘れずに! 「ArcGIS Field Maps で取得した追跡データを分析する」に掲載されているコンテンツ一覧(2022年3月時点) ・追跡データで検査を検証する(英語の記事) ・追跡データで線形ヒートマップを作成する(英語の記事) ・位置の追跡データを使用してアニメーションを作成する(英語の記事) ・集約した追跡データを視覚化する(英語の記事) 「Tracker Scripts」に掲載されているノートブックとスクリプトの一覧(2022年3月時点) ノートブック; ・Quickstart Guide ・Basic Track Analysis ・Basic Track Analysis - PySpark ・Location Tracking Status ・Creating Track Lines ・Visualize Route Deviance ・Identify Inspected Buildings ・Find Dwell Times at Polygons ・Proximity Tracing ・Create an Aggregated Map Service スクリプト; ・Check Edit Location - README here ・Mirror LKL Layer - README here ・Polygon Cleanup Tracks - README here ・Generate Users Arcade Expression - README here ・Export Tracks From AGOL - README here 参考 【ブログでの参考記事】 さわって覚える ArcGIS API for Python : 基本編 (GIS モジュール編) さわって覚える ArcGIS API for Python : フィーチャ データ編 さわって覚える ArcGIS API for Python : マッピング、可視化編 さわって覚える ArcGIS API for Python : Spatially Enabled DataFrame 編 はじめてのArcGIS API for Python : Notebook の紹介 はじめてのArcGIS API for Python:ArcGIS Notebooks を使用してWeb GIS を教える 【本記事に関連した参考情報】 ArcGIS API for Python のHelp のGuide Managing ArcGIS applications - Configuring Location Tracking ノートブック Configuring Location Tracking and Track Views For Your Organization 上記のノートブックを翻訳したノートブック 本記事のサンプル ノートブック
... View more
03-10-2022
12:12 AM
|
0
|
0
|
1446
|
DOC
|
はじめに ArcGIS Online やArcGIS Enterprise Portal に登録したアイテムを広く組織で活用するためには、アイテムのタイトルの他、サマリー、説明、タグ、利用規約など詳細な情報の入力が必要となることがあります。 そうは言っても、アイテムの詳細な情報を入力するために一つ一つのアイテムを開いて、それらを入力・更新していく作業は、なかなか骨が折れる作業です。 米国Esri のパートナーであるGEO Jobe 社 のAdmin Tools の有償版だと、CSVからの一括更新が可能なようですが、今回はExcel × Python(ArcGIS API for Python)の合わせ技で、アイテム詳細を一括更新する方法をご紹介します。解説は不要ですぐにサンプルのExcel とPython のコードを確認したい方は、いつものようにGitHub で公開しておりますので、そちらをご参照ください。 ※ この方法は、2021年に公開した「3D 都市モデルの ArcGIS における活用事例を集めた活用サイト」に掲載してあるファイル ジオデータベース (FGDB) のアイテム詳細を更新・公開したときに実践した方法です。この活用サイトはArcGIS Hub Basic で構築しているため、コード内では特定グループとして、ArcGIS Hub で予め作成したサイトの”国土交通省 3D都市モデル「Project PLATEAU」の活用のコンテンツ” のグループid を指定しています。グループid は下図のようにArcGIS Online 上で確認できますが、id はArcGIS Hub で作成したサイトのグループ以外でも、ユーザーが所属している任意のものを指定いただけます。 なお、ArcGIS Hub でのサイトの作成や利用開始の方法は、「ArcGIS Hub スタートアップガイド」もしくは「A quick start guide to ArcGIS Hub Basic」等をご参照ください。 図 ー グループ id の例(弊社の「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」グループ) 1 アイテムの詳細を一括更新する仕組み 1.1 アイテムのプロパティ まずは、ArcGIS API for Python でアイテム詳細を更新するAPI を確認してみます。API リファレンスによると、アイテム詳細の更新はarcgis.gis.Item クラスの update(item_properties=None, data=None, thumbnail=None, metadata=None) メソッドで可能なようで、item_properties で指定可能なディクショナリ key の一覧は、Helpにtype, typeKeywords, description, title, url, tags, text, snippet, extent, spatialReference, accessInformation, licenseInfo, culture, access, commentsEnabled と記載があります。 今回のサンプルでは、title, snippet, description, tags, licenseInfo, accessInformation を更新対象にしますが、より直感的に理解をしていただくために、item_properties に指定する key と実際の画面を対応させてみると、次のようになります。 id : アイテムのid title : タイトル snippet : サマリー description : 説明(HTMLを利用可能) tags : タグ(複数の場合は、カンマ区切り) licenseInfo : 利用規約 accessInformation : 著作権 1.2 アイテム詳細の情報をExcel に整理 整理するアイテム詳細の情報がわかったので、Sheet1(サンプルのExcel ファイルの場合は、”更新用Sheet1”というシート名にしています) の1行目にそれぞれの item_properties の key を入力し、2行目以降にそれぞれのアイテムのプロパティを入力します(コード内で .to_dict() でディクショナリに変換したときのキーとして利用するため、1行目の列名はitem_properties のkey と厳密に一致させる必要があることに注意が必要です)。 なお、description 列はHTMLでより見やすい記述を統一して行うため、実際にはVBAマクロを使って更新しました。今回の公開にあたりマクロ付きExcel ファイルの配布は、セキュリティ上問題となる可能性があるため、マクロのコードを参考までに”UpdateDescription_SampleVBA.txt”として置いてありますので、必要に応じてご参照ください。 図 ー Excel での整理例(サンプルのExcel ファイルでの入力例:開発テスト用の環境で使用したものです) 1.3 アイテムの詳細を一括更新するコードの解説 Excel に整理したら、後はノートブック に記載してあるコードをご自身の環境に合わせて少し変更して実行するだけです。具体的にはノートブックのセル内の、”your_xxx”、”new_owner_name”、”share_group_id”で記載している個所をご自身の環境に合わせて書き換えが必要です。 ノートブックにもコメントを記載してありますが、再度、ポイントとなる処理の解説をしておきます。 (1) Pandas のDataFrame にExcel データを読み込み 最初に、Pandas のDataFrame にExcel を読み込みます。 import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx"
df = pd.read_excel(excel_file) ※ xlrdバージョン2.0.0 から対応フォーマットが"xls"のみに変更されたとのことで、環境によっては pd.read_excel で"xlsx"を読み込むときに、次のように、openpyxl をengine として指定する必要があります。ArcGIS Pro でクローンした環境の場合は、xlrdのバージョンは1.2.0 なので、基本的にはengine の指定は必要ありません(ArcGIS Pro でのクローン環境の作成方法は、[ArcGIS Developer 開発リソース集] - [arcgis パッケージをアップグレードする] - [ArcGIS Pro 2.3 以上の環境の場合] をご参照ください)。 import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx"
df = pd.read_excel(excel_file,engine='openpyxl') (2) ArcGIS Online の組織サイトに接続し、アイテム情報の更新と、特定グループに共有 次に、ArcGIS Online の組織サイトに接続し、それぞれの行に対してExcelの 'id' をもとにアイテムを取得し、そのアイテムの'title', 'snippet', 'description', 'tags', 'licenseInfo', 'accessInformation' をitem.update() で更新しています。ついでに、アイテムのprotect() で削除防止を有効に設定、さらにshare() で組織と特定グループにアイテムを共有する設定を行っています。 上記でも解説しましたが、item_properties で指定可能なディクショナリ key と、画面の文言の対応は、1.1 アイテムのプロパティ でご説明した通りです。 from arcgis.gis import GIS
gis = GIS("https://www.arcgis.com/", "your_username", "your_password")
for index, row in df.iterrows():
item_id = row[0] # id を取得
item_properties = row[1:7].to_dict() # title~accessInformation 列をdictionary として取得
my_item = gis.content.get(item_id) # アイテムを取得
my_item.update(item_properties) # item.update() で、アイテムのtitle~accessInformation の情報を更新
my_item.protect(enable = True) # うっかり削除を防止するため、アイテムの削除防止を有効に設定
my_item.share(org= True, groups=['share_group_id']) # 組織と特定グループに共有 - テスト環境;「Open Data 共有のコンテンツ」(id:f862b4f5d32f435596795947df012042)、本番環境;「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」(id:d568e2190c4f456f8bd812c8e07c719a) 2 ArcGIS Hub のカタログサイトに公開する仕組みのポイント解説 ※ 本来、上記までの「アイテムの情報を一括更新する仕組み」とここからの仕組みは、操作する人が異なっていたり、業務上のプロセスも異なる場合があるため、別のノートブックに分けておいた方が得策かもしれません。今回は、便宜上同じノートブック ファイルに記載しており、その解説になっておりますので、ご了承ください。 仮にサンプルのノートブック ファイルを分割する場合は、ここからの仕組みのコードの前に必要な処理は、(1) Pandas のDataFrame にExcel データを読み込み で説明した、以下のコードとなります。 import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx"
df = pd.read_excel(excel_file) 2.1 ArcGIS Hub のカタログサイトに公開するコードの解説 (3) 管理者でArcGIS Onlineの組織サイトに接続し、アイテム所有者の変更と、特定グループへの共有、パブリックに公開を実施 最後のステップとして、最初にreassign_to() でアイテムの所有者を変更し(所有者変更は必須ではありませんが、今回の場合は、個人から弊社の公開用アカウントに変更しています)、その後、新しい所有者がshare() で組織と特定グループにアイテムを共有にする設定とパブリック公開を実施しています。 gisadmin = GIS("https://www.arcgis.com/", "your_admin_username", "your_admin_password") # 管理者
for index, row in df.iterrows():
item_id = row[0] # id を取得
my_item = gisadmin.content.get(item_id)
# 最初に所有者変更
my_item.reassign_to("new_owner_name") # テスト環境;"kataya@dev3admin"、本番環境:"Esri_Japan"
# ArcGIS Hubでの公開するコンテンツとして反映させるために、所有者変更の後に、再度、組織の特定グループ共有を行う
my_item.share(everyone = True, org= True, groups=['your_share_group_id']) # 組織と特定グループに共有 - テスト環境;「Open Data 共有のコンテンツ」(id:f862b4f5d32f435596795947df012042)、本番環境;「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」(id:d568e2190c4f456f8bd812c8e07c719a) 更新後のイメージ スクリプトを実行し終えると、単独のアイテムとしてはArcGIS Online 側からみると、次のようになっています。 図 ー 単独のアイテムの更新後の例(ArcGIS Online のアイテム詳細:開発テスト用の環境の「3D都市モデル (Project PLATEAU)宇都宮市 ファイルジオデータベース」) また、ArcGIS Hub のカタログサイトでは、次のように見えます。 図 ー 単独のアイテムの更新後の例(ArcGIS Hub のカタログサイトのアイテム詳細:開発テスト用の環境のカタログサイト) ここでカタログサイトの画面中央の「3D都市モデル 宇都宮市(Project PLATEAU)ファイルジオデータベース」に注目してみると、上記のArcGIS Online のアイテム詳細の説明 (Excel だとdescription 列)の107文字相当が表示されています。つまり、ArcGIS Hub でのデータ公開も視野に入れた時には、アイテム詳細の説明 の文章の最初の方に、必要な情報を優先して記載しておく事が、二重入力の手間を省いてデータを公開する一つのテクニックだということです。 まとめ 今回の記事で紹介したExcel × Python(ArcGIS API for Python)の組み合わせで、ArcGIS Online のアイテムの情報を一括更新するだけでなく、ArcGIS Hub 側での登録の手間を省いて、最終的には105 のアイテムを公開することが出来ました(参考:「3D都市モデル ファイルジオデータベース」のカタログ)。 ・ノートブック ファイル、・Excel のサンプル、・description 列を更新するVBAマクロのサンプル の3ファイルをいつものようにGitHub で公開しておりますので、ご活用ください。 また、アイテムを組織内で活用する際のポイントとして、過去に「アイテム管理のポイントの紹介(前編、後編)」を行った記事もありますので、あわせてご参照ください。 参考資料 ・GEO Jobe 社 のAdmin Tools ・3D 都市モデルの ArcGIS における活用事例を集めた活用サイト 【ArcGIS Hub】 ・ArcGIS Hub Basic の概要 ・ArcGIS Hub スタートアップガイド ・A quick start guide to ArcGIS Hub Basic 【ブログ記事】 ・アイテム管理のポイントの紹介 - 前編 -:タグを効果的に活用しましょう ・アイテム管理のポイントの紹介 - 後編 -:カテゴリを活用しましょう 【コード、API】 ・Pure Python でCSV からREST API で更新するスクリプト ・ArcGIS API for Python のガイド ・ArcGIS API for Python のAPI リファレンス(class arcgis.gis.Item) ・アイテム情報の更新:update(item_properties=None, data=None, thumbnail=None, metadata=None) ・アイテムの共有:share(everyone=False, org=False, groups=None, allow_members_to_edit=False) ・所有者の変更:reassign_to(target_owner, target_folder=None)
... View more
01-31-2022
08:26 PM
|
0
|
0
|
1546
|
DOC
|
はじめに 初めてArcGIS API for JavaScript を学ぶ方を対象に、2018年2月から「はじめての Web マッピングアプリケーション開発」のシリーズとして、本開発ブログの中で、次のように連載記事を投稿しました。 地図表示編 レイヤー表示編 レイヤーの可視化編 ポップアップの設定編 Web マップの作成・表示編 グラフィック編 クエリ編 この記事やその時に公開したサンプルコードのGitHubは、[GIS実習オープン教材] - [インターネットにおけるGIS技術の活用の教材] - [WEB MAP操作・作成入門のArcGIS API for JavaScript入門] でも、参考として記載されております。 サンプルの最新化 一方で、最初の記事投稿から3年以上経過しており、ArcGIS API for JavaScript のバージョンも当初利用していたバージョン 4.6 から4.22 (2021年12月リリース)になっており、バージョンアップの過程で大幅に機能が進化しているほか、使用している技術の変更、サポートブラウザの変更などが行われています。また、サンプル内で参照していたデータの公開が終了しているため、APIで実装したものを動作させながら、コードと対比しながら動きを確めることができません。※ 各バージョンでの機能詳細はArcGIS API for JavaScript の新機能ページ をご参照ください。 基本的なAPI の使い方に変更はありませんが、初めて触れる人は写経するか、コピー&ペースト からはじめる方がほとんどだと思いますので、本シリーズの連載記事で提供していたサンプルを"元ファイル名_2021.html" として書き換え、元の記事に「※2021年12月追記」として、違いがあるところを追記しております。 各サンプル("元ファイル名_2021.html")での主な変更点は、次のとおりです。 ArcGIS API for JavaScript のSample Code や近年のトレンドにあわせて、アロー関数に書き換え。 APIのバージョン 4.16 以降、Dojo に依存しなくなったので、dojo/on で記述していた箇所を書き換え。 愛知県の地価公示のオープンデータは削除されているので、データソースをLiving Atlas で公開している全国の公示地価に変更し、それに伴い愛知県のみになるようdefinitionExpression に条件を設定してフィルタリング。 全国市区町村界も2021年版にデータソースを変更し、同様に愛知県のみになるようdefinitionExpression に条件を設定してフィルタリング。 UI の最新化 2021年3月のEsri Developer Summit の「Esri's Design System: Build Compelling Web Apps Faster Using the New Web Component Library (英語)」で発表したように、現在、UI のデザインに利用できるCalcite Design System がベータ版として提供開始されています。 マッピング アプリケーションにこれを使った例としては、新しい Map Viewer が代表的な例ですが、その他にも、まだ数は少ないですが、サンプルとして次のようなものが提供されています。 ・[DS21] Simple Web Mapping Application ・ArcGIS API for JavaScript のSample Code (検索窓に"calcite"と入力) ・ArcGIS Platform とオープンソースソフトウェアを使用したルート検索アプリ開発の発展形 本記事では、Query top features from a FeatureLayer や、Query features with pagination のCalcite component を使ったサンプルを参考にして、calcite-action, calcite-panel, calcite-label, calcite-checkbox, calcite-input, calcite-button を使った操作UI に変更してみました(下図参照)。 いつものようにソースコードは、ESRIジャパンのGitHub で公開していますが、その手順を説明します。 a ) 最初に、Calcite component を使うために、<head> タグ内に以下のコードを追加します。 <!--Calcite components CDN-->
<script type="module" src="https://js.arcgis.com/calcite-components/1.0.0-beta.62/calcite.esm.js"></script>
<link rel="stylesheet" type="text/css" href="https://js.arcgis.com/calcite-components/1.0.0-beta.62/calcite.css"/> b) <style> タグでパネル用のスタイルを定義を追加します。 <style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
.panel-side {
padding: 0px;
width: 390px;
height: 38%;
position: absolute;
top: 10px;
left: 60px;
z-index: 60;
opacity: 0.9;
}
</style> c) <body> タグ内のviewDiv の下に、Calcite component を使った操作用UI を定義します。 <div id="viewDiv"></div>
<!--2021 操作用UI-->
<calcite-action
id="toggle-button"
text="Toggle controlsDiv"
title="パネルを畳む"
icon="chevrons-left"
scale="s">
</calcite-action>
<calcite-panel id="controlsDiv" class="panel-side">
<br />
<calcite-label alignment="center" scale="l">
Calcite components を使った操作パネル
</calcite-label>
<div id="content" style="padding: 5px">
<calcite-label><b>レイヤーの表示/非表示の操作</b></calcite-label>
<label>
<calcite-checkbox id="gsipaleLyr"></calcite-checkbox> 地理院タイル-淡色地図 (WebTileLayer) <br />
</label>
<label>
<calcite-checkbox id="chikakojiLyr" checked></calcite-checkbox> 公示地価 (FeatureLayer) <br />
</label>
<label>
<calcite-checkbox id="cityareaLyr"></calcite-checkbox> 全国市区町村界 (FeatureLayer) <br />
</label>
<br />
<label>
<calcite-label><b>クエリの操作</b></calcite-label>
<calcite-input id="attrTxt" prefix-text="市区町村名" type="text"
placeholder="例:豊田市" max-length="10"></calcite-input>
<div style="width: 360px; max-width: 100%; display: flex;flex-direction: row;">
<calcite-button id="queryButton" width="half" appearance="solid"
alignment="center" scale="m">検索</calcite-button>
<calcite-button id="clearButton" width="half" appearance="outline"
alignment="center" scale="m">クリア</calcite-button>
</div>
</label>
</div>
<div id="resultsDiv" style="padding: 10px">
<span id="resultText"></span>
</div>
</calcite-panel> UI 操作にかかわるコードのうち、今回変更したものは、チェックボックスのイベントリスナーのイベントが"change"から"calciteCheckboxChange"に変更しています。 const gsipaleToggle = document.getElementById("gsipaleLyr");
const chikakojiToggle = document.getElementById("chikakojiLyr");
const cityareaToggle = document.getElementById("cityareaLyr");
gsipaleToggle.addEventListener("calciteCheckboxChange", () => {
gsipaleLyr.visible = gsipaleToggle.checked;
});
chikakojiToggle.addEventListener("calciteCheckboxChange", () => {
chikakojiLyr.visible = chikakojiToggle.checked;
});
cityareaToggle.addEventListener("calciteCheckboxChange", () => {
cityareaLyr.visible = cityareaToggle.checked;
}); また、操作パネルの表示/非表示の切り替えのコードも追加しています。 const resultPanel = document.getElementById("controlsDiv");
const toggleButton = document.getElementById("toggle-button");
view.ui.add(toggleButton, "top-left");
toggleButton.addEventListener("click", () => {
if (resultPanel.clientWidth == 390) {
resultPanel.style.width = "0px";
toggleButton.icon = "chevrons-right";
toggleButton.title = "パネルを展開";
} else {
resultPanel.style.width = "390px";
toggleButton.icon = "chevrons-left";
toggleButton.title = "パネルを畳む";
}
}); 上記までで、最新化の準備が整ったので、ここからはポップアップ設定その2です。 ポップアップの設定その2 過去の「はじめての Web マッピングアプリケーション開発 : ポップアップの設定編」の記事でとりあげたように、Popup で表示するコンテンツは PopupTemplate を使用して定義できます。 Help の解説を見ると、PopupTemplate のcontent プロパティに定義可能なものはString, Popup elements(text, media, fields, attachments, custom の5種類), promise, function が記載されています。 過去の記事は、そのうちPopup elementsのfields を定義する方法を解説し、ステップアップとしてtext, fields を複合して定義する方法を示したものです(具体的な設定は、2021年のサンプル の201行目~で確認できます)。 今回の記事では、function を定義する方法を解説し、ポップアップ内に、よりリッチな情報を表示してみます。なお、本記事を執筆するにあたり、PopupTemplate - use functions to set content のサンプルを参考にしました。 ポイントとなるのは、content プロパティへのfunction の設定方法と、function での返却の仕方です。 まずは、公示地価用のPopupTemplate を作成し、レイヤーにテンプレートを適用します。ここで必要なのはcontent プロパティにfunction 名を指定するのと、outField プロパティにポップアップでレンダリングするのに必要なフィールドを指定することです。 // 公示地価用のPopupTemplate の作成
const chikakojiPopupTemplate = {
title: "公示地価: {L01_001}", //標準地コード // Popup のタイトルを設定
outFields: ["*"], // popupで使うフィールドを指定
content: landpriceChange, // function 名
fieldInfos: [
{
fieldName: "L01_090", // H29
format: {
digitSeparator: true, // 数値の3桁区切りを有効にする
places: 0 // 整数で表示する
}
},
{
// ~省略~
}
]
};
// 地価公示レイヤーに PopupTemplate を設定する
chikakojiLyr.popupTemplate = chikakojiPopupTemplate; 次に、content で指定した関数で、新規に作成したdiv 要素を作成し返却するようにします。このとき、関数内ではoutField プロパティで指定した属性にアクセスできるため、属性の値を使って様々な処理し、その結果をhtml に整形し、div 要素の中身を記述しています。 ※ 本記事内では省略していますが、平成29年~令和3年のそれぞれの年の変動率と、平均変動率を算出しています。興味がある方は、ソースコードを確認してみてください。 // content で指定するfunction の定義
function landpriceChange(feature) {
const div = document.createElement("div");
//
//~省略~
//
// 住所フィールドへのアクセス例
const address = feature.graphic.attributes.L01_023;
//~省略~
//
div.innerHTML = "住居表示:" + (address ? address : "") + "</br>" +
//~省略~
"</span></li>" +
"</ul>";
return div;
}; ステップアップ さらに、htmlでの記述のみならず、Chart.js を使ってグラフを作成し、div 要素の子要素として追加することにより、グラフを追加することも可能です。 // content で指定するfunction の定義
function landpriceChange(feature) {
const div = document.createElement("div");
//
//~省略~
//
// 住所フィールドへのアクセス例
const address = feature.graphic.attributes.L01_023;
//~省略~
//
div.innerHTML = "住居表示:" + (address ? address : "") + "</br>" +
//~省略~
"</span></li>" +
"</ul>";
// チャート作成して追加
const chartCanvas = createHorizontalBarChart(diff1, diff2, diff3, diff4, geoMean);
div.appendChild(chartCanvas);
return div;
}; 今回作成したサンプルは、以下で動作を確認できます。 ・ポップアップその2:https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/popup/popup_plus.html おわりに 本記事では、 2018年に連載した「はじめての Web マッピングアプリケーション開発」のサンプルを最新化 UI の最新化としてのCalcite component を使った操作パネルを試行 PopupTemplate のcontent プロパティにfunction を定義し、よりリッチなポップアップを実現する方法を例示 を行った概要を紹介させていただきました。 なお、クエリの操作については、今のところ処理は未実装です。そのうち、改めてご紹介したいと思います。 2022年7月に追加したものに更新しています。 関連リンク ArcGIS API for JavaScript (ArcGIS for Developers)
... View more
12-20-2021
09:20 PM
|
0
|
0
|
1614
|
DOC
|
はじめに ArcGISブログの「PLATEAU の 3D 都市モデルの活用サイトが公開されました!」でご紹介したように、国土交通省都市局が推進する 3D 都市モデル「Project PLATEAU」の、CityGML 形式のデータを変換するツール(3D 都市モデルデータ変換ツール for ArcGIS)、および変換済みの全56都市分のファイル ジオデータベースを公開し、「3D 都市モデルの ArcGIS における活用事例を集めた活用サイト」から、アクセスできるようにしています。 加えて米国Esri では、2021年3月のEsri Developer Summit の「Indexed 3D Scene Layer (I3S) Support in Open Frameworks (英語)」で発表している、次のような取り組みも行っております。 1) loaders.gl や deck.gl でのI3Sのサポート ( 参考: loaders.gl のI3S Loaderのサンプル 、deck.gl のTile3DLayerのリファレンス) 2) 3D Tiles形式とI3S形式の相互変換ツール(Tile converter) ( 参考: loaders.gl のTile converterのリファレンス) 3) Cesium.JSにおけるI3S 1.7 のサポートに向けた取り組み (参考: cesium のGitHub のプルリクエスト) 4) pdao.io を使ったPCSL から LASへの変換 (参考: PDAL のreaders.i3s のリファレンス) 今回は上記の2) のTile converterのリファレンス や Indexed 3D Scene Layer (I3S) Support in Open Frameworks を参考にしてWindows 10の環境に環境構築を行い、3D 都市モデル(3D Tiles)の建物をシーン レイヤー パッケージ(SLPK)に変換し、ArcGIS Online に登録してシーン ビューアで表示することを試してみました。 事前条件 Tile converter を使う場合、次の3つが必要になります。 Node.js GeographicLib で楕円体から重力補正したフォーマットへの計算時に利用するジオイド データセット(*.pgmファイル) アーカイバ(Windows の場合は7-zip)。 ※2. は下記の環境構築に記載の npx tile-converter --install-dependencies 時に、デフォルトで使用する"egm2008-5.pgm"がインストールされます。デフォルト以外のファイルを利用する場合は、 GeographicLib から自分で取得して配置し、オプションで指定することが可能です。 ※3. はデフォルトパス(C:\Program Files\7-Zip\7z.exe)以外にインストールしている場合、オプションで指定することが可能です。 環境構築 a) フォルダーの作成と移動 コマンド プロンプトを起動し、Tile converter をインストールするフォルダーを作成し、ディレクトリを移動します(今回の例では[tile_converter] というフォルダを作成し、移動しています)。 mkdir tile_converter
cd tile_converter b) インストール 次にTile Converterをインストールします。 npm i @loaders.gl/tile-converter c) デフォルトのジオイド データセットのインストール 最後にデフォルトのジオイド データセットをインストールします(deps フォルダー下に"egm2008-5.pgm"ファイルがインストールされます)。 npx tile-converter --install-dependencies 以上で環境構築は完了ですので、実際にデータを入手して変換を行います。 3D TilesからI3S への変換 今回は、G空間情報センターの3D都市モデル ポータルサイトから八王子市の3D Tilesが入ったデータをダウンロードし変換してみます。 ダウンロードしたzipファイルを解凍後、”13201_hachioji-shi_building”のデータを、Tile converterのリファレンス を参考にしながら、次のようなコマンドで変換しました。 npx tile-converter --input-type 3DTILES --tileset ./13201_hachioji-shi_3DTiles_GeoPackage_Json/01_building/13201_hachioji-shi_building/13201_hachioji/tileset.json --name 13201_hachioji-shi_building_3dtiles --output ./output --slpk 結果として、output フォルダーの下に"13201_hachioji-shi_building_3dtiles.slpk" という、シーン レイヤー パッケージが出来上がります。 ここまで出来ると、後はArcGIS Pro でシーン レイヤー パッケージ(slpk)を直接読み込んで表示するか、ArcGIS Enterprise / ArcGIS Online に登録して、シーン ビューアで確認するかです。 今回は、クレジットの心配が少ない有償のArcGIS Developer Subscriptionで利用可能なArcGIS Onlineの組織サイト(開発およびテスト用途限定)に登録し、シーン ビューアで見てみます。※開発およびテスト用途限定ですが、操作は通常のArcGIS Online と全く変わりません。 TIPS-A!: ArcGIS Pro でシーン レイヤー パッケージ(slpk)を直接読み込む場合でも、ファイル ジオデータベース内のフィーチャクラスを読み込む場合に比較して、高速に描画されます。 ホスト シーン レイヤーの公開 ArcGIS Online にログイン後、コンテンツページの[マイ コンテンツ]タブから、 [新しいアイテム] をクリックします。 [お使いのデバイス] をクリックしてデバイスからファイルを選択で、変換した"13201_hachioji-shi_building_3dtiles.slpk" を選択します。 画面に表示される追加する方法として、下の画面のように"13201_hachioji-shi_building_3dtiles.slpk を追加してホスト シーン レイヤーを作成" を選択し、[次へ] をクリックします。 必要に応じてタイトル、フォルダーを変更します。また、必要に応じてタグ、サマリーを入力し、[保存] をクリックします。 上記までの操作によって、ArcGIS Online へのアイテム登録とシーン レイヤーの作成が開始されます。 シーン レイヤーの作成までが終了すると、[シーン ビューアで開く] がアクティブな状態になり、シーン ビューアで操作することが可能です。 シーン ビューアで試す [シーン ビューアで開く]をクリックし操作してみました。一見よさそうだったのですが、どうも建物がないところが。。。 確認のため、「3D 都市モデルの ArcGIS における活用事例を集めた活用サイト」で公開しているファイル ジオデータベースを利用し、八王子市のlod1_Building, lod2_Building のそれぞれのフィーチャ クラスからシーン レイヤー パッケージ(SLPK)を作成し、同様にホスト シーン レイヤーを公開して、シーン ビューアに追加して見てみました。 TIPS-B!:シーン レイヤー パッケージ(SLPK)の作成には、ArcGIS Pro の[3D オブジェクト シーン レイヤー パッケージの作成 (Create 3D Object Scene Layer Package) ] のジオプロセシングツールを利用します。詳細な操作方法は、ArcGIS ProのHelpの"3D オブジェクト シーン レイヤー パッケージの作成 (Create 3D Object Scene Layer Package) (データ管理)"をご参照ください。 TIPS-C!:編集可能なWeb レイヤーとしての利用や、フィーチャ クラスに設定してあるコード値ドメインをそのまま使いたい場合は、ArcGIS Pro のシーンに、それぞれlod1_Building, lod2_Building のフィーチャ クラスを追加後、[コンテンツ] ウィンドウで 3D レイヤーを右クリックし、[共有] をポイントして [Web レイヤーとして共有] で、公開する必要があります。詳細な操作方法は、ArcGIS Pro のHelpの”関連するフィーチャ レイヤーを含むシーン レイヤーの編集”をご参照ください。 黒で表示されるのが、今回、Tile Converterで変換した建物で、やはり、一部の建物の変換が上手くいっていないものがあるようです。 図 - シーン レイヤー パッケージの作成方法の違いによるシーン レイヤーの比較 まとめ シーン レイヤー パッケージ(SLPK)の作成は、通常だとArcGIS Pro の[3D オブジェクト シーン レイヤー パッケージの作成 (Create 3D Object Scene Layer Package) ]のジオプロセシングツールを使って作成するのが一般的なワークフローです。 ですが、今回の記事ではあえてオープンソースのTile converter を使って3D Tiles からSLPK に変換して試してみました。変換されたデータの結果はまだまだな部分がありますが、それは今後の開発に期待したいと思います。 国土交通省都市局が推進する 3D 都市モデル「Project PLATEAU」の取り組みにより、今までより簡単に3Dデータが入手できるようになりました。 ArcGIS ではArcGIS Pro, ArcGIS Enterprise / ArcGIS Online の製品をはじめ、3Dに対応した各種APIが揃っており、さらにUnreal Engine / Unity に対応したSDKのリリースへの準備も進んでいます。 これを機会に、ArcGIS 製品を活用して3D GISの世界への準備を始めてみてはいかがでしょうか? おまけ:ArcGIS API for JavaScript で試すには? ArcGIS API for JavaScript での動作確認は、Intro to SceneLayer のSample Code を使うと、次のように元のサンプルから2箇所を変更することで、すぐに動作確認が可能です。 <html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Intro to SceneLayer | Sample | ArcGIS API for JavaScript 4.21</title>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.21/esri/themes/light/main.css"
/>
<script src="https://js.arcgis.com/4.21/"></script>
<script>
require(["esri/Map", "esri/views/SceneView", "esri/layers/SceneLayer"], (
Map,
SceneView,
SceneLayer
) => {
// Create Map
const map = new Map({
basemap: "topo-vector", //"dark-gray-vector",
ground: "world-elevation"
});
// Create the SceneView
// サンプルからの変更-その1
const view = new SceneView({
container: "viewDiv",
map: map,
camera: {
// position: [-74.0338, 40.6913, 707],
// tilt: 81,
// heading: 50
position: [139.375, 35.59, 5000],
tilt: 30,
heading: 10
}
});
// Create SceneLayer and add to the map
// サンプルからの変更-その2
/*
開発用のArcGIS OnlineにホストしたシーンレイヤーのアイテムID
a) 3D TilesからSLPKに返還してシーンレイヤーにしたもの
id: "691330dc93e34bfdb48f2432b57e3798"
b) フィーチャクラス(lod1_Building)からSLPKを作成してシーンレイヤーにしたもの
id: "3addcce0f74f475187b8ae95bd73c3e3"
c) フィーチャクラス(lod2_Building)からSLPKを作成してシーンレイヤーにしたもの
id: "9905b40c966448b89f530efa9cb75578"
*/
const sceneLayer = new SceneLayer({
portalItem: {
//id: "2e0761b9a4274b8db52c4bf34356911e"
id: "691330dc93e34bfdb48f2432b57e3798"
},
popupEnabled: true //false
});
map.add(sceneLayer);
// Create MeshSymbol3D for symbolizing SceneLayer
const symbol = {
type: "mesh-3d", // autocasts as new MeshSymbol3D()
symbolLayers: [
{
type: "fill", // autocasts as new FillSymbol3DLayer()
// If the value of material is not assigned, the default color will be grey
material: {
color: [244, 247, 134]
}
}
]
};
// Add the renderer to sceneLayer
sceneLayer.renderer = {
type: "simple", // autocasts as new SimpleRenderer()
symbol: symbol
};
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html> おまけ:I3S Loader での表示 別の確認手段として、GitHub のI3S Loader のサンプルをもとに、同じシーン レイヤーを表示してみました。こちらもやはり、一部の建物の変換が上手くいっていないものがあることがわかります。 図 - loaders.gl のI3S Loader でのシーン レイヤーの表示例 関連情報 ・3D 都市モデルの ArcGIS における活用事例を集めた活用サイト ・3D 都市モデルデータ変換ツール for ArcGIS ・loaders.gl のI3S Loaderのサンプル 、GitHub リポジトリ ・Tile converter のリファレンス ・Indexed 3D Scene Layer (I3S) Support in Open Frameworks (英語) ・ArcGIS Pro Help "3D オブジェクト シーン レイヤー パッケージの作成 (Create 3D Object Scene Layer Package) (データ管理)" ・ArcGIS Pro Help ”関連するフィーチャ レイヤーを含むシーン レイヤーの編集”
... View more
10-06-2021
09:47 PM
|
0
|
0
|
7958
|
DOC
|
はじめに 2020年11月18日に「地理院地図Vector」(仮称) をArcGIS で表示してみました-第2弾 として、一部、APIで非対応のものを除外した標準地図、淡色地図、白地図の3つのスタイルファイルを用意し、BasemapGallery からそれらを使うサンプルアプリケーションを紹介しました。 その後、ArcGIS API for JavaScript バージョン 4.18 (2021年1月21日に国内サポートを開始)から、Expression式 などAPIで非対応だったものが実装され、より地理院地図Vectorに近い地図描画が可能になりました。 この対応により、ArcGIS API for JavaScript でも、Style Specification に準拠した地理院地図Vector風のスタイルファイルをそのまま使って、簡単に「地理院地図Vector」(仮称)を利用することが可能です。 スタイルファイルの準備 公開されているスタイルファイルをそのままでも利用可能ですが、せっかく日本全域のベクトルタイルが使えるので、スタイルファイルの縮尺制限の記述を削除("maxzoom": 16, "minzoom": 4, を削除)したスタイルファイルを用意しました。 ※ 取り消し線のところを各スタイルファイルから削除
/{z}/{x}/{y}.pbf"], "maxzoom": 16, "minzoom": 4, "attribution": ・地理院地図Vectorの標準地図をベースにした縮尺制限を削除したスタイル(std_edit2.json) ・地理院地図Vectorの淡色地図をベースにした縮尺制限を削除したスタイル(pale_edit2.json) ・地理院地図Vectorの白地図をベースにした縮尺制限を削除したスタイル(blank_edit2.json) サンプルアプリケーション 1) BasemapGalleryで地理院地図Vector風の地図を使うアプリ(ArcGIS API for JavaScript 4.18 対応版) 前回の記事のサンプルアプリケーションから変更するのは、APIバージョンを4.18に変更することと、VectorTileLayer のURLを上記の新しいスタイルファイルへを変更するだけです。 // API のバージョンを変更
<link rel="stylesheet" href="https://js.arcgis.com/4.16/esri/themes/dark/main.css" />
<script src="https://js.arcgis.com/4.16/"></script>
↓↓↓
<link rel="stylesheet" href="https://js.arcgis.com/4.18/esri/themes/dark/main.css" />
<script src="https://js.arcgis.com/4.18/"></script> // 新しいスタイルファイルへURL を変更
const stdVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/std_edit.json",
↓↓↓
const stdVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/std_edit2.json", 変更を加えたサンプルアプリケーションは、こちらから動作を確認できます。 以前のバージョンでは表示できていなかった、ラベル等も表示されるようになっていることが確認できると思います。 Sample App 1(JS API 4.16) Sample App 1(JS API 4.18) 2) Swipe ウィジェットでベクトルタイルの重なり具合を確認するアプリ 現在、地理院では、地理院地図と地理院地図Vectorとして両方の地図をメンテナンスして頂いていますが、地理院地図の更新の方が先に行われているようです(2020年4月1日から、群馬県八ッ場ダムが運用開始になったときに、地理院地図Vectorがまだ更新されていないことが、Twitterで話題になっていました)。 その更新時期を一つのアプリケーションで確認できるよう、Swipe ウィジェットを使ったサンプルアプリケーションを作成してみました。 画面左側に表示しているのが地理院地図Vector風の標準地図で、画面右側のBasemapGallery で切り替えした地図と確認ができます。 右の地図を「地理院タイル - 淡色地図」に切り替え、現在の築地市場の跡地を見てみると、地理院地図Vector風の地図ではまだ市場の建物がまだみえるので、地図更新がまだされていないのが確認できると思います。 Sample App 2 (Swipe) このサンプルアプリケーションでは、地理院タイルの航空写真も表示できるようになっています。山岳地域では等高線があると、空中写真だけではわかりずらい地形の状況を確認することができ、ベクトルタイルで提供されているメリットの一つを実感できると思います(鹿児島県の桜島:昭和火口付近を表示)。 Sample App 2 (ベクトルタイルと航空写真の重ね合わせ) おまけで、画面左下のボタンに再生と停止ボタンをつけています。再生ボタンを押すと徐々に標準地図が現れる不思議な体験をしてみてください。 Sample App 2 (おまけ機能) まとめ 今回の記事ではArcGIS API for JavaScript のバージョン 4.18 を利用して、BasemapGallery ウィジェットから、地理院地図、地理院地図Vector風の地図を切り替えして利用できるサンプルアプリケーションをアップデートしてみました。 また、Swipe ウィジェット を使って、地理院の標準地図のベクトルタイルの重なり具合を確認するアプリケーションを作成してみました。 編集したスタイルファイルや、完成版サンプルアプリケーションのコードは、いつものようにGitHub上で公開しておきますのでご参照ください。 関連情報 「地理院地図Vector」(仮称)をArcGIS で表示してみました 「地理院地図Vector」(仮称)をArcGIS で表示してみました-第2弾 続編 はじめてのWeb マッピングアプリケーション開発:ウィジェット編 参考情報 大解説!ArcGIS 開発者のための レイヤー ベクター タイル形式の背景地図をカスタムしてオリジナル配色の背景地図を表現しよう ベクター タイル ベースマップのスタイルをかんたんに変えてみよう Style a vector basemap Display a styled vector basemap
... View more
03-29-2021
09:22 PM
|
0
|
0
|
3707
|
POST
|
Finally, our documentation is back. Thanks MichelleMathias.
... View more
11-20-2020
08:47 PM
|
1
|
1
|
1442
|
DOC
|
はじめに ~より新しい記事(「地理院地図Vector」(仮称)をArcGIS で表示してみました - 第3弾 )もありますので、併せてご参照ください。~ 2019年8月1日に「地理院地図Vector」(仮称)をArcGIS で表示してみました として、ベクトルタイルの道路データをArcGIS API for JavaScript で表示してみました。当時は、一部地域のベクトルタイルの提供でしたが、2020年3月19日からは全国データの公開が始まっています。 また、地理院地図Vector(仮称)提供実験 で提供しているスタイルファイル(style.json)は、Style Specification をベースに若干の拡張を施していますが、別のGitHubリポジトリ で、Style Specification に準拠したスタイルと、Mapbox GL JSで地理院地図Vector風の地図を表示するサンプルが公開されています。 スタイルファイルの準備 前回の記事では独自にスタイルファイルを作成しましたが、今回は、 ・地理院地図Vectorの標準地図をベースにしたスタイル(std.json) ・地理院地図Vectorの淡色地図をベースにしたスタイル(pale.json) ・地理院地図Vectorの白地図をベースにしたスタイル(blank.json) として公開されている主要な3つのスタイルファイルを編集して用意しました(一部、Expression式 などAPIで非対応のものを除外)。 ArcGIS API for JavaScript で表示 スタイルファイルの準備が終われば、後は前回の記事と同様に、VectorTileLayer クラスを使用して次のように実装すると地図の表示は可能です。 // ベクター タイル レイヤーの作成
var vtlLayer = new VectorTileLayer({
url: “<スタイル ファイルの参照 URL>"
});
// マップに作成したレイヤーを追加
map.add(vtlLayer); 今回はせっかく3つのスタイルファイルがあるので、以前に続編 はじめてのWeb マッピングアプリケーション開発:ウィジェット編 で紹介したBasemapGallery ウィジェットをカスタマイズし、地理院地図、地理院地図Vector風の地図を切り替えするようなサンプルアプリケーションを作成してみました。 実装のポイント 今回はBasemapGallery ウィジェットで、地理院地図、地理院地図Vector風の地図を扱えるようにするための、実装ポイントは3つです。 実装のポイント1:地理院地図 標準地図、淡色地図、写真などの地理院地図はWebTileLayer クラスで扱うことが可能ですが、BasemapGallery で使えるように、Basemap クラスを使います。 実際にAPI リファレンスを見てみると、サードパーティのデータソースとして使う場合には、次のように実装するように例示されています。 // or create from a third party source
var basemap = new Basemap({
baseLayers: [
new WebTileLayer(...)
],
referenceLayers: [
new WebTileLayer(...)
],
}); 今回は上記を参考にしながら、baseLayers に、地理院地図の情報をWebTileLayer のインスタンスを設定します。 // 以下の地理院タイル(ベースマップ)のページに記載のURLの定義のうち
// URL の /{z}/{x}/{y} は /{level}/{col}/{row} に変更してurlTemplate に設定
// https://maps.gsi.go.jp/development/ichiran.html#std
// 地理院地図の標準地図の例)
const stdMap = new Basemap({
baseLayers:[new WebTileLayer({
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/std/{level}/{col}/{row}.png",
copyright: "地理院タイル (https://maps.gsi.go.jp/development/ichiran.html)"
})],
title: "地理院タイル - 標準地図",
id: "stdmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/std/12/3637/1612.png"
});
// ※地理院地図の淡色地図の例、地理院地図の写真の例は、サンプル内に記載してあります 実装のポイント2:地理院地図Vector風の地図 同様に、地理院地図Vector風の地図の場合は、VectorTileLayer クラスで扱うことが可能ですが、baseLayers に、VectorTileLayer のインスタンスを設定します。 // 地理院地図Vector風の標準地図の例)
const stdVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/std_edit.json",
copyright: "地理院地図Vector(仮称) (https://maps.gsi.go.jp/vector/)"
})],
title: "地理院ベクトルタイル - 標準地図",
id: "stdvmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/std/12/3637/1612.png"
});
// ※地理院地図Vector風の淡色地図、白地図の例は、サンプル内に記載してあります 実装のポイント3:BasemapGallery への設定 定義した地理院地図、地理院地図Vector風のBasemap を、LocalBasemapsSource に設定後、BasemapGallery のsource として指定します。 // Basemap Sources を LocalBasemapsSource に設定
const localSource = new LocalBasemapsSource({
basemaps: [esriTopo, stdMap, paleMap, seamlessPhoto, stdVMap, paleVMap, blankVMap]
});
// Basemap Gallery Widget に LocalBasemapsSource を設定
const basemapGallery = new BasemapGallery({
view: view,
container: document.createElement("div"),
source: localSource
}); 完成版のサンプル <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
<title>地理院地図Vector風の地図をArcGIS で表示してみました</title>
<link rel="stylesheet" href="https://js.arcgis.com/4.16/esri/themes/dark/main.css" />
<script src="https://js.arcgis.com/4.16/"></script>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
</style>
<script>
require([
"esri/config",
"esri/Map",
"esri/portal/Portal",
"esri/views/MapView",
"esri/Basemap",
"esri/widgets/Expand",
"esri/widgets/Search",
"esri/widgets/BasemapGallery",
"esri/widgets/BasemapGallery/support/LocalBasemapsSource",
"esri/layers/WebTileLayer",
"esri/layers/TileLayer",
"esri/layers/VectorTileLayer",
"esri/intl",
"dojo/domReady!"
], function(
esriConfig,
Map,
Portal,
MapView,
Basemap,
Expand,
Search,
BasemapGallery,
LocalBasemapsSource,
WebTileLayer,
TileLayer,
VectorTileLayer,
intl
) {
// ******************************************************************************
// ArcGIS のベースマップ の他、
// 地理院地図、地理院地図Vector風 などの外部サービスの地図をBasemapGallery で利用するサンプル
//
// なお、ArcGIS だけの世界で対応可能なレイヤーであれば、カスタムグループを作りベースマップを登録して利用するのが一般的
// https://blog.esrij.com/2015/07/14/post-c857/
// ******************************************************************************
// UI のローカライズ
intl.setLocale("ja");
// リクエストを横取りしてパラメータに culture と region を設定するコード
const selfUrl = "https://www.arcgis.com/sharing/rest/portals/self";
esriConfig.request.interceptors.push({
urls: selfUrl,
before: function(params) {
if (params.requestOptions.query) {
switch(intl.getLocale())
{
case "en":
params.requestOptions.query.culture="en";
params.requestOptions.query.region="US";
break;
case "ja":
params.requestOptions.query.culture="ja";
params.requestOptions.query.region="JP";
break;
case "de":
params.requestOptions.query.culture="de";
params.requestOptions.query.region="DE";
break;
case "fr":
params.requestOptions.query.culture="fr";
params.requestOptions.query.region="FR";
break;
}
}
}
});
// portal のインスタンスの初期化とロード
const portal = new Portal();
//portal.authMode = "immediate"; // public にしていない場合でポータル内の情報を使う場合、通常はログイン必要
portal
.load()
.then(function() {
const basemap = portal.useVectorBasemaps
? portal.defaultVectorBasemap
: portal.defaultBasemap;
const map = new Map({
basemap: basemap
//basemap: "topo-vector" // 英語のtopo(地形図)ベクタータイル
//basemap: "osm"
//basemap: {portalItem:{id: "9e74c6647b6e41538fb3b2a4b7e90784"}} // 日本語のtopo(地形図)ベクタータイル
});
const view = new MapView({
container: "viewDiv",
map: map,
center: [139.715512, 35.678257], // 関東周辺
zoom: 8,
constraints: { // 拡大と縮小のスケールを制限
minZoom: 5,
maxZoom: 18
}
});
// Esri Topo Layers
//const esriTopo = new Basemap({
// baseLayers: [new TileLayer({
// url: "https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer?f=json"
// })],
// title: "Esri - Topo",
// id: "Topo",
// thumbnailUrl:"https://js.arcgis.com/4.13/esri/images/basemap/topo.jpg"
//});
const esriTopo = basemap;
esriTopo.thumbnailUrl = "https://js.arcgis.com/4.16/esri/images/basemap/topo.jpg";
/******************************************************************************
地理院タイル(ベースマップ)のページから情報を整理
https://maps.gsi.go.jp/development/ichiran.html#std
※ 実装時には、URL の /{z}/{x}/{y} は /{level}/{col}/{row} に変更
標準地図:レベル 5-18
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/std/{z}/{x}/{y}.png"
copyright: "地理院タイル"
title: "標準地図"
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/std/12/3637/1612.png"
淡色地図:レベル 5-18
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/pale/{z}/{x}/{y}.png"
copyright: "地理院タイル"
title: "淡色地図"
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/pale/12/3637/1612.png"
English:レベル 5-11
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/english/{z}/{x}/{y}.png"
copyright: "地理院タイル"
title: "English"
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/english/10/909/403.png"
写真:レベル 2-18
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{z}/{x}/{y}.jpg"
copyright: "地理院タイル"
title: 写真
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/16/58274/25716.jpg"
******************************************************************************/
const stdMap = new Basemap({
baseLayers:[new WebTileLayer({
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/std/{level}/{col}/{row}.png",
copyright: "地理院タイル (https://maps.gsi.go.jp/development/ichiran.html)"
})],
title: "地理院タイル - 標準地図",
id: "stdmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/std/12/3637/1612.png"
});
const paleMap = new Basemap({
baseLayers:[new WebTileLayer({
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/pale/{level}/{col}/{row}.png",
copyright: "地理院タイル (https://maps.gsi.go.jp/development/ichiran.html)"
})],
title: "地理院タイル - 淡色地図",
id: "palemap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/pale/12/3637/1612.png"
});
const seamlessPhoto = new Basemap({
baseLayers:[new WebTileLayer({
urlTemplate: "https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{level}/{col}/{row}.jpg",
copyright: "地理院タイル (https://maps.gsi.go.jp/development/ichiran.html)"
})],
title: "地理院タイル - 写真",
id: "seamlessphoto",
thumbnailUrl:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/16/58274/25716.jpg"
});
const stdVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/std_edit.json",
copyright: "地理院地図Vector(仮称) (https://maps.gsi.go.jp/vector/)"
})],
title: "地理院ベクトルタイル - 標準地図",
id: "stdvmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/std/12/3637/1612.png"
});
const paleVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/pale_edit.json",
copyright: "地理院地図Vector(仮称) (https://maps.gsi.go.jp/vector/)"
})],
title: "地理院ベクトルタイル - 淡色地図",
id: "palevmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/pale/12/3637/1612.png"
});
const blankVMap = new Basemap({
baseLayers:[new VectorTileLayer({
url: "https://kataya.github.io/gsivectortile-mapbox-gl-js/blank_edit.json",
copyright: "地理院地図Vector(仮称) (https://maps.gsi.go.jp/vector/)"
})],
title: "地理院ベクトルタイル - 白地図",
id: "blankvmap",
thumbnailUrl: "https://cyberjapandata.gsi.go.jp/xyz/blank/12/3637/1612.png"
});
// Basemap Sources を LocalBasemapsSource に設定
const localSource = new LocalBasemapsSource({
basemaps: [esriTopo, stdMap, paleMap, seamlessPhoto, stdVMap, paleVMap, blankVMap]
});
// Basemap Gallery Widget に LocalBasemapsSource を設定
const basemapGallery = new BasemapGallery({
view: view,
container: document.createElement("div"),
source: localSource
});
// Basemap Gallery Widget – Expand Button
const bgExpand = new Expand({
view: view,
content: basemapGallery
});
view.ui.add(bgExpand, "bottom-left");
const search = new Search({ view: view });
view.ui.add(search, "top-right");
const coordsWidget = document.createElement("div");
coordsWidget.id = "coordsWidget";
coordsWidget.className = "esri-widget esri-component";
coordsWidget.style.padding = "7px 15px 5px";
view.ui.add(coordsWidget, "bottom-right");
// lat, lon, zoom and scale の更新するfunction を定義
function showCoordinates(pt) {
let coords = "Lat/Lon " + pt.latitude.toFixed(3) + " " + pt.longitude.toFixed(3) +
" | Scale 1:" + Math.round(view.scale * 1) / 1 +
" | Zoom " + view.zoom;
coordsWidget.innerHTML = coords;
}
// view の動作がが終了したタイミングで中心座標を表示するためのイベントを追加 (例えば zoom, pan などのイベント)
view.watch(["stationary"], function() {
showCoordinates(view.center);
});
// クリックやムーブ時のマウスの座標を表示するためにイベントを追加
view.on(["pointer-down","pointer-move"], function(evt) {
showCoordinates(view.toMap({ x: evt.x, y: evt.y }));
});
})
.catch(function(error) {
console.warn(error);
});
});
</script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html> まとめ 今回の記事ではArcGIS API for JavaScript を利用して、BasemapGallery ウィジェットから、地理院地図、地理院地図Vector風の地図を切り替えして利用できるサンプルアプリケーションを作成してみました。 編集したスタイルファイル(std.json を編集したスタイル、pale.json を編集したスタイル、blank.json を編集したスタイル)や、完成版サンプルアプリケーションのコードは、いつものようにGitHub上で公開しておきますのでご参照ください。 また、サンプルアプリケーションは、こちらから操作して確認することも可能です。 https://kataya.github.io/gsivectortile-mapbox-gl-js/gsi_maps.html 関連情報 「地理院地図Vector」(仮称)をArcGIS で表示してみました 続編 はじめてのWeb マッピングアプリケーション開発:ウィジェット編 参考情報 大解説!ArcGIS 開発者のための レイヤー ベクター タイル形式の背景地図をカスタムしてオリジナル配色の背景地図を表現しよう ベクター タイル ベースマップのスタイルをかんたんに変えてみよう Style a vector basemap Display a styled vector basemap
... View more
11-18-2020
02:42 AM
|
0
|
0
|
6237
|
POST
|
In the 'arcgis-japanese-developer-community' group, about 100 documents are missing. There were 260 documents before the migration, but now there are only 160 documents. What happened?
... View more
11-13-2020
01:58 AM
|
0
|
3
|
1501
|
DOC
|
はじめに ArcGIS ブログでお知らせしたように、ArcGIS Online の2020年 6月のアップデートからリリース版としてArcGIS Notebooks が利用できるようになり、環境を構築することなく、より手軽にArcGIS API for Python を利用可能な環境が整ってきています(詳細は「ArcGIS Online (2020 年 6 月アップデート) の新機能」をご参照ください)。 また、ArcGIS Online ヘルプから「ノートブックの基本操作」が参照できたり、Learn ArcGIS のレッスンギャラリーに「ArcGIS Notebooks を使用した教育」のレッスンが公開されたことにより、ArcGIS API for Python を使った空間データ サイエンスを学びはじめる、オンラインの情報が充実してきています。 今回は、先日の「第29回 地理情報システム学会 学術研究発表大会GIS:【ハンズオンセッション】A25-2:ArcGIS API for Python 体験」用に、上記レッスン資料の「② Notebook の紹介」と「③ ArcGIS Notebooks を使用して、Web GIS を教える」のPDFを日本語化したものをもとに、記事を掲載しております。 はじめてのArcGIS API for Python:Notebook の紹介 はじめてのArcGIS API for Python:ArcGIS Notebooks を使用してWeb GIS を教える ~ ArcGIS Notebooks を使用してWeb GIS を教える ~ 概要 GIS で使用するための Python プログラミングを学習する際には、まず手動でのワークフローを見てから、Python コードを使用してどのように完了するかを確認すると便利です。このレッスンでは、ArcGIS Online でコンテンツ アイテムを見つけ、そのコンテンツを Web マップに追加し、そのコンテンツ レイヤーで空間分析を実行するというワークフローに沿って学習します。このワークフローを手動で実行した後、Python コードと ArcGIS API for Python を使ってArcGIS Notebooks を使ってワークフローを再現します。 このレッスンを通じて、次のような方法を学びます。 ArcGIS Online でコンテンツ アイテムを検索する。 ArcGIS Notebooks でマップにレイヤを追加する。 ArcGIS Notebooks でジオプロセシング解析を実行する。 Step 1: ArcGIS Online でマップを作成 最初に、ArcGIS Online でワークフローをテストします。空のマップに ArcGIS Online のデータを追加します。 ArcGIS Online の組織アカウントにサインインします。 リボンで マップ をクリックします。 空のマップが開きます。次に、マップにコンテンツを追加します。フォルダ、組織、ArcGIS Living Atla、および ArcGIS Online からコンテンツを追加できます。 リボン上で、追加 をクリックします。 ドロップダウン メニューから レイヤーの検索 を選択し、マイ コンテンツ をクリックして、ArcGIS Online を選択します。 Pasadena Block Groups と入力して、Enter キーで検索します。 Learn_ArcGIS が所有する一番上に表示されている結果で、追加 をクリックします。 次に、Pasadena Traffic Collisions と入力して、Enter キーで検索し、Learn_ArcGIS が所有しているTraffic Collisions で、追加 をクリックします。 リボンで、詳細 をクリックし、コンテンツ タブをクリックします。 コンテンツ ウィンドウには、マップ内のすべてのレイヤーが一覧で表示されます。マップには、カリフォルニア州パサデナのブロック グループ(Pasadena Block Groups)と、交通事故(Traffic Collisions)を含む 2 つのレイヤーがあります。交通事故 レイヤーの各赤い点は、2008 年から 2018 年の間に発生した自動車が関与する交通事故を 1 件ずつ表しています。 Step 2: ブロック グループ別の交通事故 ポイントの集約 Step1 で作成した地図データは カリフォルニア州パサデナの交通事故を示しています。現在のシンボルでは、これらの交通事故には識別可能なパターンがありません。このデータの空間的な分布を理解する1つの方法は、ブロック グループごとにデータを集約することです。ブロック グループとは、米国国勢調査局がデータ収集方法で使用している地域の一つで、集計することで各ブロック グループで発生した交通事故の数がわかります。 リボンで、解析 ボタンをクリックします。 解析の実行 で、データの集約 を展開し、ポイントの集約 を選択します。 ポイントの集約 ツールでは、次の操作を行います。 エリアに集約するポイントを含むレイヤーを選択 する場合は、Traffic Collisions を選択します。 集計エリアを含むレイヤーを選択 するには、ポリゴン をクリックし、ポリゴン レイヤーを選択 で、Pasadena Block Groups を選択します。 結果レイヤーの名前 には、Pasadena_Collisions_Aggregated と入力し、レイヤー名が一意となるように、あなたのイニシャルを後ろに追加します。 この場合、パラメータでグループ化するための統計情報の追加 とグループ化の基準にするフィールドを選択 は使用していません。これらは、選択したポリゴンレイヤー内のフィールドの統計情報を計算できるようにするオプションのパラメータです。 分析の実行 をクリックします。 分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。 コンテンツ ウィンドウで、Traffic Collisions のチェック ボックスを外して表示をオフにします。 集約されたレイヤーは、等級シンボルで示されています。ブロック グループ内で発生した衝突が多いほど、そのブロックの円が大きくなります。 Step 3: 六角形での集約 次に、同じジオプロセシング ツールを実行しますが、ブロック グループごとに集約するのではなく、1kmの六角形ごとに集約します。ブロック グループは、道路や都市の境界から水域に至るまで、多くの文化的・物理的要因に基づいて描かれています。地図を見ればわかるように、これらは同じ大きさや形ではありません。より均一な方法でデータを集計するには、六角形のビンを使用します。 コンテンツ ウィンドウで、Pasadena_Collisions_Aggregated を選択して、解析の再実行をクリックします。 解析 ウィンドウには、最初に使用した ポイントの集約 ツールのパラメータ設定が表示されます。 表示されたポイントの集約 ツールで、集約エリアを含むレイヤーを選択 で、六角形 をクリックします。 六角形のビンのサイズの選択 で、1 キロメートル を選択します。 結果レイヤーの名前 にPasadena_Collisions_Hex_Aggregation と入力し、レイヤー名が一意となるように、あなたのイニシャルを後ろに追加します。 分析の実行 をクリックします。 分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。 コンテンツ ウィンドウで、Pasadena Collisons Aggregated レイヤーのチェック ボックスを外して表示をオフにします。 六角形の集合体を見ると、高速道路 210号線と 710号線の交差点付近でほとんどの交通事故が発生していることがよくわかります。 最後に、Web マップを保存します。 リボン上で、保存 をクリックし、名前を付けて保存 を選択します。 マップの保存 ウィンドウで、タイトル にPasadena Collisions Aggregation Map と入力します。タグ に、交通事故 と入力し、マップの保存 をクリックします。 Web マップとレイヤが ArcGIS Online の Content フォルダに保存されます。 Step 4: ArcGIS Notebooks を使用したWeb GIS ワークフローの作成 空間データを集約して、2 つの異なるポリゴン レイヤーを使用して分布を表示しました。それでは、このワーク フローを ArcGIS API for Python を使用して ArcGIS Notebooks で再現します。最初のセクションで使用した空の Web マップと同様に、空のノートブックを作成し、分析に必要なデータを追加します。 マップ タイトルの横にある ホーム をクリックし、ノートブック を選択します。 ArcGIS Notebooks でノートブックが作成されます。 ArcGIS Notebooks へようこそ ウィンドウで、ArcGIS Notebook Python 3 Standard - 4.0 を選択し、開く をクリックします。 コードを実行する前に、ノートブックに名前を付けて保存します。 リボン上で、保存 をクリックし、名前を付けて保存 を選択します。 タイトルにPasadena Collisions Aggregated Notebook と入力します。タグには、交通事故と入力し、ノートブックの保存 をクリックします。 これでノートブックの準備ができたので、マークダウン セルを作成し、分析のコンテキストを提供するヘッダーと説明をセルに追加します。マークダウン構文では、ヘッダーはシャープ記号(#)を使用します。 ノートブックの下部にあるコード セル(Now you are ready to start! の下部)をクリックして、そのセルをマークダウン セルに変更します。 新しいマークダウン セルで、以下を入力または貼り付けます。 ## Aggregating Data Using ArcGIS Notebooks このノートでは、パサデナブロック群別、六角形別に点の特徴を集約していきます。 Shift+Enter キーを押すか、リボンのRun ボタンをクリックしてセルを実行します。 次から GIS モジュールを呼び出し、ArcGIS Online の組織に接続します。このセルは、ノートブックを使用するたびに最初に実行する必要があります。 最初のコード セルをクリックしてアクティブにし、セルを実行します。 from arcgis.gis import GIS gis = GIS("home") コード セルが正常に実行されたことは、入力領域の括弧内に数字が表示され、In [1] と表示されたときにわかります。次に、パサデナの交通事故データを見つけ、ノートブックに追加します。 ノートブックの最後のセルをクリックします。 リボン上で、追加 をクリックします。 マイ コンテンツ をクリックし、ArcGIS Online を選択し、Traffic Collisions と入力して、Enter キーで検索し、Learn_ArcGIS が所有しているTraffic Collisions のアイテムのノートブックに追加 をクリックします。 # Item Added From Toolbar # Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS item = gis.content.get("79d3e458dcaf486f81c5591a67538179") item 上記に記載されている、ArcGIS API for Python を使用してコンテンツ アイテムを取得するコードが、ノートブックのコード セルに追加されます。 アイテム変数名を traffic に変更します。 # Item Added From Toolbar # Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS traffic = gis.content.get("79d3e458dcaf486f81c5591a67538179") traffic コード セルを実行します。 コンテンツ アイテムが読み込まれ、ArcGIS Online でアイテムへのアクティブなリンクが生成されます。次に、国勢調査ブロック グループ レイヤを追加します。 同様に、Pasadena Block Groups と入力して、Enter キーで検索し、Learn_ArcGIS が所有するアイテムで、 ノートブックに追加 をクリックします。 アイテム変数名を block_groups の名前を変更し、セルを実行します。 次に、マップを作成します。 注: セルを実行するたびに、新しいセルがその下に追加されます。セルを手動で追加するには、リボン上の追加 ボタンをクリックして、アクティブなセルの下にセルを挿入します。 最後のコード セルで、traffic_map という名前の変数を定義し、次のようにカリフォルニア州パサデナを中心としたWeb マップを=で設定します。 traffic_map = gis.map('Pasadena, CA') これにより、カリフォルニア州パサデナを中心とした地図が定義されますが、変数が呼び出されるまではノートブックに地図は作成されません。 次の行で、traffic_map 変数を呼び出しセルを実行します。 このコード セルは、ノートブックでマップを描画しています。 次に、traffic とblock_groups を呼び出して、データを追加します。 マップの下にコードセルを作成し、以下のようにblock_groups 変数を呼び出し、ブロック グループを追加します。 traffic_map.add_layer(block_groups) これにより、block_groups レイヤーがマップに追加されます。 また、次のようにtraffic 変数を呼び出し、交通事故のデータをマップに追加します。 traffic_map.add_layer(traffic) セルを実行すると、ノートブックに描画されているマップは、ArcGIS Online で最初に作成したマップ(Step1での操作)と一致するようになります。 リボンで 保存 をクリックし、保存 を選択します。 参考:Step 4 コードのみを記載 # 8.
from arcgis.gis import GIS
gis = GIS("home")
# 11. , 12.
# Item Added From Toolbar
# Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS
traffic = gis.content.get("79d3e458dcaf486f81c5591a67538179")
traffic
# 14. , 15.
# Item Added From Toolbar
# Title: Pasadena Block Groups | Type: Feature Service | Owner: Learn_ArcGIS
block_groups = gis.content.get("af363700f8f84c11a02f084e78a296aa")
block_groups
# 16. , 17.
traffic_map = gis.map('Pasadena, CA')
traffic_map
# 18. , 19.
traffic_map.add_layer(block_groups)
traffic_map.add_layer(traffic) Step 5: ArcGIS Notebooks を使ったブロック グループ別の交通事故 ポイントの集約 分析したいレイヤを特定してプレビューを行ったら、ArcGIS Notebooks でジオプロセシング タスクを実行に移ります。前回と同様に、ポイントの集約 ツールを使用して、国勢調査ブロックの地理情報データをまとめます。ArcGIS API for Python を使用して、パラメータを定義します。 リボンで、分析 をクリックします。 解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。 ArcGIS API for Python から features モジュールをインポートし、aggregate_points() 関数を呼び出す新しいコード ブロックがノートブックに追加されます。 コードを実行する前に、関数シグネチャを確認して、 aggregate_features 関数に必要なパラメータを確認します。各パラメータは、関数が期待する通りに正確に入力する必要があり、そうしないとエラーが発生します。 関数シグネチャを呼び出すには、() を?に置き換えてセルを実行します。 関数シグネチャは、 aggregate_points 関数が入力として使用するすべてのパラメータを表示します。これらの中にはオプションのものもあることに注意してください。 ここで、解析を実行するための適切な入力パラメータを関数に入力します。関数のシグネチャから、入力point_layer とpolygon_layer を定義する必要があります。また、オプションのoutput_name を設定します。さらに、この解析では、データのないブロック グループが結果レイヤーから削除されるように、keep_boundaries_with_no_points = False を設定します。 関数を collisions_by_block_group 変数に追加し、以下のように必要なパラメータを追加します。output_name 引数には、レイヤー名が組織内で一意になるように YOURINITIALS プレースホルダを自分のイニシャルに置き換えます。 from arcgis import features collisions_by_block_group = features.summarize_data.aggregate_points( point_layer=traffic, polygon_layer=block_groups, output_name="collisions_by_block_group_YOURINITIALS", keep_boundaries_with_no_points=False ) 関数のシグネチャを閉じて、セルをもう一度実行します。 処理の実行には数分かかる場合があります。処理中のセルでは、カッコの中にアスタリスクが入っています( Inと表示される)。今回は、collisions_by_block_group という名前の集約レイヤーを作成しています。 前のセルの下の新しいセルに、collisions_by_block_groupと入力してセルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。最初の集計を実行したので、ブロック グループ集計をマップに追加して結果を比較します。 traffic_map_1 という名前の別のマップを作成し、次のように map 変数を呼び出して 2 番目のマップを描画します。 traffic_map_1 = gis.map('Pasadena, CA')
traffic_map_1 次のようにマップに collisions_by_block_group を追加します。 traffic_map_1.add_layer(collisions_by_block_group) このマップは、以前に ArcGIS Online で作成した、ブロック グループごとに交通事故を集約したマップと同じものです。 参考:Step 5 コードのみを記載 # 4. , 5.
from arcgis import features
collisions_by_block_group = features.summarize_data.aggregate_points(
point_layer=traffic,
polygon_layer=block_groups,
output_name="collisions_by_block_group_YOURINITIALS",
keep_boundaries_with_no_points=False
)
# 7.
traffic_map_1 = gis.map('Pasadena, CA')
traffic_map_1
# 8.
traffic_map_1.add_layer(collisions_by_block_group) Step 6: ArcGIS Notebooks を使った六角形での集約 六角形のビンで集約する処理は ArcGIS Online では 1 つのステップでしたが、API を使用すると 2 つのステップが必要になります。まず、テッセレーションの生成 ツールを使用して六角形レイヤを生成します。次に、六角形のテッセレーションをフィーチャとして使用し、ポイントを集約します。 リボンで分析 をクリックします。データの管理 を展開し、テッセレーションの生成 を選択します。 テッセレーションの生成 の、コードスニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをインポートし、generate_tessellation() を呼び出す方法を示す新しいコード ブロックがノートブックに追加されます。前のステップで aggregate_points() で行ったように、関数のシグネチャを表示することも可能です。パラメータを入力して実行できるようにします。 結果を保持するための変数 hexbins を作成し、以下のように、テッセレーションの範囲、ビン サイズ、ビン サイズの単位、ビン タイプ、結果レイヤー名、集約するポリゴンレイヤー、境界レイヤーを定義するためのパラメータをコード セルに追加します。output_name 引数には、YOURINITIALS プレースホルダを自分のイニシャルに置き換えて、組織内で一意のレイヤ名にします。 from arcgis import features hexbins = features.manage_data.generate_tessellation( extent_layer=block_groups, bin_size=1, bin_size_unit='SquareKilometers', bin_type='HEXAGON', output_name='Pasadena_CA_Hexbins_YOURINITIALS' ) セルを実行します。 次のセルでは、hexbins 変数を呼び出してセルを実行します。 これにより、ArcGIS Online アカウントにテッセレーションの生成結果のプレビューが生成されます。最後に、hexbins を使用してトラフィックの衝突ポイントを集約します。 解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをノートブックにインポートする新しいコード ブロックが追加され、 aggregate_points() を呼び出す方法が示されます。今回は、集約するフィーチャとしてhexbins を使用します。入力ポイント レイヤーにはtraffic フィーチャーを選択します。集約に使用するポリゴンには Hexbins を選択し、境界線はポイントを含まないエリアを維持のままにしておきます。 新しい集計を保持する変数 collisions_by_hexbin を作成し、必要なパラメータを以下のように入力します。出力名の引数には、YOURINITIALS プレースホルダを自分のイニシャルに置き換えて、組織内でレイヤー名が一意になるようにします。 from arcgis import features collisions_by_hexbin = features.summarize_data.aggregate_points( point_layer=traffic, output_name='collisions_by_1km_hexbin_YOURINITIALS', polygon_layer=hexbins, keep_boundaries_with_no_points=True ) セルを実行します。 処理が完了したら、前のセルの下にセルを作成し、collisions_by_hexbin と入力して、セルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。ポイントを六角形のビンごとに集約したので、結果を視覚化します。 ノートブックの collisions_by_hexbin 結果の下にコード セルを作成します。 traffic_map_2 という名前の別のマップを作成し、次のように変数を呼び出します。 traffic_map_2 = gis.map('Pasadena, CA') traffic_map_2 このコード セルは、traffic_map_2 を定義し、ノートブックにマップが描画されます。 次のように collisions_by_hexbin をマップに追加します。 traffic_map_2.add_layer(collisions_by_hexbin) 結果として得られるマップには、以前 ArcGIS Online で作成したマップと同様に、六角形で集約された交通事故地点が表示されています。 リボンで保存 をクリックし、保存 を選択します。 ノートブックが保存されました。ArcGIS Online でこの項目に戻ってコードを再実行したり、ノートブックを修正したり、解析を拡張したりすることができます。 参考:Step 6 コードのみを記載 # 3. , 4. , 5.
from arcgis import features
hexbins = features.manage_data.generate_tessellation(
extent_layer=block_groups,
bin_size=1,
bin_size_unit='SquareKilometers',
bin_type='HEXAGON',
output_name='Pasadena_CA_Hexbins_YOURINITIALS'
)
hexbins
# 6. ,7. ,8. ,9.
from arcgis import features
collisions_by_hexbin = features.summarize_data.aggregate_points(
point_layer=traffic,
output_name='collisions_by_1km_hexbin_YOURINITIALS',
polygon_layer=hexbins,
keep_boundaries_with_no_points=True
)
collisions_by_hexbin
# 12.
traffic_map_2 = gis.map('Pasadena, CA')
traffic_map_2
# 13.
traffic_map_2.add_layer(collisions_by_hexbin) 要約 このレッスンでは、ArcGIS Notebooks と ArcGIS API for Python を使用して、一般的な Web GIS ワークフローを Python プログラミング レッスンに変換する方法を学びました。Web マップにコンテンツを追加し、ArcGIS Online で空間分析を実行し、ArcGIS Notebooks で同じタスクを完了しました。ArcGIS Notebooks で自分のノートブックを作成しました。最終的なプロジェクトを見るには、こちらからアクセスしてください。 関連情報 ArcGIS Online ヘルプ ノートブックの基本操作—ArcGIS Online ヘルプ | ドキュメント サンプル ノートブック—ArcGIS Online ヘルプ | ドキュメント Learn ArcGIS ArcGIS Notebooks を使用した教育 | Learn ArcGIS Esri Canada | Education & Research Working with Python Notebooks シリーズ ブログ ArcGIS API for Python を使ってみよう さわって覚える ArcGIS API for Python
... View more
10-26-2020
05:29 AM
|
0
|
0
|
1990
|
DOC
|
はじめに 📢 ~2022年10月現在のArcGIS Online での操作に対応した新しい記事がありますので、これからArcGIS API for Python を学ぶ方は「はじめてのArcGIS API for Python 2022 : ノートブック集の公開」をご参照ください~ ArcGIS ブログでお知らせしたように、ArcGIS Online の2020年 6月のアップデートからリリース版としてArcGIS Notebooks が利用できるようになり、環境を構築することなく、より手軽にArcGIS API for Python を利用可能な環境が整ってきています(詳細は「ArcGIS Online (2020 年 6 月アップデート) の新機能」をご参照ください)。 また、ArcGIS Online ヘルプから「ノートブックの基本操作」が参照できたり、Learn ArcGIS のレッスンギャラリーに「ArcGIS Notebooks を使用した教育」のレッスンが公開されたことにより、ArcGIS API for Python を使った空間データ サイエンスを学びはじめる、オンラインの情報が充実してきています。 今回は、先日の「第29回 地理情報システム学会 学術研究発表大会GIS:【ハンズオンセッション】A25-2:ArcGIS API for Python 体験」用に、上記レッスン資料の「② Notebook の紹介」と「③ ArcGIS Notebooks を使用して、Web GIS を教える」のPDFを日本語化したものをもとに、記事を掲載しております。 はじめてのArcGIS API for Python:Notebook の紹介 はじめてのArcGIS API for Python:ArcGIS Notebooks を使用してWeb GIS を教える ~ Notebook の紹介 ~ 概要 組織のバナーの上部にノートブック と表示されている場合は、ArcGIS Notebooks でノートブックを作成および編集することが可能です。 バナーにノートブック と表示されていない場合は、組織の管理者と協力してArcGIS Notebooks へのアクセスを有効にしてください。アクセスを有効にしたら、最初のノートブックを作成して、ArcGIS Notebooks を使用した空間データ サイエンスを学び始めることができます。 このレッスンを通じて、次のような方法を学びます。 ArcGIS Notebooks でノートブックを作成します。 ノートブックの基本操作を学びます。 ノートブックでコンテンツを探索します。 ノートブックでマップを作成します。 マップにレイヤーを追加します。 マップをArcGIS Online に保存します。 ノートブックをArcGIS Online のアイテムとして保存します。 Step 1:ArcGIS Notebooks でノートブックを作成 バナーにノートブック と表示されノートブックを使える状態になったら、最初のノートブックを作成してみましょう。 組織のバナーの上部のノートブック をクリックし、ArcGIS Notebooks で最初のノートブックを開きます。 ノートブックを開く前に、新しいノートブックで使用するランタイムを選択するプロンプトが表示されます。メモリや CPU などのリソース割り当てと、どの Python パッケージが使用されているかが表示されます。 ランタイムにはStandard、Advanced、GPUサポート付きAdvancedの3つのオプションがあります。これらのオプションの後には、そのランタイムに含まれるPython ライブラリやパッケージのバージョンに対応するバージョン番号が付けられます。常に最新のバージョンを使用することをお勧めします。このレッスンでは、Standard ランタイムを使用します。 ArcGIS Notebooks へようこそ のウィンドウで、ArcGIS Notebook Python 3 Standard - 4.0 を選択し、開く をクリックします。 このランタイムには、標準のオープン ソース Python ライブラリと ArcGIS API for Python が含まれており、この最初のノートブックで使用するものはこれだけです。ArcGIS Notebook Python 3 Advanced - 4.0 ランタイム オプションには、Standard ランタイムに含まれるライブラリに加えて ArcPy が含まれており、より多くのメモリと CPU が搭載されているため、より大きな解析や処理タスクを処理することができます。ArcGIS Notebook Python 3 Advanced with GPU サポート - 4.0 オプションには、Advanced ランタイムと同じライブラリが含まれており、機械学習やディープラーニングを含む計算量の多いワークフローのための専用 GPU インフラストラクチャが提供されます。 Step 2:新しいノートブックのセルを探索する 新しいノートブックには、ArcGIS API for Python を呼び出すためのコード セルが 1 つずつ用意されています。その後、コード セルとマークダウン セルを追加して、ワークフローを作成します。 Welcome to your notebook. のセルをダブルクリックして編集可能な状態にします。 これはマークダウン セルです。マークダウンは、インターネット上で広く使われている軽量でプレーンテキスト形式の構文です。 Run をクリックしてセルを実行します。 最初のセルが実行され、ヘッダー行に変わります。 注: キーボードの Shift+Enter キーを押してセルを実行することもできます。Shift+Enter は、ノートブックでセルを実行するためのキーボード ショートカットです。すべてのキーボード ショートカットのリストを表示するには、ノートブックの上部にあるOpen the command palette をクリックします。コマンド パレットにキーボード ショートカットのリストが表示されます。 同じセルをダブルクリックして編集します。セル内のWelcome to your notebook. の前のシャープ記号(#)を2つ挿入します。 これでシャープ記号(#)が 4 つになりました。シャープ記号(#)を追加すると、ヘッダーのサイズが変わります。 Run をクリックします。 ヘッダーが小さくなっていることに気づくと思います。 再度同じセルをダブルクリックし、ヘッダーから2つのシャープ記号(#)を削除し、Enter キーを押し、2行目に”はじめてのノートブック” と入力します。 Run をクリックします。 2 番目のマークダウン セルは、最初のコード セルを説明しています(Run this cell to connect to your GIS and get started: の文言)。このコード セルは、Python API から GIS モジュールを呼び出し、ArcGIS Online の組織に接続します。 最初のコード セルをダブルクリックし、Run をクリックします。 セルが実行されている間は、入力領域のカッコの中にアスタリスクが入っているため、In[ * ] と表示されます。セルの実行が完了すると、数字の 1 が括弧内のアスタリスクに置き換わり、In[ 1 ] と表示されます。括弧内の数字は、コード セルが実行されるたびに 1 つずつ増えていきます。 注意: このセルは必ず実行する必要があります。このセルを実行しないと、他のコード セルは実行されません。 Step 3:ノートブックでマップを作成 今、あなたはマークダウン に精通し、既存のコードを実行しているので、今度はあなた自身のコードを書いて実行してみましょう。 下の空のセルに、"### はじめてのマップ" と入力してください。 リボン上で、Code をクリックし、Markdown に変更します。工夫して、ヘッダーの下に書くコードを説明するテキストを追加してください。 Run をクリックします。 マークダウン セルの下に新しい行が追加されます。ここにマップを追加します。 注: リボンの [+] ボタンをクリックするか、[Insert] メニューをクリックして、ノートブック内の任意の場所にセルを追加することもできます。 次に、ノートブックにマップを作成します。そのためには、マップを表す変数を定義し、ArcGIS API for Python を使用して、特定の場所を中心とした Web マップに変数を設定します。 my_first_map という名前の変数を作成し、それをカリフォルニア州ロサンゼルスを中心としたウェブ マップと=で結びます。 my_first_map = gis.map("Los Angeles, CA") Run をクリックします。 定義した変数を呼び出して、マップを作成します。 コード セルに定義した変数を呼び出すコードを書いて、そのセルをRun で実行します。 my_first_map 実行されるとノートブックに、最初の地図が表示されます。前のセルに戻って、"Los Angeles, CA"を別の場所に変更し(例えば、”Yokohama”、”横浜市”、”Tokushima”、"徳島市" など)、再度、セルを実行することで、地図の中心の位置を変更することができます。 Step 4:マップにレイヤーを追加 ArcGIS Notebooks では、レイヤーを検索し、マップに追加することができます。次に、ロサンゼルスと重なるレイヤーを検索し、マップに追加します。 リボンで 追加 をクリックします。 コンテンツの追加 ウィンドウにコンテンツが表示されます。ArcGIS Online または ArcGIS Notebooks にコンテンツを保存している場合は、そのコンテンツをノートブックで使用できます。また、組織に共有されているコンテンツ、ArcGIS Online に共有されているコンテンツ、または ArcGIS Living Atlas からアクセスすることもできます。この場合、Living Atlas を使用します。 マイ コンテンツ をクリックし、Living Atlas を選択します。USA Traffic Counts と入力して、Enter キーで検索します。 一番上に表示されるアイテムは 2020 USA Traffic Counts レイヤーです。 2020 USA Traffic Counts レイヤーで、ノートブックに追加 ボタンをクリックします。 マップの下のノートブックにコードスニペットを含む新しいセルが追加されます。このセルは、アイテムとしてtraffic counts レイヤーを呼び出し、そのメタデータをロードします。 そのコード セルを実行します。 アイテムのメタデータがオブジェクトとしてセルの下のノートブックに追加されますが、マップにはまだ追加されていません。 前の手順で表示されたアイテムの下にコード セルを作成し、マップ 変数を呼び出します。 ヒント: my_ と入力して Tab キーを押します。ノートブックのコード補完は、Tab キーによって呼び出されます。行の入力を完了し、my_first_map が読み込まれます。 次に、my_first_map の後にピリオドを付けて、my_first_map. と表示されるようにして、Shift+Tab キーを押します。 Shift+Tab を押すと関数シグネチャが開きます。関数シグネチャは、作業している要素の種類を知る必要がある場合に便利です。これを使って、関数が何をするのか、入力変数と出力変数をどのように定義するのかを理解してください。 関数シグネチャを閉じます。 add_layer(item) 関数を呼び出してセルを実行します。 my_first_map.add_layer(item) 2020 USA Traffic Counts のレイヤーが、Step 3 の 6. で表示したマップに追加されます。 ArcGIS Notebooks を使用して、最初のマップを作成し、そのマップにレイヤーを追加しました。マップには、拡大・縮小 ボタン、コンパス、およびマップ ビューからシーン ビューに変更するオプションが含まれていることに気づくと思います。マップをパンしたり、ズームしたりといった操作にこれらのボタンが使用できます。これは、ArcGIS Online で使用するマップと同じ機能を持つ live web マップです。 Step 5:ArcGIS Online にマップを保存 数行のコードで、作成したマップを ArcGIS Online に保存することができます。Web マップは、タイトル、スニペット、タグなどの特定のプロパティによって定義されます。Web の詳細については、Web map specification を参照してください。Pythonのコードでプロパティを格納した辞書を作成することで、プロパティを定義することができます。そして、マップをWeb マップとして保存します。 新しいコード セルで、Web マップのプロパティを定義し、以下のコードを入力してマップを保存します。 webmap_properties = { 'title':'はじめてのマップ', 'snippet':'私のはじめてのマップは私の最初のノートブックから', 'tags':['ArcGIS Notebooks', 'Los Angeles', 'traffic'] } my_first_map.save(webmap_properties) セル を実行します。 実行結果はアクティブなリンクです。はじめてのマップ をクリックして、ArcGIS Online でアイテムを確認します。 Step 6:ノートブックを ArcGIS Online に保存する マップとノートブックは別々に保存する必要があります。ノートブックを閉じる前に、ArcGIS Online に保存します。 リボンで保存 をクリックし、名前を付けて保存 を選択します。 アイテムのメタデータを入力し、ノートブックを保存します。 要約 このレッスンでは、ArcGIS Notebooks で初めてノートブックを作成しました。ノートブックのコンテンツ セルについて学びました。ArcGIS Notebooks と ArcGIS API for Python を使用して、マップを作成し、そのマップにレイヤーを追加し、ArcGIS Online に保存するという一般的な GIS ワークフローを完了させる方法を学びました。基本を学んだところで、ArcGIS API for Python samples の探索を開始し、他に何ができるのかを確認してみましょう。 関連情報 ArcGIS Online ヘルプ ノートブックの基本操作—ArcGIS Online ヘルプ | ドキュメント サンプル ノートブック—ArcGIS Online ヘルプ | ドキュメント Learn ArcGIS ArcGIS Notebooks を使用した教育 | Learn ArcGIS Esri Canada | Education & Research Working with Python Notebooks シリーズ ブログ ArcGIS API for Python を使ってみよう さわって覚える ArcGIS API for Python
... View more
10-26-2020
03:40 AM
|
0
|
0
|
3803
|
DOC
|
はじめに ArcGIS API for JavaScript はReact, Angular, Vueなどの、JavaScriptのフレームワークと統合して利用することができ、その解説はAPI リファレンスの Using the ArcGIS API for JavaScript with Frameworks に記載されています。 また、以前に紹介した@Anonymous User/cli を使って、React、Vue のアプリケーションのテンプレートを作成できるほか、[Samle Code] の [Widgets (Advanced)]にも Using widgets with React や Custom widgets with Vue のサンプルが存在しています。 今回の記事は Custom widgets with Vue のサンプルの解説を翻訳し、少しコードを編集して試してみた記事になります。 Web アプリの開発環境をお持ちでない場合でも、Custom widgets with Vue の sandbox を利用して、該当箇所のコードを少し書換えすることでWeb ブラウザー上で動作を試すことが可能です。 サンプルの解説 1. Vue のセットアップ 最初に必要なライブラリをロードします。 <!-- Vue を dojoConfig に package として追加-->
<script>
window.dojoConfig = {
packages: [
{
name: "vue",
location: "https://unpkg.com/vue/dist/",
main: "vue"
}
]
};
</script>
<!-- Esri JSAPI のロード -->
<script src="https://js.arcgis.com/4.17/"></script> 2. シンプルなマップとビューを作成 シンプルなMap を作成し、MapView もしくは SceneView に追加します。もし、view や基本のマップを作成するのになじみが薄い場合は、次のリソースを参照してください。 Intro to MapView Intro to SceneView API reference - View API reference - Map はじめての Web マッピングアプリケーション開発:地図表示編 const map = new Map({
basemap: "hybrid",
ground: "world-elevation"
});
const initialCamera = {
//日本の座標を指定
position: [138.673, 33.822, 200000],
tilt: 45,
heading: 0
};
const view = new SceneView({
container: "viewDiv",
map: map,
camera: initialCamera
});
3. カスタム Vue コンポーネントを作成 HTML テンプレート とJavaScript のロジック でカスタム Vue コンポーネントを作成します。カスタム Vue コンポーネントに関するより詳細な情報は、Vue のドキュメント をご参照ください。 View のカメラの詳細を表示するには、Vue コンポーネントへcamera プロパティを定義します。そして、ボタンクリック時にCamera をclone し、position とtilt を更新後、ViewのgoTo() メソッドで、更新された場所にアニメーション表示で移動します。 Camera オブジェクトのPosition, Tilt, Heading の解説は、3D camera intro using the ArcGIS API for JavaScript で動画で解説されていますので、なじみが薄い場合は、併せてご参照ください。 Vue.component("camera-info", {
props: ["camera"],
template: [
"<div>",
"<h2>Camera の詳細</h2>",
"<p><strong>機首方位 (Heading)</strong>: {{ camera.heading.toFixed(3) }}</p>",
"<p><strong>前後の傾き (Tilt)</strong>: {{ camera.tilt.toFixed(3) }}</p>",
"<p><strong>緯度 (Latitude)</strong>: {{ camera.position.latitude.toFixed(3) }}</p>",
"<p><strong>経度 (Longitude)</strong>: {{ camera.position.longitude.toFixed(3) }}</p>",
"<button v-on:click='reset'>Camera のリセット</button>",
"</div>"
].join(""),
methods: {
reset: function() {
var camera = this.camera.clone();
camera.set({
position: [138.673, 33.822, 200000],
tilt: 45
});
view.goTo(camera);
}
}
}); 4.Vue コンポーネントのイニシャライズ DOM にカスタム要素を追加し、カメラのプロパティをバインディングします。そして、Vue コンポーネントをイニシャライズし、Viewのui として追加します。Vue コンポーネントのカメラの変更や更新を、Viewのカメラでウォッチします。 <div id="info" class="esri-widget">
<camera-info v-bind:camera="camera"></camera-info>
</div> view.when(function() {
const info = new Vue({
el: "#info",
data: {
camera: view.camera
}
});
view.ui.add(info.$el, "top-right");
watchUtils.watch(view, "camera", function() {
info.camera = view.camera;
});
}); 完成版のサンプルコード <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta
name="viewport"
content="initial-scale=1,maximum-scale=1,user-scalable=no"
/>
<title>Custom widgets with Vue | Sample | ArcGIS API for JavaScript 4.17</title>
<link
rel="stylesheet"
href="https://js.arcgis.com/4.17/esri/themes/light/main.css"
/>
<style>
html,
body,
#viewDiv {
padding: 0;
margin: 0;
height: 100%;
width: 100%;
}
#info {
padding: 1em;
}
</style>
<script>
window.dojoConfig = {
packages: [
{
name: "vue",
location: "https://unpkg.com/vue/dist/",
main: "vue"
}
]
};
</script>
<script src="https://js.arcgis.com/4.17/"></script>
<script>
require([
"esri/Map",
"esri/views/SceneView",
"esri/core/watchUtils",
"vue"
], function(Map, SceneView, watchUtils, Vue) {
const map = new Map({
basemap: "hybrid",
ground: "world-elevation"
});
const initialCamera = {
//日本の座標を指定
position: [138.673, 33.822, 200000],
tilt: 45,
heading: 0
};
const view = new SceneView({
container: "viewDiv",
map: map,
camera: initialCamera
});
// Vue コンポーネント を作成
Vue.component("camera-info", {
props: ["camera"],
template: [
"<div>",
"<h2>Camera の詳細</h2>",
"<p><strong>機首方位 (Heading)</strong>: {{ camera.heading.toFixed(3) }}</p>",
"<p><strong>前後の傾き (Tilt)</strong>: {{ camera.tilt.toFixed(3) }}</p>",
"<p><strong>緯度 (Latitude)</strong>: {{ camera.position.latitude.toFixed(3) }}</p>",
"<p><strong>経度 (Longitude)</strong>: {{ camera.position.longitude.toFixed(3) }}</p>",
"<button v-on:click='reset'>Camera のリセット</button>",
"</div>"
].join(""),
methods: {
reset: function() {
var camera = this.camera.clone();
camera.set(initialCamera);
view.goTo(camera);
}
}
});
view.when(function() {
const info = new Vue({
el: "#info",
data: {
camera: view.camera
}
});
view.ui.add(info.$el, "top-right");
watchUtils.watch(view, "camera", function() {
info.camera = view.camera;
});
});
});
</script>
</head>
<body>
<div id="info" class="esri-widget">
<camera-info v-bind:camera="camera"></camera-info>
</div>
<div id="viewDiv"></div>
</body>
</html> 関連情報 Web マッピング アプリ開発に便利なツールをご紹介:~webpack を利用したカスタム ビルドの作成方法と CLI を利用したテンプレート アプリの作成方法~ はじめての Web マッピングアプリケーション開発:地図表示編 Using the ArcGIS API for JavaScript with Frameworks Using widgets with React Custom widgets with Vue 3D camera intro using the ArcGIS API for JavaScript
... View more
10-14-2020
08:41 PM
|
0
|
0
|
1716
|
DOC
|
1. はじめに ArcGISブログの2020年8月6日の記事で「廃止されるベクター ベースマップとラスター ベースマップのお知らせ」を告知しましたが、Web マッピングアプリケーションの開発されている方は、どのベースマップをお使いでしょうか? ArcGIS API for JavaScript のAPI リファレンスでは、ベースマップの使い方のヒントになるよう「Use Portal Basemaps」のサンプルコードが公開されています。 この記事は「はじめてのWeb マッピングアプリケーション開発」、「続編 はじめてのWeb マッピングアプリケーション開発」のシリーズ関連記事として、前出のサンプルを拡張し、UIとべースマップを多言語(今回は英/日/独/仏)に対応する際の実装ポイントについてご紹介します。 これまでの記事と同様に、ソースコードは ESRIジャパンの GitHub で公開していますので、同時に参照いただきながら、本記事を読んでいただければ、より理解がすすむかと思います。 Web アプリ開発の実行環境をお持ちでない方は、JSBin を使用して、Web ブラウザー上でコードの入力・編集、アプリの実行を試すこともできます。 2. Use Portal Basemaps のサンプルを確認 まず、Use Portal Basemaps のlive サンプル で動作を見てみます。 ※上記は、live サンプルを東京周辺で動作させたもの。 このサンプルを動作させてみると、多言語化を実現する上で、気づくのはどのようなことでしょうか? 特徴を列挙してみると、次のようなことがあげられます。 ベースマップ(Basemap)は日本語の地図 ベースマップ ギャラリー(BasemapGallery ウィジェット)は日本語の地図 左上の[+]や[ー] の拡大/縮小ツール(Zoom ウィジェット)のUIのポップアップは英語(Zoom in / Zoom out) 右上の場所検索ツール(Search ウィジェット)のUIは英語(Find address or place) 上記の動作を踏まえると、 1) UIの多言語化対応 2) べースマップとべースマップ ギャラリーの多言語化対応 がそれぞれ別に対応する必要がありそうです。それでは実装のポイントをみていきましょう。 3. 実装のポイント ポイント1:UIの多言語化対応 ArcGIS API for JavaScript 4.x のローカライズについては「How does localization work with the ArcGIS for JavaScript API ?」で解説されています。 説明を読むと、まもなく国内サポート開始予定のArcGIS API for JavaScript 4.16 以降では、intl.setLocale(locale) を使うことを推奨しており、この設定だけでウィジェットも設定した言語になるようです。 ArcGIS API for JavaScript 4.16 以降では、次のような実装となります。 <script>
require([
"esri/intl"
], function(
intl
) {
// Help に記載のうち、英/日/独/仏だけをサンプルとして設定
// https://developers.arcgis.com/javascript/latest/api-reference/esri-intl.html#setLocale
intl.setLocale("en");
//intl.setLocale("ja");
//intl.setLocale("de");
//intl.setLocale("fr");
~ 省略 ~ ※ ArcGIS API for JavaScript 4.16 より前のバージョンの場合は、dojoConfigで次のような実装になります。 <link rel="stylesheet" href="https://js.arcgis.com/4.15/esri/themes/light/main.css"/>
<script>
dojoConfig = {
locale: "en",
//locale: "ja",
//locale: "de",
//locale: "fr",
parseOnLoad: true
};
</script>
//JavaScript API のロードの前に上記のdojoConfig のlocale を設定
<script src="https://js.arcgis.com/4.15/"></script> ポイント2:べースマップとべースマップ ギャラリーの多言語化対応 自組織のPortal(ArcGIS Online / ArcGIS Enterprise のPortal)にログインした状態だと、Portal の設定情報に応じて利用するべースマップや、べースマップ ギャラリーの切り替えが可能ですが、今回のサンプルでは、ログインしていない状態のため、REST API に対して直接 culture と region を設定して、リクエストを送るように実装します。 ArcGIS API for JavaScript 4.16 以降では、次のような実装となります。 // 以下が リクエスト横取りしてパラメータに culture と region を設定するコード
const selfUrl = "https://www.arcgis.com/sharing/rest/portals/self";
esriConfig.request.interceptors.push({
urls: selfUrl,
before: function(params) {
if (params.requestOptions.query) {
switch(intl.getLocale())
{
case "en":
params.requestOptions.query.culture="en";
params.requestOptions.query.region="US";
break;
case "ja":
params.requestOptions.query.culture="ja";
params.requestOptions.query.region="JP";
break;
case "de":
params.requestOptions.query.culture="de";
params.requestOptions.query.region="DE";
break;
case "fr":
params.requestOptions.query.culture="fr";
params.requestOptions.query.region="FR";
break;
}
}
}
}); ※ ArcGIS API for JavaScript 4.16 より前のバージョンの場合は、dojoConfig.locale を使って次のような実装になります。 // 以下が JavaScript リクエスト横取りしてパラメータに culture と region を設定するコード
const selfUrl = "https://www.arcgis.com/sharing/rest/portals/self";
esriConfig.request.interceptors.push({
urls: selfUrl,
before: function(params) {
if (params.requestOptions.query) {
switch(dojoConfig.locale)
{
case "en":
params.requestOptions.query.culture="en";
params.requestOptions.query.region="US";
break;
case "ja":
params.requestOptions.query.culture="ja";
params.requestOptions.query.region="JP";
break;
case "de":
params.requestOptions.query.culture="de";
params.requestOptions.query.region="DE";
break;
case "fr":
params.requestOptions.query.culture="fr";
params.requestOptions.query.region="FR";
break;
}
}
}
}); おまけ:マップ座標やスケール、ズームレベルをUIに表示 上記2つのポイントで、UIとべースマップを多言語に対応することは可能ですが、せっかくなのでArcGIS API for JavaScriptのAPI リファレンスの「Get map coordinetes」のガイドで解説しているコードも追加してみます。 // Get map coordinetes からのコード
var coordsWidget = document.createElement("div");
coordsWidget.id = "coordsWidget";
coordsWidget.className = "esri-widget esri-component";
coordsWidget.style.padding = "7px 15px 5px";
view.ui.add(coordsWidget, "bottom-right");
// lat, lon, zoom and scale の更新するfunction を定義
function showCoordinates(pt) {
var coords = "Lat/Lon " + pt.latitude.toFixed(3) + " " + pt.longitude.toFixed(3) +
" | Scale 1:" + Math.round(view.scale * 1) / 1 +
" | Zoom " + view.zoom;
coordsWidget.innerHTML = coords;
}
// view の動作がが終了したタイミングで中心座標を表示するためのイベントを追加 (例えば zoom, pan などのイベント)
view.watch(["stationary"], function() {
showCoordinates(view.center);
});
// クリックやムーブ時のマウスの座標を表示するためにイベントを追加
view.on(["pointer-down","pointer-move"], function(evt) {
showCoordinates(view.toMap({ x: evt.x, y: evt.y }));
}); 3. 完成版 上記の実装ポイントを踏まえた完成版のアプリケーションは、次のようになります。 4. まとめ ArcGIS API for JavaScript が提供しているAPI リファレンスのサンプルコードやウィジェット、ArcGIS Online で提供しているべースマップの仕組みを活用することで、多言語対応のアプリケーションの実現を簡単に行うことが可能です。 COVID-19が終息し、海外からの観光客が戻ってくるときに備え、多言語対応のUIとべースマップをアプリケーションで試してみてはいかがでしょうか? 今回作成したサンプルは以下で動作を確認することも可能です。 Use Portal Basemaps(英語版):https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/extra_multi_basemap/BasemapPortal_en_416.html Use Portal Basemaps(日本語版):https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/extra_multi_basemap/BasemapPortal_ja_416.html Use Portal Basemaps(ドイツ語版):https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/extra_multi_basemap/BasemapPortal_de_416.html Use Portal Basemaps(フランス語版):https://esrijapan.github.io/arcgis-samples-4.0-js/samples/startup_api/extra_multi_basemap/BasemapPortal_fr_416.html
... View more
08-13-2020
10:46 PM
|
0
|
0
|
1937
|
Title | Kudos | Posted |
---|---|---|
1 | 11-20-2020 08:47 PM | |
3 | 12-07-2018 10:42 PM | |
1 | 08-27-2019 10:56 PM | |
1 | 12-04-2018 09:45 PM | |
1 | 08-30-2018 11:28 PM |
Online Status |
Offline
|
Date Last Visited |
11-26-2023
11:43 PM
|