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

2024年9月15日日曜日

紙等高線地図から地形3Dモデルを作成する方法

 How to create a 3D terrain model from a paper contour map


This article summarizes how to create a 3D terrain model from a paper contour map. 3D models of past terrain that were lost in developments more than half a century ago can only be constructed from paper contour maps. Use QGIS (GRASS plugin). Note that the latest QGIS (3.38) cannot be used due to a bug.


紙等高線地図から地形3Dモデルを作成する方法をまとめました。半世紀以上前の開発で失われた過去地形の3Dモデルは紙等高線地図から構築するしかありません。QGIS(GRASSプラグイン)を使います。なお、バグにより最新QGIS(3.38)は利用できません。

1 紙等高線地図から地形3Dモデルを作成する方法

1-1 4年前の方法

4年前に紙等高線地図から地形3Dモデル作成方法をまとめたことがあります。

2020.12.19記事「紙地図等高線から地形3Dモデルを作成する方法

4年前の方法と今回の方法は基本は同じです。しかし、今回はGRASSGIS本体を使わないでQGIS(GRASSプラグインが導入されているもの)だけで済むようになりました。

1-2 【重要】最新QGIS(3.38)はバグでこの作業はできない

最新QGIS(3.40,2024.12.20)ではバグが解消され、v.surf.rstツールが正常に稼働します。

https://hanamigawa2011.blogspot.com/2025/01/qgis340grass.html

この作業はQGISでGRASSプラグインのv.surf.rstツールを使用します。このv.surf.rstツールは最新のWindows版QGIS(3.38)ではバグにより正常に動作しません。

このバグに気が付かなくて、丸1日無駄な作業を繰り返しました。海外サイトを翻訳で読んでいて、バグがあることを知りました。Linux版QGIS(3.38)では正常とのことです。

仕方がないので、私は旧版のWindows版QGIS(3.12)を利用して、作業しました。

1-3 紙等高線地図の等高線shapeファイル作成

紙等高線地図から等高線shapeファイルを作成する必要があります。

紙等高線地図を画像にして、その画像から直に等高線shapeファイルを作成する方法を私はまだ知りません。(現在開発中です。)

残念ながら次の作業を事前に行う必要があります。

・紙等高線地図を画像にしてQGISにジオリファレンスします。QGISの座標系は直角座標系。

・QGISでジオリファレンスした地図の等高線を1本1本ラインとしてトレースして、標高(Z座標)もそれを書き込めるフィールドを用意して書き込みます。このデータをshapeファイルとして保存します。

1-4 GRASS GISプロジェクトの作成

● GRASS GIS プロジェクトのセットアップ

・QGISを起動し、GRASSプラグインを有効化します。

・「処理」メニューの「GRASSツールボックス」を開きます。

・新しいGRASSプロジェクトを作成します。

  ・「場所」(Location) と「マップセット」(Mapset)を設定する必要があります。これはGRASSが使用する空間データベースで、データの管理に使用します。

  ・「GRASS新しい場所を作成」から座標系を指定します。等高線データの座標系(例:EPSGコード)を設定してください。

1-5 データのインポート

● 等高線のインポート

・GRASS GISにshapefileをインポートする必要があります。

・QGISのGRASSツールボックスから「v.in.ogr」ツールを使用して、等高線shapefileをインポートします。

  ・パラメータ:

    ・input: 等高線のshapefileのパス

    ・output: インポート後のGRASS内部でのベクトルマップ名

    ・レイヤーを確認して正しいベクトルデータがインポートされたかを確認してください。

1-6 等高線データからDEMの作成

1-6-1 v.surf.rst(スプライン補間)を使用したDEM作成

・GRASS GISで等高線データから補間を行い、DEMを作成します。補間にはv.surf.rstツールを使用します。これは、張力付き正則化スプライン補間を行い、点や等高線データから表面を推定するものです。

 手順:

