Leafletで世界地図 Natural Earth

MAP(地図)

 世界全図のシェープファイルは、
 Natural Earth(www.naturalearthdata.com/
からダウンロードして利用する。

 地球地図日本同様、いろんなデータがある。
 そのうちDownloads - Large scale data,1:10m - Cultural
 Admin 0-Countriesからne_10m_admin_0_countries.zipファイルをダウンロード。
 1:10mは1000万分の1。

 シェープファイル(ne_10m_admin_0_countries.shp) ⇒ GeoJSONファイル ⇒ TopoJSONファイル

 Leafletで描くと……。

 地物データ(国土のポリゴン)が経度180°をまたいでいる場合、起こりうる。
 ロシアとフィジーが、アメリカ大陸を横断して線が引かれている。

 やるべきことは、ロシアとフィジーの経度-180°< <0°の地域を360°プラスして経度180°< <360°扱いに変換する。

 問題はどうやるか。

 QGISだとPostGISデータベース(PostgreSQLの後継)を使って、ST_ShiftLongitude()で変換する、という説明が見つかったが……。
 理解不十分。

 やるべきことは分かる。

 シェープファイルではなく、GeoJSONファイルからフィジーとロシアのポリゴン・データを抜き出して、CSVファイルに変換して……。

 期待どおりのGeoJSONファイルに戻らなかった。やりようはあるが面倒。特にロシア。

 やるべきことは分かるのだが……。

 Node.jsが使えるならば、turf-shift-longitudejsonfileをインストールして、

npm install turf-shift-longitude
npm install jsonfile

 以下の○○○.jsファイル(ファイル名は任意)を作って保存した後、

var shift = require('turf-shift-longitude');

var multiPolygon = {"type": "MultiPolygon", "coordinates": [ [ [ [ -180.0, -16.169613739999932 ], [ -180.0, -16.149111041999959 ], [ -179.98753821499992, -16.138116143999923 ], ……(省略)……, [ -179.1494848299999, -17.282159112999921 ], [ -179.1572973299999, -17.27271900799991 ] ] ] ] } ;
var shifted = shift(multiPolygon);

var jsonfile = require('jsonfile');
jsonfile.writeFile("output.json", shifted) ;

 コマンドプロンプトから

node ○○○.js

と入力するとフィジーのマルチポリゴンが変換されてoutput.jsonが作られる。

{"type": "MultiPolygon", "coordinates": [ [ [ [180,-16.16961373999993],[180,-16.14911104199996],[180.01246178500008,-16.138116143999923],……(省略)……, [180.8505151700001,-17.28215911299992],[180.8427026700001,-17.27271900799991] ] ] ] } ;

 抜き出したフィジーのポリゴン・データを置換すれば、完了。

 次はロシア……。

 幸いフィジーを変えただけで、フィジーのみならずロシアのアメリカ大陸横断線も消えた。めでたし。

 ついでに巨大な南極のポリゴン・データを消去。

 ちょっと簡素化しすぎたかも。

 つづく

スポンサーリンク
ふシゼン
タイトルとURLをコピーしました