ラベル KML の投稿を表示しています。 すべての投稿を表示
ラベル KML の投稿を表示しています。 すべての投稿を表示

2025年11月10日月曜日

Stamen Map TilesをOracle APEXのマップ・リージョンの背景マップにする

米国San FranciscoのStamen Design社が開発したStamen Map Tilesを、Oracle APEXのマップ・リージョンの背景マップにしてみます。Stamen Map Tilesは現在Stadia Maps社のプラットフォームより配布されているため、Stamen Map Tilesを背景マップとして使用するには、Stadia Maps社にユーザー登録する必要があります。非商用用途に限定したFreeプランが提供されています。

Stadia Maps社から配布されているStamen Map Tilesを使用するにあたって、以下のサイトに記載されているFAQを参照します。

Stamen Design × Stadia Maps
https://stadiamaps.com/stamen/

設定については以下のページで説明されています。

Migration Guide for Stamen Map Tile Users
https://docs.stadiamaps.com/guides/migrating-from-stamen-map-tiles/

作成したAPEXアプリケーションのマップは、以下のように表示されます。マップ上に表示しているのは東京都オープンデータカタログサイトにあるTOKYO WALKING MAPより、水元・柴又エリア~寅さんの柴又帝釈天と水元公園へのみち~としてダウンロードできるKMLファイルを、データベースにロードして表示しています。


macOS上のpodmanで実行しているOracle APEXの環境で作業します。構築手順については、こちらの記事「podmanを使ってOracle Database FreeとOracle REST Data Servicesをコンテナとして実行する」で紹介しています。

以下より、APEXアプリケーションの作成手順を紹介します。

水元・柴又エリア~寅さんの柴又帝釈天と水元公園へのみち~を開き、ZIPファイルをダウンロードします。


ファイルは以下の名前でダウンロードされます。

131229_Mizumoto_and_Shibamata_Area_-_Tora-sans_Road_to_Shibamata_Taishakuten_and_Mizumoto_Park.zip

これはKMLファイルをZIP圧縮したファイルなので、KMZファイルとして扱うことができます。ファイル名をwalking.kmzに変更します。

以降の作業では、上記のファイルをwalking.kmzとして扱います。

GDALを使用してwalking.kmzをOracle Databaseにロードします。GDALを組み込んだコンテナの作成手順については、こちらの記事「GDALのogr2ogrを使ってShapefileをOracle DatabaseのSDO_GEOMETRY列にロードする」を参照してください。今回の作業を行なうにあたって、LIBKMLのドライバの組み込むようにDockerfileを更新しています。

GDALを組み込んだコンテナを実行します。

podman run --rm -it -v $PWD:/home/oracle gdal

% podman run --rm -it -v $PWD:/home/oracle gdal

bash-5.1$


Oracle Databaseのドライバが参照されるように、環境変数を設定します。
export LANG=ja_JP.utf8
export NLS_LANG=American_America.AL32UTF8
export PATH=/usr/local/bin:$PATH
export ORACLE_HOME=/usr/lib/oracle/23/client64
export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/local/lib64:${LD_LIBRARY_PATH}

bash-5.1$ export LANG=ja_JP.utf8

export NLS_LANG=American_America.AL32UTF8

export PATH=/usr/local/bin:$PATH

export ORACLE_HOME=/usr/lib/oracle/23/client64

export LD_LIBRARY_PATH=${ORACLE_HOME}/lib:/usr/local/lib64:${LD_LIBRARY_PATH}

bash-5.1$ 


以下のogrinfoコマンドを実行し、KMZファイルに含まれるフォルダを一覧します。

ogrinfo -ro walking.kmz

今回、データベースにロードするのは無題のレイヤです。

bash-5.1$ ogrinfo -ro walking.kmz 

INFO: Open of `walking.kmz'

      using driver `LIBKML' successful.

1: 無題のレイヤ

2: 都立公園/Tokyo Metropolitan Parks and Gardens

3: 海上公園/Marine Parks

bash-5.1$ 


