世界全図のシェープファイルは、
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-longitudeとjsonfileをインストールして、
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] ] ] ] } ;
抜き出したフィジーのポリゴン・データを置換すれば、完了。
次はロシア……。
幸いフィジーを変えただけで、フィジーのみならずロシアのアメリカ大陸横断線も消えた。めでたし。
ついでに巨大な南極のポリゴン・データを消去。
ちょっと簡素化しすぎたかも。
つづく。