MapKit

initialPositionとposition

AIの回答
initialPositionとpositionは、SwiftUIのMapビューでマップの表示位置を制御するためのプロパティですが、その役割とデータの扱いに大きな違いがあります。
initialPosition
マップが表示された際の最初のカメラ位置を設定します。データフローは一方向で、一度設定されるとユーザーがマップを操作しても値は更新されません。マップの初期表示位置を固定したい場合に適しています。
position
マップの現在のカメラ位置を双方向でバインドします。データフローは双方向で、ユーザー操作によるマップ位置の変更が@Stateプロパティに反映され、また@Stateプロパティの変更がマップのカメラ位置に反映されます。ユーザーの操作やプログラム上のイベントに基づいて、マップの位置を動的に追跡・変更したい場合に適しています。

※下の例ではカメラのズーム度合いの指定に2種類使っています。latitudinalMeterとlatitudeDelta

緯度経度の座標を入れる変数

extension の構造体で作る
CLLocationCoordinate2D() でオブジェクトして格納

Marker

ピン的なもの、タップで選択可能
Annotationより重いらしい(?
Grok曰くMarkerの方が簡易なので大量に置くのに適しているらしい、いずれ検証結果はなし

選択可能にする方法は MKMapItem クラスに格納して MapView の引数 selection に MKMapItem を指定する

Annotation

ピン的なもの、タップで選択不可
画像や図形などでカスタム可能

MapStyle

.mapStyle(.standard)

.mapStyle(.imagery(elevation: .realistic))

.mapStyle(.hybrid(elevation: .realistic))

シミュレーターのマップ操作は Option + マウスドラッグで回転ピンチアウト、イン。
Option + Shift + マウスドラッグでカメラの角度変更。

Map下部にボタンを配置する例

.onMapCameraChange

ユーザーがマップ操作を終えた時に呼び出される。

MKMapItem

🔍 基本構造

MKMapItem はクラスで、主に次のプロパティを持ちます:

主なプロパティ

  • placemark: MKPlacemark
    • その地点の「位置情報 + 住所」などの基本情報。
  • name: String?
    • 地点の名前(施設名など)。
  • phoneNumber: String?
    • 電話番号。
  • url: URL?
    • 関連ウェブサイト。
  • timeZone: TimeZone?
    • その地点に関連づけられるタイムゾーン。

特殊なもの

  • isCurrentLocation: Bool
    • 現在地を表す MKMapItem かどうか。

🔧 よく使う初期化

🚀 主なメソッド

  • openInMaps(launchOptions: [String : Any]? = nil)
    Apple純正の「マップ」アプリを開いて、その地点を表示できます。
    ルート案内やピンを立てる用途に便利です。

例:

👉 これで「東京駅まで徒歩案内」がマップアプリで開きます。

📍 検索との関係

MKLocalSearch を使うと、周辺の店舗や施設を検索できます。その結果として MKMapItem の配列が返ってきます。

📝 ポイント

  • MKMapItem 自体は「1地点を表す」クラスなので、1つのオブジェクトに複数を入れることはできません。
  • 代わりに 配列 [MKMapItem] を作って管理 します。
  • SwiftUI の Map では直接 MKMapItem を表示できないので、MKPlacemark の座標を取り出して Annotation に変換する流れになります。

✅ 例:複数 MKMapItem を表示する SwiftUI サンプル

🔑 ここでの流れ

  1. MKMapItem を複数作成(nameurlphoneNumber も設定可能)
  2. 配列 [MKMapItem] にまとめる
  3. Map の annotationItems に渡して Annotation に変換
  4. NavigationLink を仕込めば、タップで詳細画面へ

✅ まとめ

  • MKMapItem = 「地図上の地点を表すクラス」
  • MKPlacemark を持っていて、名前や電話番号などの付加情報を保持
  • マップアプリに飛ばす、ルート案内するなどでよく利用
  • MKLocalSearch の検索結果でも返ってくる

MKMapItem内を検索する

MKLocalSearch の検索結果 から得た MKMapItem は、検索で見つかった施設や場所の名前が mapItem.name に格納されています。
例えば:

👉 この場合、item.name に施設名(例: “Tokyo Station”)が、item.placemark には住所や詳細情報が入っています。
住所や細かい情報が欲しいときは mapItem.placemark を見ます。

ズームレベルを監視する

簡単な例

UIKit の MKMapView を使う(より細かい制御)

もし SwiftUI の Map よりも正確にコントロールしたい場合、UIViewRepresentable でラップする方法もあります👇

コメント

タイトルとURLをコピーしました