・QGISの「GRASSツールボックス」から、v.surf.rstを検索し実行します。

  ・input:インポートした等高線のベクトルマップを選択します。

  ・zcolumn:等高線のZ値(標高)が格納されている属性フィールドを選択します。

  ・elevation:出力するDEMのラスター名を指定します。

  ・その他オプション:

    ・tension: スプラインの張力(通常はデフォルト値で問題ありませんが、必要に応じて調整します)。

    ・smooth: スムージングパラメータ(データが非常にノイズが多い場合に使用することがあります)。

・実行をクリックして、補間処理を実行します。

1-6-2 出力DEMの確認

・補間処理が完了すると、GRASSデータベース内にラスター形式でDEMが作成されます。

・QGISのメインウィンドウにDEMを表示し、正しく作成されているか確認します。これは浮動小数点形式の標高データとして表示されます。

1-7 DEMのエクスポート

・GRASS GIS内部で作成されたDEMをshapefileやGeoTIFF形式にエクスポートするには、r.out.gdalを使用します。これはGRASS GIS内のラスターを外部フォーマットに変換するためのツールです。

手順:

1-7-1 QGISの「GRASSツールボックス」から、r.out.gdalを検索し実行します。

  ・input:作成したDEMラスターを選択します。

  ・output:エクスポートするファイルのパスを指定します(例:GeoTIFF形式で保存する場合、output.tifと指定)。

  ・format:GeoTIFFなど、必要なフォーマットを指定します。

1-7-2 実行をクリックしてDEMをエクスポートします。

1-8 DEMの可視化と解析

・QGISの「ラスタ」メニューや「3D表示」ツールを使用して、生成されたDEMの可視化や地形解析(例:斜度、方位の計算など)を行うことができます。

(1-4~1-8はChatGPT説明です。私が作業で確かめています。)

2 感想

2-1 等高線画像からラインのshapeファイルを作成する方法

等高線画像からラインのshapeファイルを作成する方法の開発に取組んでいます。現状では等高線画像の等高線は必ず幅がありますから、これをラインとして読みとることに成功していません。幅のある線を幅の無い線に変換する方法は世の中には必ずやあると思うのですが。紙地図から等高線shapeファイルが簡単につくれるようになると、この作業は恐ろしいほど効率化が進みます。

2-2 紙等高線地図から地形3Dモデルを作成するニーズは小さい

紙等高線地図から地形3Dモデルを作成するニーズはとても小さいので、QGISにバグがあっても日本ではそのバグに気が付く人はいないようです。QGISでv.surf.rstツールが使えないという質問が幾つかのサイトにありますが、その解決策となる回答はありません。開発前地形、失われた地形の3Dモデル作成に関心のある人は大変少ないようです。このような状況なので、私が丸1日の時間を無駄にし、イライラし、自信喪失したことは、支払わなければならなかった必要経費として納得しなければならないようです。


等高線から作成した地形3Dモデル(QGISプラグインQgis2threejs画面)


2024年4月21日日曜日

手書き遺物分布図画像から座標計測する方法

 How to measure coordinates from a handwritten artifact distribution map image


As the future of digitizing antiquities registers has become brighter, I have considered a method for measuring planar coordinates from images of handwritten artifact distribution map image. By effectively using BlenderPython, measurements can be performed comfortably. However, measuring 63,000 relics requires considerable labor.


遺物台帳電子化の先行きが明るくなりましたので、手書き遺物分布図画像から平面座標を計測する方法を検討しました。BlenderPythonを効果的に使うことにより、快適操作で計測できます。ただ63000遺物計測はかなりの力仕事になります。

1 手書き遺物分布図画像から座標計測する方法

1-1 事例グリッド(Ⅱ-58)の場所


事例グリッド(Ⅱ-58)の場所

1-2 手書き遺物分布図画像のグリッド別切り抜き


手書き遺物分布図スキャン画像(Ⅱ-48及びⅡ-58グリッド)

手書き遺物分布図スキャン画像の傾きを補正して正立させ、グリッド単位で正確に切り抜きます。(Photoshop作業)


グリッド切り抜き画像(Ⅱ-58グリッドの例)


拡大図

1-3 グリッド切り抜き画像のBlenderプロットとグリッド位置正置

