🗺️
ここはどこ -flutter_echarts その4
太平洋を真ん中に
世界地図の海岸線だけをjsonで描画する話を前回書いたのだけれど、
これは当然ながら北緯(南緯)0度、東経(西経)0度が原点になるので
大西洋中心の世界地図になる。
今回、私がつくっているアプリは『四次元年表』inMaritimeといって、
海事全般を扱うアプリ。
スペイン勢が大西洋を横断するとか、
ポルトガル勢が喜望峰を回ってインド洋に出るとか、
そういう話なら大西洋中心地図でいいのだけれど、
先史時代に、人類が太平洋の島々に筏やカヌーで拡散した、
みたいな話を表示しようとすると、太平洋が真ん中で切れている地図はいかにも扱いにくい。
ということで、データを読み替えて、太平洋を中心にしてみるよ。
足すのか、引くのか
まず全ての経度に205足してみた。
180じゃない理由は、180にすると、イギリスが真っ二つだし、アフリカもちぎれちゃう。
なのでカナリア諸島ぐらいまで繋がって表示されるように205にした。
つぎに、これで180超えちゃう数だけ選んで、360を引く。
codeにすると、こんな感じ。
double shiftLongitude(double longitude) {
// Shift the longitude by 205 degrees, and wrap it around using modulo 360
double shifted = longitude + 205.0;
if (shifted > 180.0) shifted -= 360.0;
return shifted;
}
この変換式で、DBから取ってきたデータを変換
Future<void> _loadData(maritimeCode) async {
await fetchWithMapRepository.fetchWithMap(keyNumbers: maritimeCode);
setState(() {
maritimeData = fetchWithMapRepository.listWithMap.map((withMap) => {
"value": [shiftLongitude(withMap.longitude), withMap.latitude, withMap.logarithm],
"name": withMap.affair,
}).toList();
});
}
海岸線データを変換
これがちょっとめんどうくさかった。
それはdoubleじゃないとか、intが何とかか、いろいろErrorが出て。
で、文句が出なくなるまで、くちゃくちゃ書き加えたので、なんかゴロゴロしている。
jsonももともとdoubleなんだし、美しくないなあ、って思うけど、動いたからいいか。
Future<void> _loadCoastLine() async {
final String jsonString = await rootBundle.loadString('assets/json/coastline.json');
final List<dynamic> jsonData = json.decode(jsonString);
setState(() {
coastLine = jsonData.map((coordinate) {
// Ensure that all values are converted to double
double longitude = shiftLongitude((coordinate[0] as num).toDouble());
double latitude = (coordinate[1] as num).toDouble();
return [longitude, latitude, 0.0]; <=最後の0は地図を描画するz軸の値。
}).toList();
});
}
できあがりはこちら
日本人はこっちが落ち着く笑
これが大西洋版
地球儀の描画は次回に
四次元年表 in Cosmos
四次元年表
三次元・四次元表示
四次元年表の使い方四次元年表for Mobile
Discussion