古事連記帖

趣味のこと、技術的なこと、適当につらつら書きます。

地物ポリゴンデータで罠を踏んでた

逆ジオコーディング、ザックリ言うと緯度経度といった座標から住所を割り出す仕組みの第三弾みたいなノリです。少し間が空いてしまいましたが…
ayano.hateblo.jp
ayano.hateblo.jp

先日、F1日本グランプリを観に行くのにあわせて、高速道路の地形データを名古屋高速道路や東名阪・新名神の亀山のあたりまで作りまして、いざ現地で試していたところ、なかなか道路の情報が出てきませんでした。
自前のアプリでは、逆ジオコーディングを要求したときの位置情報をログとして記録するようにしていましたが、ちゃんとポリゴンの上で要求していたので何が悪かったのかがわからず、結局満足できないまま帰宅してきた訳ですが…

暗い色の点がアプリ上の位置情報。結構精度高く点が上に乗っています。写真は国土地理院地図の航空写真です。

いろいろ調べていく中で、MySQLの公式ドキュメントにこういう記述がありました。
dev.mysql.com

MultiPolygon にカットライン、突起、亀裂を含めることはできません。 MultiPolygon は通常の閉じた点集合です。

意味がちょっとわかりにくいですが、なんとなく心当たりがありました。地物の数を減らしたくて、作ったあと連続するものはできるだけ結合してひとつになるようにしていってましたが、このとき、ポリゴンの中に穴を作っていたのです。

①は単に道路をトレースしたときとか。②は例えば上下線が分離してるときとか。③は環状線とか。写真は国土地理院地図の航空写真です。

上記の②や③のパターンは通常作るのは難しいですが、結合したりすると作れたりします。

この状態でもQGISはgeojsonをエクスポートすることができます。

gist.github.com

これをクエリにして流し込んで、どう保持されるかというと…

MariaDB [expwy]> select gid,ST_AsText(geom) from ExpressWay;
+-----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| gid | ST_AsText(geom)
                                                                                          |
+-----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|   1 | MULTIPOLYGON(((139.97049799654377 35.43106573056407,139.98135690556836 35.43105054327872,139.981341718283 35.430716423001044,139.97052837111448 35.43082273399849,139.97049799654377 35.43106573056407))) |
|   2 | NULL
                                                                                          |
|   3 | NULL
                                                                                          |
+-----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.002 sec)

といった感じで、②と③が NULL になってしまいました。ポリゴンは穴あきにならないように作る必要があるということです。
頑張って結合していったポリゴンたちを分割する作業に追われてしまいましたが、早めに気がつけてよかったです…。現地に行く前にある程度テストしておけばよかったのですがw