自由研究

GeoJSONで市町村境界をマージして都道府県境界にしたい(実践編)

投稿日:


前々回前回で問題を整理して、ようやく実践編です。

まず実物のリンク貼りましょう。GitHubに上げました

今回はGo言語で書いてますが、ポイントがいくつかあります。
ちなみに言語としてGoを選択したのは、なんとなくソコソコ早そうだからです。
実際、うちの環境で日本全国を統合して1つにする処理が3分ぐらいで終わります。容量的には600MB -> 350MBぐらいになりますが、まぁまぁ頑張ってるんじゃないでしょうか。

じゃあポイントについて説明していきます。

苦労ポイント

国土数値情報、右手系じゃない。

色々触ってから分かったんですが、国土数値情報のデータ右手系じゃないです
じゃあ左手系か、っていうとそうでもなくて、つまり環の周り順が統一されていない
どうもGeoJSONのPolygonが右手系だと正式に定義されたのがRFC 7946らしく、これが発表されたのが2016年と最近なので、古いツールが吐くGeoJSONはRFC7946に沿ってないようなんですね。

まずはココを統一しないことには、マージした際に外側の境界になるのか穴になるのか分からない。というかそもそもGeoJSONとして仕様外とみなされてしまう。
というわけでデータを右手系に統一するツールから作る必要がありました。

Featureのマージ

これまで机上で考えていたものを実装に落とし込むにあたり、色々と細かい考慮が必要でした。
特にFeatureのマージを管理するために、元のどのFeatureがどのFeatureへとマージされるかを保持する辞書が必要になりました。

閉路の始点を探したい

エッジの集合が整理できたあと、そこから閉路を作成しなければいけません。
そのためには「まずどの辺を取るか」を管理しないといけない…と思ったんですが、正直始点なんかどこだっていいので、

  1. エッジの辞書をfor文で全要素回すフリをする
  2. 1つめの要素を取ったらすぐbreak

という手法で始点を抽出しました。
ちなみにGo言語は辞書をfor文で読むと、ランダムな順序で帰ってくるらしいです。そのせいで、実行するたびに結果が変わります。

外側の環と穴の区別をつけにくい

閉路を作っている段階では、いま作っている閉路が穴になるかどうか分からない。
さらに上記の方法のせいで、最初に作る閉路が外側の環とは限らないので、「とりあえず閉路を全部並べてから、あとで外側の環と穴の区別を付けて再度整理する」という手間を取りました。
上手くやればもっと上手くできる気がします。

成果

というわけでいろいろ苦労の末、モノができました。GitHubに上げてあるので好きに使ってください。

たとえば以前作ったUnityのコードに食わせればUnity上で表示できます。

たとえばGeoJSONLintっていうサイトに食わせれば地図に合わせて表示できます。
ちなみにこのサイト、当然Lintしてくれるんですが、crsフィールドの書式が古いって言われて怒られます。がんばれ国土数値情報。

ズームするとキチンと海岸線沿いに沿っているのが分かります。国のデータが元になってるので当然なんですが。

おわり

というわけでGeoJSONをマージする連載も、一定の成果が出せたので一旦おしまいにしたいです。
ただ、いまの出力では粒度が細かすぎてデータがすごい容量になるので、適度に数値を丸めてデータ量を抑えたりしたほうが良さそうだな、とか、色々と改良は思い浮かぶので、そのうちバージョンアップしたいですね。

-自由研究

執筆者:


  1. […] というところでそろそろ長くなってきたので実践編へ続きます。 […]

comment

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

MagicaVoxelでUnity用の人間モデルを作ろう(東北ずん子配布もあるよ)

もくじ1 概要1.1 目標1.2 手順1.3 作成モデル2 MagicaVoxel2.1 パーツ分割2.2 出力3 Blender3.1 インポート3.2 モデルの初期調整3.2.1 重複する頂点の削 …

【Unity】GPUを使ってパンツを隠すスクリプトができた

かわいいスカートを履きたい!でもパンチラしたくない! それは誰もが抱く夢です。もちろん、3Dモデルだってパンチラしたくないと思っているハズです。 というわけで偉大なる先人がいます。 Unityでパンツ …

no image

DCEXPO2017に行ってきました

10/27~29にかけて、お台場の日本科学未来館で開催されたデジタルコンテンツエキスポ2017を見に行ってきました。 どれも見ごたえのある展示ばかりで、非常に面白かったのでいくつか紹介したいと思います …

GeoJSONで市町村境界をマージして都道府県境界にしたい(その1)

前回の続きで、国土地理院の「国土数値情報」っていうオープンデータで遊んでいます。独立した記事なので前回のは読まなくても良いです。 やりたいこと 国土数値情報で提供されている「行政区域データ」は、市町村 …

no image

C言語のポインタに関する補足説明

前回、C言語のポインタに関する解説記事を書きまして、そこそこの反響を貰うとともにいくつかの指摘を受けました。 前回の記事では幾つか「ウソではないけど真実と違う」記述がありまして、その点を補足としていく …