国土地理院タイルとC#とWindowsフォームとOpenGLで地形表示

cvx0017と申します。初めて投稿させていただきます。

国土地理院が公開している標高タイルその他のデータを使用して地形を表示するプログラムを作成していましたので、紹介させていただきます。
![桜島](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/8eea68ff-ab6d-2b08-c88a-861377778d07.png)
本プログラムは、国土地理院タイルを使用した地形表示等の機能を提供する.NETクラスライブラリを使用して作成されています。

**プログラムの実行方法を含む詳細は、後述するソース（プロジェクト）のフォルダにある「GeoViewer_sample_github.pdf」をご覧ください。**

ここでは、本プログラムの概要を紹介させていただきます。可能であれば、ソースもご覧いただき、ご意見等をいただけると幸いです。

# プログラムの概要・動作環境

本プログラムは、設定ファイルに指定した範囲の標高タイル及び地図画像タイル（地図画像及び衛星画像）を国土地理院HPから自動的にダウンロードし、鳥瞰図として表示します。

動作環境等はWindows11、Windowsフォーム（.NET6.0）、OpenGLです。Windows10（64bit）でも動作確認済みです。

:::note info
本プログラムの実行には、.NET6.0の他、MSVCランタイムが必要です。この後の項目「ソース（C#プロジェクト）」の解説に従ってインストールしてください。
:::

本プログラムは、国土地理院が公開している以下のデータを使用します。

* 国土地理院タイル
標準地図（任意のズームレベル）
写真（任意のズームレベル）
標高（ズームレベル14）
（必要なタイルが自動的にダウンロードされます。）

* 国土地理院ジオイドモデル
「日本のジオイド2011（Ver2.1）」をバイナリ形式に変換したもの。
（バイナリ形式への変換については、「GeoViewer_sample_github.pdf」の「プログラムの実行準備（ジオイドデータの作成）」をご覧ください。）

出典：国土地理院タイル（[https://maps.gsi.go.jp/development/ichiran.html](https://maps.gsi.go.jp/development/ichiran.html)）
　　　国土地理院ジオイドモデル（[https://fgd.gsi.go.jp/download/geoid.php](https://fgd.gsi.go.jp/download/geoid.php)）

:::note warn
本プログラムは、国土地理院タイルを自動的にダウンロードしてローカルディスクに保存するため、インターネットを使用し、ディスク（プロジェクトフォルダの「bin/Debug/net6.0-windows/gsi」フォルダ）に書き込みを行います。本プログラムの実行により生じた損害に対しては責任を負いかねますのでご了承ください。
:::
:::note warn
国土地理院が提供する各種データの使用にあたっては、国土地理院の定める使用条件に従ってください。
:::

# ソース（C#プロジェクト）

下記のGitHubからプロジェクトを取得してください。Visual Studio 2022のC#プロジェクトです。Visual Studio Community 2022（Version 17.2.0）で開発しています。

 [地形表示サンプルプログラム](https://github.com/nimbus1170/GeoViewer_sample)

:::note info
C++で作成した.NETクラスライブラリを使用しますので、Visual Studio Installerのワークロードで「.NET デスクトップ開発」の他に「C++によるデスクトップ開発」をインストールしておいてください。（実行のみの場合でもランタイムが必要です。）
:::

# プログラムの概要

設定ファイル（XML）で指定した地域を鳥瞰図表示します。マウスで画面操作が可能です。また、経緯度及びUTMのグリッドを表示しています。
![sakurajima_viewer.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/7c20357b-3484-9eda-4573-cdf0f5dea1bf.jpeg)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/8e51dc20-6499-5218-3a37-4550433562e4.png)

ハイライト、環境光及び鏡面光を設定できます。それぞれOpenGLのShininess、Ambient（Diffuseも同じ値）及びSpecularを設定するものです。下の画像は、環境光を暗く、鏡面光を強くしたものです。
![sakurajima_viewer_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/7b583f92-8457-4f9b-ebc9-abdfc4401b20.jpeg)

標高を拡大表示できます。下の画像は３倍に拡大したものです。
![sakurajima_viewer_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/423a32c9-b35d-7113-ef0f-17ec1c8a3708.jpeg)

フラットシェーディング、スムースシェーディング又はテクスチャマッピングに切り替えができます。下の画像はスムースシェーディングにしたもので、陸上が緑、海上（標高0m）が青で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/8871c3ba-7200-4261-25ea-c22319e81d25.png)

注視点にマーカー（1辺100mの逆ピラミッド型の目印）を表示しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/e32f98d8-f017-dd15-cf25-af6b89b12c26.png)

OpenGLのフォギングにより視程を表現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/5ad75170-47b4-bdf2-6ad7-fa7f1dd6ccfa.png)

地図画像と衛星画像のいずれかを選択して表示できます。下の画像は衛星画像を表示したものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/67905ddc-4fe4-8356-7ae0-fd25375782f1.png)

数種類の図形を描画する機能もあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/7175b361-6292-0660-e9cf-9e1649e1b289.png)

# 終わりに

ここまでお読みいただき、ありがとうございました。

サンプルプログラムでは、設定ファイルで任意の地域の表示が可能ですので、お試しいただけると幸いです。

失礼いたします。