国土数値地理情報から白地図を作る。6


今までの手順で作成した白地図は県の輪郭線が途切れていました。そこで輪郭線が途切れない様に処理を変更しました。市区町村の重なりを求め削除し、そこから都道府県の輪郭線を作るという流れは同じですが、市区町村の重なりを作った時に内側に一つ座標を短くしています。それにより都道府県の輪郭が切れずに求まります。

プログラムの全文は次の通りです。下に部分ごとの解説を書いてあります。いままでのプログラムはfunctionを使わずに書いてて見通しがわるかったので機能ごとにfunctionにまとめてあります。

makePrefBoundNoJoint.php

XMLはGISのサイトからダウンロードしたXMLを読み込むようにしてあります。ここらへんは国土数値情報から白地図を作る1をみてください。

メインの処理は次の通りです。forループで47都道府県を順番に処理しています。

47都道府県のどの都道府県を処理するのかはstartとendを指定して処理することもできます。

全都道府県を処理する場合には1〜47になります。

最初にXMLを読み込みます。読み込んだ結果は配列$coordinateに入ります。この配列は2次元配列です。最初の添え字で市区町村または島などの海岸線の番号。2番目の添え字で座標のデータが入っています。
読み込んだデータを描画すると次のようになります。下図は新潟県の場合です。図はIllustratorのアウトライン表示です。佐渡が消えてしまってますがIllustratorの図形の限界を超えてしまっているので描画されていません。データとしては存在します。Illusratorは一つのオブジェクトのポイントが3万を越えると表示ができなくなるようです。佐渡島の周囲にある岩などで佐渡形がかろうじてわかります。

データの読み込み後の最初の処理は、後の処理で使うために座標データと座標データの距離を求めておきます。この値は都道府県によってかなりバラツキがあるので各都道府県で求めて後の処理で使います。最大値と平均値を求めます。求めた値は$maxと$aveに入れます。

次にこの配列から市区町村の境界線を求める処理を行います。この処理が一番時間がかかります。

県の中の市区町村の境界線だけを求めます。計算結果は配列$cityBorderに入ります。functionの中の処理は全ての市区町村の境界線が重なるかどうかarray_intersectを使いチェックします。重なっていた場合に重なったデータを返す様にしています。この配列も2次元配列です。最初の添え字で図形の番号。この番号でひとつなぎの境界線のデータになります。2番目の添え字で座標のデータが入っています。新潟県の場合はcityBorderを描画すると次のような画像になります。

重なりから境界線を作成しています。データの開始点と終了点を考慮していないので所々直線でつないでしまっているところがあります。そこで、直線を削除する処理を行います。それが

です。ここで先ほど求めた$maxを使っています。$max以上離れた点はありえない部分なのでその部分で図形を分けています。処理した結果は次図のようになります。

次に元のデータから市区町村の境界線を引くと県境が求まりますが、そのまま引くと県境に穴が開いてしまいます。そこで市区町村の境界線のデータの始点と終点の点データを削除します。それが次の処理です。本当は県境と接する側だけを処理したいのですが、その判断が面倒なので両端を短くする処理をしています。

次に配列に余計な空白などのデータが入っていると後の処理でトラブルを起こすので削除しておきます。その処理が

です。(これはいらないかも?)

次に$cityBorderを$coordinateのデータから引き算します。

結果は次の通りです。

市区町村の境界線を削除した影響と境界線の始点と終点の関係で直線や点データが残っています。それらを解決するために次の処理を行います。

結果こうなります。

佐渡が消えてますが先に説明した理由です。スクリーンショットを撮るのにIllustratorを使っているので図形がIllusratorの限界を超えてしまってるためです。

どこまで細かい部分まで入っているかというと新潟の東港部分を拡大してみます。

Google Mapでみると
https://www.google.co.jp/maps/@37.9922353,139.2383178,7064m/data=!3m1!1e3
といった感じになります。

47都道府県を連続で処理するとかなり時間がかかりますが、MacBook Pro (Core i5 2.9GHz)で実行した場合、次の結果になりました。合計で4時間ぐらいです。

そしてこちらの記事で紹介した
plotXML2JapanPrefBound.php
を使い一枚の日本地図(都道府県の境界線入り)に仕上げます。前の記事と今回でXMLのタグの名前が違ってたのでそこだけ修正が必要です。一応全文載せます。
plotXML2JapanPrefBound.php

これで出来上がった日本地図がこちら。

277MBあるSVGになっています。上記の画像はそのスクリーンショットChromeで開いています。他のアプリでは開けませんでした。

ここから県の輪郭線を閉じた線にして、県と県の接するところに不都合が起きない様にデータ数を減らすと目的のデータが完成します。それはまた後ほど。