プログラミング

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 を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

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

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

no image

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

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

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

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

no image

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

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

YouTube Data APIをGoogle Apps Script(GAS)から使おう

YouTubeってAPIから色々な情報を取ることができるんですよ。 APIの情報はリファレンスにまとまってるんですが、APIキーだのOAuth2.0だの、使い始めるまでがまぁまぁ面倒なんですね。 で、 …