🗺️

ここはどこ -flutter_echarts その4

2024/10/19に公開

太平洋を真ん中に

世界地図の海岸線だけを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
https://apps.apple.com/jp/app/chronomap-in-cosmos/id6642644551

四次元年表
https://app.laporte.academy/

三次元・四次元表示
https://tempo-spaco.web.app
四次元年表の使い方
https://www.youtube.com/@laporte_academy

四次元年表for Mobile
https://apps.apple.com/jp/app/四次元年表for-mobile/id6502634868

https://play.google.com/store/apps/details?id=academy.laporte.chronomapMobile.chronomap_mobile&hl=ja

Flutter大学

Discussion