Translate

2022年12月29日木曜日

 国土地理院 基盤地図情報数値標高モデルをGeoJSON化する

国土地理院は、日本のすべての測量の基礎となる基本測量を行う国交省の特別機関です。
国土地理院ではいろんなデータを公開しているのですが、そのなかでも地図作成の基本となるデータ「基盤地図情報」がダウンロード可能になっています。




Google MapやYahoo地図だけでなくOpenStreetMapなどXYZタイルをWeb APIで取得できるようになっているので、正直地図をイチから作成することはあまりなかったことですが、近年の機械学習のヒットで地図情報も入力データとして扱うようになってきました。

ただ基盤地図情報からダウンロードできるデータは、GML、XML、Shape、ASCIIといった形式で、TensorFlow/PyTorchの入力データ化するには、事前の処理としてのパースがどうしても必要になります。

基盤地図情報は以下の3つの種類にわかれています。

  • 基本項目
  • 数値標高モデル
  • ジオイド・モデル


このうち、一番利用されるのが基本項目。道路や鉄道、海取り口の境界線、建物などがGML形式になっています。ダウンロードできるファイルの種類が多く、それぞれの種類で比空間データの属性がことなるため厄介です。



 

ただ、Python geopandasにあるread_file()を使えば簡単にGeoDataFrame化できるので、パースは簡単です。


 


ジオイド・モデルはXMLかASCIIかのどちらかで、どちらも独自のパースが必要ですが、ASCII形式のデータが固定長なので、比較的実装はしやすいので、こちらも問題ないとおもいます。



 

ただ、ジオイド・モデルの特性上、GPSの生データの標高補正か球体にテクスチャを貼り付けて地球の球面を表示する場合くらいにしか使い道がないので、必要になればその時実装すればいいだけだとおもいます。


 


数値標高モデルは、いわゆるDEM: Digital Elevation Model というやつで、日本の国土の地面の標高(m)を5m/10mメッシュ単位にまとめたもので、XML形式でダウンロードできます。
この数値標高モデルのXMLはGMLベースですが、標高が格納されている要素内に直列でならんでいたり、ほかの要素や属性値を使わないときちんとデータとして使用できないので、しっかり仕様を読み込んでパース処理を実装しなくてはなりません。


 


そこで、DEM(XMLファイル)を読み込み、GeoJSON化して出力する変換プログラムを作成しました。

以下のGitHubリポジトリにおいてあるコードをおきました。



まず実行環境を作成します。

conda create -n geo python numpy geopandas
conda activate geo


リポジトリのクローンします。

cd hogehoge
git clone https://github.com/coolerking/basemap
cd basemap/dem



download ファイルを作成し、基盤地図情報ダウンロードサイトから取ってきた数値標高モデルを取得、展開して対象のXMLをここに格納します。

mkdir download
# XMLファイルをdownloadディレクトリに格納する


models.py を実行します。omit_no_dataオプションをつけると、-9999.0のデータをすべて削除します。

python models.py --omit_no_data


作成されたGeoJSONはoutputディレクトリに格納されます。

GeoJSONを確認したい場合は下図のように QGIS などの統合GISソフトウェアで読み込ませるか、GeoPandasのGeoDataFrame化してから、plot()すれば表示できます。


 

 

p.s.

国土地理院基盤地図情報については国土地理院サイトもしくは、以下のスライドを参考にしてみてください。

 

複数の入手元から複数GISデータを統合してデータ分析する場合、測地座標系をあわせるという作業がとても厄介です。基盤地図情報はJGD2011v2.1(本記事執筆時点)ですが、GPSの測地系であるWGS84とは完全に一致しません。地図の世界では表示する縮尺によりこの精度を無視することがありますが、データ分析でどうするかはどのくらい誤差があるか、そもそもWGS84とはなにでJGD2011とはどうちがうのか、がわからないと正確に扱うことはできません。

まあ30年くらい前の車載GPSのように海岸線を走っているのに画面では海の上にいることになっていたりするかもですが、そのあたりどう"目をつぶるか"がGISデータの取り回しする人間の裁量になってくるのでしょう。 

0 件のコメント:

AWS Glueジョブ(Python/Spark)にPythonパッケージを追加する方法

 AWS Glueジョブには2つの種類が存在します。 ETLジョブ(Spark) PySparkコードが実行できるジョブ。 最低でも10並列で実行するので、DynamicFrame/DataFrame操作以外の処理はPython Shellジョブを使ったほうがよい。 Python...