• ABOUT
  • SITE POLICY
  • AGREEMENT
  • JP
  • SIGN IN:
  • SIGN IN:
GH_Python 国土地理院にある標高5mメッシュのxmlデータを直接読み込むNo.1
by Yoshimasa Matsumoto May 22, 2018

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

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

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

  1. import sys
  2. import re

  3.  
  4. import Rhino

  5. import scriptcontext

  6. # for accesssing GH classes

  7. import clr

  8. clr.AddReference("Grasshopper")

  9. from Grasshopper.Kernel.Data import GH_Path

  10. from Grasshopper import DataTree

  11.  
  12. tree = DataTree[object]()

  13.  
  14. def TranslateDem(filename):

  15. with open(filename, "r") as f:

  16. #mesh

  17. r = re.compile("

    <span class="str">&lt;mesh&gt;</span>(.+)<span class="str">&lt;/mesh&gt;</span>")
  18. for ln in f:
  19. m = r.search(ln)
  20. if m != None:
  21. mesh = m.group(1)
  22. break

  23.  
  24. # grid len

  25. r = re.compile("

    <span class="str">&lt;gml:high&gt;</span>(.+) (.+)<span class="str">&lt;/gml:high&gt;</span>")
  26. for ln in f:
  27. m = r.search(ln)
  28. if m != None:
  29. xlen = int(m.group(1)) + 1
  30. ylen = int(m.group(2)) + 1
  31. break

  32.  
  33. # start

  34. r = re.compile("

    <span class="str">&lt;gml:tupleList&gt;</span>")
  35. for ln in f:
  36. m = r.search(ln)
  37. if m != None:
  38. break

  39.  
  40. # data

  41. data = []

  42. r = re.compile("

    <span class="str">&lt;/gml:tupleList&gt;</span>")
  43. r2 = re.compile(",(.+)")
  44. for ln in f:
  45. m = r.search(ln)
  46. if m != None:
  47. break
  48. else:
  49. m = r2.search(ln)
  50. if m != None:
  51. data.append(float(m.group(1)))

  52.  
  53. # start point

  54. startx = starty = 0

  55. r = re.compile("

    <span class="str">&lt;gml:startPoint&gt;</span>(.+) (.+)<span class="str">&lt;/gml:startPoint&gt;</span>")
  56. for ln in f:
  57. m = r.search(ln)
  58. if m != None:
  59. startx = int(m.group(1))
  60. starty = int(m.group(2))
  61. break

  62.  
  63. ##Create Matrix

  64. data2 = [i for i in range(xlen*ylen)]

  65. start_pos = starty*xlen + startx

  66. for i in range(xlen*ylen):

  67. if i < start_pos:

  68. data2[i] = -9999.

  69. else:

  70. data2[i] = data[i-start_pos]

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

  73.  
  74. return data

  75.  
  76. def nestedListToDataTree(nestedlist):

  77. dataTree = DataTree[object]()

  78. for i, item_list in enumerate(nestedlist):

  79. path = GH_Path(i)

  80. dataTree.AddRange(item_list,path)

  81. return dataTree

  82.  
  83. data = TranslateDem(file)

  84. 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メッシュの地形データはモデリング以上に分析などにも使えそうなので、モデル化できるのは非常に良いのではないかと思いました。
緯度経度に関しまして、ご指摘頂いたことを確認してみます。ご指摘ありがとうございました。

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

18138 0
Tags
License
cc_by_sa
GNU GPL

CONTACT ©2025 NIKKEN SEKKEI LTD.