プログラミング

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

-プログラミング

執筆者:


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

comment

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

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

関連記事

no image

Unityでメッシュをさわるノウハウ

ヒマなので覚書。ウラを取っていない経験則なので話半分で読んでください。 あと、3Dの基本概念とUnity固有の話の区別が付いていないのでごめんなさい。 もくじ1 Meshクラスの基本2 ポリゴンの読み …

国土地理院の地図データをUnityで読みたい(願望)

なんかgoogleのAdSense通ったんで有益な情報載せないとなって。 国土地理院のオープンデータ 国土地理院が公開している(正確には国土地理院のデータを利用して国土交通省国土政策局国土情報課が公開 …

no image

[python]Windows環境でsubprocessするときは文字コードに気をつけて

pythonは内部の文字コードと実行環境の文字コードが色々絡み合っていて、いろんなところで悪さをする。 特にWindows環境だと、内部はUTF-8で動いているのに実行環境はShift-JIS(正確に …

no image

[C言語]スペースを大量に入れるとバグが直るコードを書いてみた

↓こういうツイートがバズっていたので、実際に組んでみた。 修士の頃、授業の課題でC言語書いてる時にどうしても謎のエラーが出て困っていた。それを見たSE経験(金融系)がある社会人大学院生の同期の女性が「 …

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

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