グリッド切り抜き画像を「画像を平面で」でBlenderにインポートし、寸法をX:2m、Y:2mに変更し、X軸とY軸が合うように回転させ(この場合Z:90°)ます。

画像を選択した状態で、オブジェト→原点を設定→原点を3Dカーソルへ移動をクリックして、画像の中央に原点を設定します。

画像位置を当該グリッドに移動します。(Ⅱ-58グリッドの場合、Ⅹ:11m、Y:27m)

1-4 CUBEを生成し遺物番号位置に配置する

「カーソル位置にCUBEを生成するBlenderPythonスクリプト」をテキストエディターに読み込みます。

カーソル位置にCUBEを生成するBlenderPythonスクリプト(ChatGPT支援により作成)

import bpy # カーソルの位置を取得 cursor_location = bpy.context.scene.cursor.location # 新しい立方体を作成 bpy.ops.mesh.primitive_cube_add(size=0.01, location=cursor_location) # 作成した立方体を選択 new_cube = bpy.context.active_object # マテリアルを作成 material = bpy.data.materials.new(name="Red") material.diffuse_color = (1.0, 0.0, 0.0, 1.0) # 赤色 # 立方体にマテリアルを適用 if new_cube.data.materials: # マテリアルが既に存在する場合、最初のスロットに新しいマテリアルを挿入 new_cube.data.materials[0] = material else: # マテリアルが存在しない場合、新しいマテリアルを追加 new_cube.data.materials.append(material)

ギズモのZをクリックして上から画像を見下ろします(上からオルソ投影にします)。

遺物位置にカーソルを移動し、テキストエディターのスクリプト実行ボタン(黒い三角)をクリックします。遺物位置にCUBE(赤い0.01m×0.01m×0.01mのCUBE)が生成しますので、アウトライナーの当該CUBE欄で名称を当該遺物番号に変更します。

同様に、遺物毎にカーソル位置変更→スクリプト実行→名称変更を繰り返します。


幾つかの遺物位置に赤CUBEを生成した様子(オルソ投影)


斜め表示

1-4 CUBEの名称と座標をファイル出力する

「CUBEの名称と座標をファイル出力するBlenderPythonスクリプト」をテキストエディターに読み込みます。

CUBEの名称と座標をファイル出力するBlenderPythonスクリプト(ChatGPT支援により作成)

import bpy

# 出力ファイルのパス
output_file = "E:/test/text.txt"

# 選択されたオブジェクトを取得
selected_objects = bpy.context.selected_objects

# 出力用のテキストを準備
output_text = ""

# オブジェクトごとに名前と座標を取得してテキストに追加
for obj in selected_objects:
    name = obj.name
    location = obj.location
    x, y, z = location
    output_text += f"{name},{x},{y},{z}\n"

# テキストファイルに書き込み
with open(output_file, 'w') as file:
    file.write(output_text)

print(f"Output written to {output_file}")

全てのCUBEを選択し、スクリプト実行ボタンをクリックします。遺物番号とⅩ座標、Y座標がファイル出力されます。(スクリプトは汎用性をもたせるためにここではZ座標も一緒に出力していますが、Z座標は不用です。)


ファイル出力した様子

参考 aaaはグリッド左上頂点のデータ、bbbはグリッド右下頂点のデータです。

今後、スクリプトを調整して桁数を実用レベルに(見やすく)するために減じる予定です。

2 遺物の3D座標

1の方法で取得したⅩ座標、Y座標データと遺物台帳から取得したZ座標データを遺物毎に合わせると遺物の3D座標となります。遺物毎に2つのデータを合わせる作業はPythonスクリプトで行います。

3 感想

遺物分布図から遺物平面座標を求める具体的で確かな方法を構築できました。作業したBlenderファイルを保存しておくことで、どの遺物の座標を読み取ったのかという状況が後からチェックできます。作業操作感も自分は快適に感じるのでとても実用的であると考えます。あとは63000件を力仕事として処理するだけです。

遺物台帳入力完遂のメドがたってきましたので、試行的に特定グリッドの遺物分布図から座標を読み取り、遺物台帳座標とあわせて、遺物3D分布モデルを作成してみることにします。