• openDDLについて
  • サイトポリシー
  • ご利用前にお読みください
  • EN
  • SIGN IN:
  • SIGN IN:
GH_Python 国土地理院にある標高5mメッシュのxmlデータを直接読み込むNo.1
by Yoshimasa Matsumoto May 22, 2018

初投稿です。
こんな内容で投稿していいのかわかりませんが、日建設計名古屋支社で学生アルバイトをしているのもあり、OpenDDLが前から気になっていたので、投稿します。

前置きはこれくらいにしまして、、、
設計課題時に、毎回毎回等高線データを作るためにいくつものアプリケーションを経由したりするのが、本当に大変ですよね。
前からずっとGHで直接読み込めれば、どんな等高線データも作れたのにって思っていたのですが、なかなかPythonの知識が追いつきませんでした。

ようやくPythonで色々かけるようになり、なんとか1ファイルだけ読み込めるようになったので、投稿します。

import sys
import re

import Rhino
import scriptcontext
# for accesssing GH classes
import clr
clr.AddReference("Grasshopper")
from Grasshopper.Kernel.Data import GH_Path
from Grasshopper import DataTree

tree = DataTree[object]()

def TranslateDem(filename):
with open(filename, "r") as f:
#mesh
r = re.compile("

<mesh>(.+)</mesh>")
for ln in f:
m = r.search(ln)
if m != None:
mesh = m.group(1)
break

# grid len
r = re.compile("

<gml:high>(.+) (.+)</gml:high>")
for ln in f:
m = r.search(ln)
if m != None:
xlen = int(m.group(1)) + 1
ylen = int(m.group(2)) + 1
break

# start
r = re.compile("

<gml:tupleList>")
for ln in f:
m = r.search(ln)
if m != None:
break

# data
data = []
r = re.compile("

</gml:tupleList>")
r2 = re.compile(",(.+)")
for ln in f:
m = r.search(ln)
if m != None:
break
else:
m = r2.search(ln)
if m != None:
data.append(float(m.group(1)))

# start point
startx = starty = 0
r = re.compile("

<gml:startPoint>(.+) (.+)</gml:startPoint>")
for ln in f:
m = r.search(ln)
if m != None:
startx = int(m.group(1))
starty = int(m.group(2))
break

##Create Matrix
data2 = [i for i in range(xlen*ylen)]
start_pos = starty*xlen + startx
for i in range(xlen*ylen):
if i < start_pos:
data2[i] = -9999.
else:
data2[i] = data[i-start_pos]

data = [data2[i:i+xlen] for i in range(0,len(data2),xlen)]

return data

def nestedListToDataTree(nestedlist):
dataTree = DataTree[object]()
for i, item_list in enumerate(nestedlist):
path = GH_Path(i)
dataTree.AddRange(item_list,path)
return dataTree

data = TranslateDem(file)
p = nestedListToDataTree(data)

出力はこんな感じになります。
DdeLH8HV0AABVMt.jpg

流れとしては
①xmlデータから正規表現で値を取得。
②値をメッシュに合わせてリストを作成。
③それぞれのメッシュの標高(z座標)を受け渡す
といったような流れになります。

本投稿はNo.1としてますが、開発過程を投稿してみなさんからアイデアをいただいたり、これからさらに複数ファイルで読み込めるようにしたりとNo2,No3と投稿していく予定です。

改良ポイント)
①コンポーネントを繋いで5mグリッドに点を作っていくものを作らないといけない、メッシュをつくらないといけない。
②複数データの読み込みに対応してない。

また近いうちになんとかして改良していきたいと思います。

ref)https://qiita.com/tobira-code/items/43a23362f356198adce2


Daisuke Sasaki
May 24, 2018

とても興味深い記事ですね!地形や道路の情報を取得するのはElkなどがありますが、国内ソース(国土地理院データ)のものを変換できるのは、あると便利だと思います。
あと、もしかしたら緯度経度情報の変換が逆?で縦横比が変になっているかもしれないです。

Yoshimasa Matsumoto
May 24, 2018

>Daisuke Sasaki様
コメントありがとうございます。やはりOSMですと精度の限界がありますし、5mメッシュの地形データはモデリング以上に分析などにも使えそうなので、モデル化できるのは非常に良いのではないかと思いました。
緯度経度に関しまして、ご指摘頂いたことを確認してみます。ご指摘ありがとうございました。

コメントをするにはログインしてください。

17595 0
Tags
License
cc_by_sa
GNU GPL

CONTACT ©2025 NIKKEN SEKKEI LTD.