プログラミング

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

投稿日:2019年10月14日 更新日:


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

まず実物のリンク貼りましょう。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をマージする連載も、一定の成果が出せたので一旦おしまいにしたいです。
ただ、いまの出力では粒度が細かすぎてデータがすごい容量になるので、適度に数値を丸めてデータ量を抑えたりしたほうが良さそうだな、とか、色々と改良は思い浮かぶので、そのうちバージョンアップしたいですね。

-プログラミング

執筆者:

関連記事

no image

Google Apps Script (GAS)でBlueskyのbotを作る

Blueskyで何かやりたくなったので、PRTimesのプレスリリースを自動投稿するbotを作ってみました。 Google Apps Scriptを使うと、無料でbotが作れるので便利です。 せっかく …

no image

Google Apps Script(GAS)で自宅サーバーの死活監視をする

前置き 自宅サーバー使ってますか? 最近もう流行らないかな、と思ったらRaspberry Piの流行で機器も電気代も安価に組めるようになったりして、地味に持っている人も多いんじゃないかな、と思ってます …

no image

UnityのCompute Shaderに線分と三角形の衝突判定をさせる

はじめてCompute Shader使ってみた。でもあまり性能は出ないのでただの失敗の記録です。 まず元のアルゴリズムはコレ。 線分と三角形の当たり判定 – 富士見研究所 で、これをまず三角形の表裏問 …

SHOWROOMのガチイベをGoogleスプレッドシートでグラフにしよう

まえがき SHOWROOMのガチイベ、と言えば配信者が獲得ポイント数でランキングされ、最終的にファンの札束で殴り合って勝者を競う札束タワーバトルなわけです。 数日~数週間にわたって配信者同士でランキン …

no image

ランダムな日本人データを生成するツールをつくった

前置き ダミーの名簿データが作りたい、という需要は稀にあるものです。 住所とか、年齢とか、職業とか、いい感じにランダムなデータが欲しいことがありますよね。 しかし、適当にデータを作ってしまうと、「東京 …