見出し画像

【SwiftUI】 MapKitでGeoJSONを扱う


UIKitの場合

UIKit での手順は下記記事に示した通り:

流れだけ再掲しておくと、

  1. `MKGeoJSONDecoder` でデコード

  2. `MKGeoJSONObject` のパース

  3. `MKGeoJSONFeature` の `properties` をデコード

  4. `MKGeoJSONFeature` の `geometry` を `MKPolyline` で描画

となる。

MapKit での GeoJSON の取り扱いについては下記のZenn記事(つまり全部読める)でも触れています:
iOSでインドアマップ(屋内の地図)を表示する

SwiftUIの場合

SwiftUIの場合はだいぶ実装方法が変わってくる。まずそもそも、ポリゴンやラインの描画方法が全然違う

UIKitの場合は

  1. `MKOverlay` を `addOverlay` する

  2. 描画時に呼ばれる `MKMapViewDelegate` のメソッドで `MKOverlayRenderer` を返す

という流れだったのが、@resultBuilder ベースで作られている @MapContentBuilder (iOS 17〜)とデータバインディングにより、次のようにシンプルに書ける:

Map() {
    MapPolygon(coordinates: CLLocationCoordinate2D.tokyoStationArea)
        .foregroundStyle(.blue)
}
Map() {
    MapPolyline(routePolyline)
        .stroke(.blue, lineWidth: 8)
}

で、このように変わったSwiftUI の Map に、GeoJSONで定義されているポリゴンやラインをどう描画するか。

ポイントは、2024年9月現在(ちょうどiOS 18が正式リリースされたばかり)、MKGeoJSONDecoder, MKGeoJSONFeature のSwiftUI版がまだない、ということ。

なので MKGeoJSONDecoder, MKGeoJSONFeature を使うしかないのだが、

for geometry in feature.geometry {
    guard let polyline = geometry as? MKPolyline else {
        ...
    }

    // SwiftUIの場合、ここからどうする?
}

ここから先は

958字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/