プログラミング

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

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

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

どうして私はC言語で仕事をしているのか

みなさんプログラミング言語は学んでますか?今から始めますか? 最初に学ぶべきプログラミング言語ってなんだと思いますか?そうです。C言語です。 C#でもC++でもObjective-Cでもなく、Pure …

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

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

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

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

no image

プログラミングとアルゴリズムのはなし

みんなー!小学校でプログラミングの授業がはじまるよー!! プログラミングってなんだろう? プログラミングって、コンピューターに「○○をしなさい」って命令して、なにかの問題を解いたり、ゲームをつくったり …