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



前の記事では市区町村(行政区域)の境界線を全て描画していました。そのままでは使いにくいので市区町村の境界線は消去して県の輪郭だけを描画するようにします。データにはすべての市区町村の境界線が入っています。そこですべてのデータについて重なったデータを消去します。

1 境界線のデータを消す

市区町村のデータと海岸線(県境)のデータの区別は次の様な仕組みになります。

上図は北海道の松前町、福島町、知内町、上ノ国町付近の地図です。欲しいデータは青い部分、海外線の部分。消したいデータは赤い部分で町と町の境界線になります。市区町村のデータを比較していき同じ座標のデータあればそれは境界線ということで削除するデータになります。すべてのデータを比較してデータを消せばよいので次のような処理をすることになります。

上記のコードではすべての行政区域を順番に調べています。そして座標データをすべて順番に調べ重なった(同一)の物があれば空欄にしています。この後に空欄のデータを削除して、といった処理を行います。この方法でも良いのですが非常に時間がかかります。明らかに重なっていないデータについてもチェックをするので無駄な処理が多数あります。そこで配列をまとめて処理をする方法を使います。配列に重なった部分があれば(同一の座標データがあれば)削除する処理を行い、なければ何もしない。という処理になります。

$fig1と$fig2が比較をする行政区域(または島)の座標データが入っている配列の番号になります。この$fig1と$fig2を二重のループで回します。その中で
array_intersect
で同一のデータを配列$doublePointにいれています。この配列が空なら重なった部分が無い。配列に中身があるならその部分は重なった座標なので、元の配列 $coordinate[$fig1]と $coordinate[$fig2]からそのデータを
array_diff
を使って削除します。
array_intersectとarray_diffについては以下のページに詳細があります。
array array_intersect ( array $array1 , array $array2 [, array $... ] )
array array_diff ( array $array1 , array $array2 [, array $... ] )

配列を削除した後には空の部分ができています。それをarray_valuesを使い隙間を埋めておきます。
array array_values ( array $array )

2. 余計な線を削除する

このままで描画すると市区町村の境界線の残りが直線として残っていしまいます。

完全に重ならない部分、線の始点、終点部分、そこいらへんが残ってしまいます。とにかく邪魔なものは消してしまいたいという事で座標データの個数が少ないデータは削除してしまいます。

上のコードでは10個以下の点は削除しています。小さい島(岩)とかも同時に消えてしまいます。逆にある程度以下の島(岩)を消したい場合には

とすると削除できます。これで余計な線が消えて次の様なものになります。

まだ残っている余計な線があります。これは市区町村の座標データの書きはじめが海岸線の区切りの良いところであれば良いのですが、そうなっていません。そこを切って直線でつなぐ部分がでてきるので上図のようになってしまいます。この線を消すために座標データを見て距離が離れている場合にはそのデータを削除するという処理を加えます。

$j番目の座標点と$j+1番目の距離を求めて距離が離れている場合には違う図形として新規に配列に入れています。距離はX座標とY座標の差を二乗して足しています。距離にするには最後にルートにいれる必要がありますが、厳密な距離を求める必要がないので、そのまま処理をしています。緯度によって実際の距離も変わるのでそこいらをちゃんと計算すると面倒なので適当に数値を決めています。

if文の1.0E-4というのがその適当に決めた距離になる部分です。
同時に1つの図形で点が30,000個以上の場合にも新規の図形として登録し直します。これはIllustratorで1つの図形が30,000個以上のアンカーポイントがあると表示されなくなるので、その対策のためです。

3.プログラム全文

以上のことでプログラムの全文は次のようになります。
plotPrefData2.php

完成したSVGをIllustratorで開くと次の様に表示されます。(アウトライン表示)

ベクターデータになっているので県毎に色をつけたりしたくなりますがそれは出来ません。塗りを付けるためには閉じた曲線にする必要がありますが、下図の様に途切れた線になっておりこれをつながないと塗りを入れることはできません。

SVGでpolylineではなくpolygonにして閉じた曲線にすれば良いのですが、このデータ量でそれをやってしまうとIllustratorで開く事のできないデータになってしまいます。データを間引くなどの処理が必要になってきます。それはまた後ほど。

これで都道府県の輪郭をXMLから取り出す事はできました。次に各県で同様の処理をして日本地図を作成します。