以下のogr2ogrコマンドを実行し、KMZファイルに含まれる散歩ルートをデータベースにロードします。
ogr2ogr -f OCI \
"OCI:wksp_apexdev/<パスワード>@host.containers.internal/freepdb1" \
./walking.kmz "無題のレイヤ" \
-nln TOKYO_WALKING_ROUTES \
-lco GEOMETRY_NAME=GEOM -lco SRID=4326 -nlt PROMOTE_TO_MULTI

bash-5.1$ ogr2ogr -f OCI \

"OCI:wksp_apexdev/********@host.containers.internal/freepdb1" \

./walking.kmz "無題のレイヤ" \

-nln TOKYO_WALKING_ROUTES \

-lco GEOMETRY_NAME=GEOM -lco SRID=4326 -nlt PROMOTE_TO_MULTI

bash-5.1$ 


エラーが発生しなければ、KMZ(KML)フォーマットで記載された散歩ルートはデータベースにロードされています。

APEXアプリケーションを作成し、マップ・リージョンで散歩ルートを表示します。

最初にSQLコマンドより、表TOKYO_WALKING_ROUTESにロードされたデータを確認します。以下のSELECT文を実行します。

select * from tokyo_walking_routes


データを確認すると、以下の3つの特殊な"Name"のデータが見つかります。これ以外は、観光地です。また、コース/Routeはポイントではなく行(LineString)です。

スタート/Start,ゴール/Goal,コース/Route

これらは、レイヤを分けて表示することにします。

APEXアプリケーションを作成します。

アプリケーション作成ウィザードを開き、デフォルトで作成されているホーム・ページを削除して、代わりにマップのページを追加します。

アプリケーションの名前TOKYO WALKING MAPとします。


マップのページ名散歩にはogr2ogrコマンドで作成したTOKYO_WALKING_ROUTESを選択します。ポイントを選択し、ジオメトリ列GEOMツールチップ列Nameを指定します。


以上でアプリケーションを作成します。

ページ・デザイナで作成されたアプリケーションのホーム・ページを開きます。


作成済みのレイヤ散歩から、列Nameの値がスタート/Startゴール/Goalコース/Routeのデータを除きます。これらは別のレイヤとして表示します。

ソースWHERE句に以下を記述します。

"Name" not in ('スタート/Start','ゴール/Goal','コース/Route')

情報ウィンドウタイトル列Name本体列descriptionを設定します。


レイヤ散歩を重複させ、スタート位置を表示するレイヤに変更します。

名前スタートソースWHERE句に以下を設定します。

"Name" = 'スタート/Start'

外観塗りつぶしの色を赤(#ff0000)にします。


ゴールを表示するレイヤを作成します。

名前ゴールソースWHERE句に以下を設定します。

"Name" = 'ゴール/Goal'

外観塗りつぶしの色を緑(#008000)にします。


コースを表示するレイヤを作成します。

名前コースレイヤー・タイプにします。ソースWHERE句に以下を設定します。

"Name" = 'コース/Route'

外観のストローク・スタイルに点線を選択し、ストロークの色を黒(#101010)にします。


以上で、水元・柴又エリアの散歩コースがマップ上に表示されるようになりました。


次にマップ背景を変更します。

共有コンポーネントマップ背景を開きます。


作成を開始します。


Standia Mapsにユーザー登録をして、APIキーを生成済みとします。

名前Stamen Terrainとし、タイプラスターXYZタイル・レイヤーを選択します。APIキーにStandia Mapsで取得したAPIキーを設定し、ラスター・タイル(XYZ) URLとして以下を記述します。

https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}.png?api_key={api_key}

以上でマップ背景の作成をクリックします。


マップ背景が作成されます。属性に以下のコピーライト情報を記述します。
&copy; <a href="https://stadiamaps.com/" target="_blank">Stadia Maps</a> <a href="https://stamen.com/" target="_blank">&copy; Stamen Design</a>
&copy; <a href="https://openmaptiles.org/" target="_blank">OpenMapTiles</a>
&copy; <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a>
以上で変更の適用をクリックします。


以上でマップ背景が作成されました。


マップ・リージョンの属性を開き、マップ背景共有コンポーネントを選択します。標準として先ほど作成したマップ背景Stamen Terrainを設定します。


以上でAPEXアプリケーションは完成です。アプリケーションを実行すると、以下のマップが表示されます。


今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-kml-and-stamen-map-tiles.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。