国土地理院 基盤地図情報の利用

なんちゃってGeoTiff(tif)

 Blenderで立体地図という記事内容なので需要があるとは思えませんが、既にDEMのtifを持っているとか、ASTER DEMで世界の各地を見たいということも一応考えられますので、簡単なtif読み込みも掲載します。

 上の図は国土地理院5mメッシュの三宅島tifですが、余分な未定義データーをできるだけ削除したトリミングタイプで、ファイルサイズが小さくなる利点があります。画像ファイルならではですね。ちなみに画像のドット数は横1735×縦1460です。1ファイルで簡単に扱えますが、画素数が非常に多い場合がほとんどで、Blenderの処理は大変重くなることが多いです。

 Blenderではtifの読み込み部分を当然持っていますが、これがGeoTiffに対応しているかどうかは全く分かりません。というより、目的が違うので対応していないはずです。

 そこで、tifをPythonで全部読むことにします。ただ、tifはチェックすべき項目が大変多く、何から何まで全部チェックするときりがないので、ありがちなtifが読める範囲だけにしています。よって、読めないtifもあるはずです。必要なら自分で改造してください。

 このソースも処理が長くなるのでスクリプトファイルを2つに分けています。モジュール化の目的ではなく、短くするだけの目的なので汎用性はありません。2つのスクリプトの配置や注意事項はこのサイトの 縦横比が正しい浮き出し地図を作る(シェープファイル) を参照してください。

 tif ファイルをマージした直後で、ファイル名も Merge.tif になっている状態のものから、専用のcsvファイルを生成します。このcsvは、1行目が横と縦のピクセル数、2行目以降は座標の位置と高さを格納してあります。エクスプローラでtifファイルをexeファイルのアイコンにドラッグするか、コマンドでtifファイルをパラメータとして起動します。

csv作成ツール(64ビット用)
csv作成ツール(32ビット用)

続いてBlenderで読み込むスクリプトこちらに生pyファイルがあります。ここでは、マージ直後の北海道のソース例です。グリッドを作り、ひたすら転記に没頭しています。

#!BPY
import bpy
#
CsvFile = "Merge.csv"   # ここに読み込むcsvのファイル名
scale = 0.00001 #北海道は大きいので、思い切って小さく
#
print( "\n***** Start Script. *****" )
#
# 既存メッシュの削除
#bpy.ops.object.mode_set(mode='OBJECT')
for item in bpy.context.scene.objects:
        if item.type == "MESH":
                bpy.context.scene.objects.unlink( item )
for item in bpy.data.objects:
        if item.type == "MESH":
                bpy.data.objects.remove( item )
for item in bpy.data.meshes:
        bpy.data.meshes.remove( item )
#
# file open
f = open( CsvFile, 'r' )
data1 = f.readline()
item = data1.split( ',' )
numX = int(item[0])
numY = int(item[1])
#
# 分割の数は、面の数ではなく頂点の数を指定する。
bpy.ops.mesh.primitive_grid_add( x_subdivisions = numX, y_subdivisions = numY, radius=1, location=( 0, 0, 0 ) )
Grid = bpy.data.objects[ "Grid" ]
#
Grid.scale[ 0 ] = scale
Grid.scale[ 1 ] = scale
Grid.scale[ 2 ] = scale
ptr = 0
for y in range( 0, numY ):
    for x in range( 0, numX ):
        data1 = f.readline()
        item = data1.split( ',' )
        px = float( item[ 0 ] )
        py = float( item[ 1 ] )
        alt = float( item[ 2 ] )
        Grid.data.vertices[ ptr ].co = ( px, py, alt );
        ptr = ptr + 1
#
f.close()
#
# 未定義データー(標高値 = -9999.0)があればをまとめて削除
bpy.context.scene.objects.active = Grid
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.select_all(action='DESELECT')
bpy.ops.object.mode_set(mode='OBJECT')
for v in bpy.context.object.data.vertices:
        if v.co[2] == -9999.0:
                v.select = True
bpy.ops.object.mode_set(mode='EDIT')
bpy.ops.mesh.delete(type='VERT')
bpy.ops.object.mode_set(mode='OBJECT')

 なお、くろねこさんの指摘にもありますがdemtoolというソフトで作ったtifはデタラメな値を書いており信用できないため、このスクリプトには絶対に通さないでください。

 三宅島を北東から見るとこんな感じで。

 国土数値情報の1kmメッシュ(3次メッシュ)の北海道だと、こんな感じで。

 一方こちらの目印の先端は、トンネルの壁から人骨が出てきたという北海道常紋峠の信号場。シカ、ヒグマ、撮り鉄などの動物が私有地内に入り込みます。

 Blenderと全く関係ありませんが、この石北本線で、西留辺蘂(にしるべしべ)から2つ隣の生野(いくの)まで23.5kmを普通列車で行くと、2016年3月末からのダイヤでは最短で12時間2分かかります。平均で2km/h以下ですから、体力に自信のある方はたぶん歩いたほうが速く着きます。興味のある方は挑戦してはいかかでしょうか。

<トップページに戻る>


Copyright© Shizuka-Toikanbetsu.
inserted by FC2 system