
-
MapKitのさらなる活用
MapKitとMapKit JSの最新アップデートをご確認ください。新しい経路のタイプである「サイクリング」と、3D Look Around画像をWebで有効にする方法について解説します。新しいGeocoding APIで座標/住所の変換をサポートする方法や、Address Representations APIで各地域に最適な住所を取得する方法を紹介します。最後に、アプリをApp Intentとシームレスに連携させるための新しい場所参照の方法にも触れます。
関連する章
- 0:00 - イントロダクション
- 0:45 - 場所の特定
- 9:34 - 場所の表示
- 14:14 - 移動のナビゲーション
リソース
関連ビデオ
WWDC24
WWDC23
WWDC22
-
このビデオを検索
こんにちは Alexです MapKitチームでエンジニアをしています Appleマップは道案内として利用でき デバイスから世界中の 様々な場所を探索できます 歴史的な建物から居心地の良いカフェ 地元のお店 魅力的なハイキングコースまで 様々なものを発見できます ここでは アプリやWebサイトに マップ機能を取り入れる MapKitとMapKit JSの 最新情報を説明します まず 場所を見つけて参照する新しい方法の PlaceDescriptorから始めます 次に ジオコーディングとそれを 使用して場所に関する情報を 表示する方法について説明します 最後に Directions APIと Look Around APIを使って ユーザーを目的地に導く方法を説明します では 場所を見つけて参照する 方法から始めましょう 昨年 Appleは MapKitフレームワークの マップアイテムや MapKit JSのPlaceによって表された 場所を参照できる 識別子を導入しました この参照は一意であり 長期にわたって有効です MapsチームがWebサイトのURLなど 場所のデータを更新するたびに 場所IDを使用しているアプリに その最新情報を表示できます これらの識別子は一意なので それぞれのデータ構造で 場所IDをキーとして使用できます 識別子は永続化と共有が可能です Appleではこのデータを追跡しているので アプリでいつでも参照できます MapKitで見つけた特定の場所への参照を 永続化する場合 場所IDは 依然として最良の選択です しかし それが最適ではない場合もあります 識別子がない場合でも 特定の場所に関する MapKitの豊富なデータを 見つけたい場合があります 例えば すべての事業所の名前と住所を 提供するWeb APIやCRMがある場合や 特定の場所の名前と 座標がある場合がそうです このような場合 1つの場所を 正確に見つける必要があります そのため 複数の結果を返す ローカル検索のようなAPIは 最適ではありません また 自分のものではない コードとの間で場所の参照を やり取りしたい場合もあります フレームワークから 土地を販売するなどです または App Intentを使用している場合 Intentのパラメータとして場所を取得し Intentの結果として場所を返したり 場所をApp Entityのプロパティ として含めたりすることがあります このような場合 MapKitをまったく 使用していない他のアプリとの やり取りも考えられます CLLocationのような純粋に地理的な 表現を渡すことができますが MapKit識別子を使用する場合と違い 興味のある場所の詳細情報を 見つける適切な方法はありません これらの場合に対処できるよう新たに PlaceDescriptorを導入します これは新しいフレームワーク GeoToolboxに含まれています PlaceDescriptorにより 構造化された方法で 場所を記述する情報を提供できます
MapKitまたは他のマッピング サービスプロバイダで PlaceDescriptorを使用すると その場所に関する詳細なデータを 探すことができます PlaceDescriptorには3つの 上位レベルの情報があります 1つ目はcommonNameという文字列です PlaceDescriptorを使用する場合 Guggenheim Museumや Sydney Opera Houseなどの よく知られた名前を指定してください この項目は「母の家」のような プライベートなデータ用ではなく 含めてもMapKitで 場所を見つける役には立ちません
PlaceDescriptorには表現の配列もあります これらの表現は 地理的情報を扱うアプリや フレームワークが理解できる 一般的な形式です PlaceRepresentationsには 3つの選択肢があります 1つ目は 封筒に記載する ような住所の文字列です なるべく詳細な住所を提供すると MapKitでその場所が見つかる 可能性が高まります 次は 既知の歴史的建造物や事業所など 固定された明確な場所にある座標です 最後は CLLocationを使用する deviceLocationです これは 受信したGPSデータ での使用に適していて 精度 タイムスタンプ 進行方向 速度など 追加の値を使用することもできます 表現の配列には少なくとも1つの表現が 含まれていて 先に現れたものから順に 並んでいる必要があります 例えば 連絡先アプリで使用する PlaceDescriptorの場合 座標は その場所の住所から 得られている可能性があります その場合 住所が元の情報であるため 住所が先頭に来て 座標が次に来ます 最後に PlaceDescriptorには サポート表現の配列があります これらの表現は アプリによって使用できず 必須ではありません supportingRepresentations配列は 空にできます supportingRepresentationsでできることは 後で詳しく説明します PlaceDescriptorと 今後登場するAPIについて 説明するために サンプルアプリを使います これは 噴水好きが世界中の遠く離れた 場所にある噴水を見つけるためのものです 最初に 魅力的な訪問地である ダブリンの噴水を集め それらをマップ上に配置しましょう
SwiftUIのMapKitが登場してから 座標を使ってマップ上に簡単な マーカーを作れますが ここでは 場所IDがないものの 噴水に関する充実したAppleマップデータを アプリの他のすべてのMapKit APIと 組み合わせて活用します これはPlaceDescriptorを 使用する絶好の機会です この噴水を参照する PlaceDescriptorを作ります まず GeoToolboxをインポートします この座標に噴水がある ことがわかっているので PlaceDescriptorを作成するとき それを使用して座標表現を指定します 最後に 噴水の名前 Anna Livia Fountainが既知なので その名前を指定します これだけで有効な PlaceDescriptorを作成できます さらにMapKitをインポートし マップアイテム要求を 私のPlaceDescriptorを使用して 作成します 要求を準備できたら それを実行して その場所の MKMapItemを取得できます MapItemはMapKitの場所に 関するコアタイプであり 様々な種類のAPIで使用できます
例えば マップ上でMapItemを使用できます マーカーには この場所の名前や色 Appleマップ用のアイコンが 表示されることがわかります
マップに2番目の場所を追加しましょう 今回は住所を使用して記述子を作成します この噴水のできるだけ詳細な 住所を指定する必要があります 次に その住所と噴水の名前を使用して PlaceDescriptorを作れます 前と同じようにMKMapItemRequestを使用し それを他の噴水と一緒にマップに追加します とても簡単です PlaceDescriptorの 名前 座標 住所の PlaceRepresentationsを使用して 場所を見つけることが できることを示しました PlaceDescriptorのもう1つの 最上位プロパティを使用できます サポート表現には サービス識別子 という1つの種類があります サービス識別子の表現は辞書であり キーは特定のマッピング サービスのバンドル識別子で 値は そのマッピングサービスでの 場所を表す識別子です
例えば ある場所のMapKit 場所IDがわかっている場合 キーがcom.apple.mapKitで 値がその識別子である 辞書を作成できます さらに serviceIdentifiers表現を作成し PlaceDescriptorイニシャライザの supportingRepresentationsに渡します 別のマッピングサービスプロバイダが 提供する場所の識別子がわかる場合は それをここで指定できます MapKitは他の識別子を使用しませんが 指定すると MapKitを使用しない別のアプリに PlaceDescriptorを提供できる App Intentなどの シナリオで役立ちます 識別子は必要に応じて いくつでも指定できます MapKit APIを使用する場合 サービス識別子を使用するのが適切です PlaceDescriptorのMapKit識別子が 存在する場合 MKMapItemRequestは それらを使用して場所を取得します MapKit識別子がない場合や 指定された識別子の使用に 何らかの理由で失敗した場合 PlaceDescriptorの他の表現を 使用して場所を見つけます 同様に 別の方法で得られたMapItemを 使用してPlaceDescriptorを作成する場合 PlaceDescriptorに 識別子を含む 必要なすべての表現が 設定されていることを確認します PlaceDescriptorと MKMapItemRequestを使用して 私の知っているダブリンの 残りの噴水をアプリに追加します PlaceDescriptorを指定して要求した MapItemを様々なMapKit APIで使用すると 識別子やMKLocalSearchを使用して 取得したものと同様の詳細な マップデータを表示できます
例として場所カードを考えます PlaceDescriptorで要求した場所の 場所カードを提示する場合 営業時間などの詳細な最新データや Appleへのリンクを表示できます たった1行のコードで ユーザーがアプリ内で 噴水を選択したとき 場所カードを提示できます 場所カードは 場所に関する 種々の有用な情報を 表示する簡単な方法です 詳細についてはWWDC2024の 「Unlock the power of places with MapKit」を ご確認ください
場所カードと言えば 今年の MapKit JSの場所カードでは Appleマップへのユニバーサル リンクも提供されます マップアプリがインストールされている デバイスではリンクからマップが開きます また マップアプリがないデバイスでは 場所カードは maps.apple.comにリンクします 昨年の夏にパブリックベータ版を 公開しています これで アプリやWebサイトが Appleマップにリンクされている場合 Appleプラットフォーム以外でもWeb上の マップを使用してさらに探索できます iOS 18.4のロールアウトに伴い マップでのURLの処理が更新されており このようなユニバーサルリンクを 自信を持って作成できます 例えば このURLでは検索を実行します パラメータの一貫性 シンプルさ 読みやすさが向上しました
また多数のパラメータを 追加しており マップ内で より多くの機能にリンクできます 「統一されたマップのURLを 導入する(英語)」を確認してください このビデオの資料にリンクされています ユニバーサルなマップのリンクを アプリで使用できます
場所が見つかりました 次にジオコーディングと 住所表現を使用して アプリ内で場所の詳細な情報を 表示する方法を説明します
説明すると 正ジオコーディングとは 住所を取得して それが参照する 座標を見つけるプロセスです この一例は 連絡先アプリで 住所をタップしたときに マップに移動するものです
逆ジオコーディングはその逆です 座標が提供されると住所を返します この一例は マップアプリに ピンをドロップする場合で その場所の住所情報が表示されます
iOS 18以前は CoreLocationを使用して ジオコーディングタスクを実行していました 今年はCLGeocoderを非推奨とし CLPlacemarkをソフトな非推奨として ジオコーディングをMapKitに導入しました
私のアプリでは 自分で見つけて 見事な写真を撮った噴水を 追跡できるようにしたいと思います これらの写真には ジオタグ つまり 撮影された場所を示す 座標はありますが 名前などのサポート情報がありません そのためPlaceDescriptorでは 場所の詳細がわかりません あるのは座標だけです そこで MapKitで逆ジオコーディングを 使用して 写真の横に表示する コンテキストを見つけます
最初の噴水の写真を 逆ジオコーディングしてみましょう
写真を撮影した座標から始めます 次にその場所を使用して MKReverseGeocodingRequestを 作成します すでに説明した PlaceDescriptorを使用する MKMapItemRequestとは異なり MKReverseGeocodingRequestsの イニシャライザはオプショナル型を返します CLLocationに無効な座標を指定した場合 MapKitは要求を実行できません 要求が結果を返すと マップアイテムの配列が得られます 大部分のジオコーディング要求では この配列のエントリは1つなので 最初のものを選択します なお このマップアイテムは Geocoding APIから得られたので 関心のある場所の詳細な 情報は含まれません このmapItemには 住所の地点に 関する情報のみが含まれています これでマップアイテムが得られたので 住所を表示できます
MKReverseGeocoding要求を使用して 残りの写真の住所を取得し それらをリスト表示します 私のアプリは良くなっていますが この画面では完全な住所は 詳しすぎる可能性があります そこで他の選択肢を確認してみます MKMapItemには 住所情報にアクセスする ためのオプションプロパティが2つあります
1つ目はMKAddressです 独自のMKMapItemを作成するときに 独自のMKAddressをインスタンス化できます また MapKitでは ジオコーディング ローカル検索 PlaceDescriptorの解決 などのAPIからMapItemを返す際にも MKAddressを提供します 2つ目は イニシャライザを持たない MKAddressRepresentationsです 住所表現はMapKit APIから 返されたマップアイテムでのみ 使用できます
まず MKAddressについて説明します これにはfullAddressとshortAddressの 2つの文字列プロパティがあります
FullAddressは 最も詳細な 郵便用または行政上の住所です 一方 shortAddressは住所の 最も重要な部分のみを提供します
場合によっては 提供する住所が 非常に簡潔なことがあります 例えば 海の真ん中の座標の逆ジオコードは わずか1行になる可能性があります
独自のMapItemをインスタンス化する場合 住所プロパティがMapKitの 場所カードで使用され 独自の住所情報を表示できます
MKAddressは住所のシンプル バージョンを提供しますが MKAddressRepresentationsは アプリ内で 住所情報を表示する強力な方法を 数多く提供します 例えば 詳細な住所の一覧を表示する場合 すべて同じ国の住所だと わかっていれば アプリUIで地域を省略できます それには fullAddressの includingRegionをfalseに設定します または 都市とその場所についての 追加コンテキストを 表示したい場合や 場合によっては 州名や都道府県名を 提供したい場合があります さらにまた フランスのパリのように 国名を含めたい場合もあります MapKitでは 住所に適したものを選択したり マップアイテムを要求している デバイスのロケールや地域情報を選択したり することで これを簡単に実現します これで 私のアプリに使用できる 様々な住所表現について理解できたので cityWithContextを選択して 写真と一緒に表示する 住所情報をより簡潔にします アプリに適切な詳細度で住所を 表示でき 見た目が改善されました
正ジオコーディングのAPIは 逆ジオコーディングとよく似ています MKGeocodingRequestを使用すると 住所に対するMapItemを返すことができます これにより 座標へのアクセスやマップへの 座標の追加が非常に簡単になります また 先ほど説明した住所情報に関する オプションもすべて含まれているため ジオコーディングを 要求する前にはなかった 住所についての様々な 表示表現を取得できます
場所を見つけて それらに 関する情報を表示できたので 道案内に役立つ MapKit APIを紹介します MapKitには 徒歩や車など 複数の交通手段による 出発地から目的地までのルートを 見つけることができる Directions APIがあります Directions APIは目的地までの 時間と距離の推定値や 着くまでの流れなどの 詳細情報を提供します
ダブリンのマップビューに戻り 私が厳選した噴水への道順を 構築したいと思います マップ上での選択を有効にするために マップのイニシャライザでマップアイテムの バインディングを指定します その後 選択したアイテムが変更されたとき ルートを計算できます マップの選択を処理する 方法の詳細については WWDC 2023の「Meet MapKit for SwiftUI」をご覧ください ルートを取得するには まず道順要求を作成します 次に デバイスの現在地を 出発地として設定し 選択されているマップアイテムを 目的地として設定します さらに 道順オブジェクトを作成し 最後にルートを計算します エラーを処理してから応答を処理します 道順要求の応答には 何が含まれているでしょうか
ここでは 求めているルートに 一致した出発地と目的地を返します これらは要求で提供したものとは 多少異なる場合があります 例えば 運転の道順では 駐車場が考慮される場合があり 徒歩の道順では建物の入口まで 直接誘導する場合があります
また 要求を満たす1つ以上の ルートを持つ配列も含まれています
ルートには強力な情報が 多数含まれています ルートのタイトルとして使用 できるローカライズされた名前 通行止めなど ルートに 関連する通知の配列 そのルートを移動するのに必要な メートル単位の距離 そのルートを移動するにかかる時間 マップ上での描画に適した ルートの形状などがあります
Appleは今年 MapKitに自転車の道順の サポートを追加しました 私のアプリでは サイクリングがダブリンの 噴水を訪れるのに最適な方法です これは簡単に使用でき 道順要求で 1つのプロパティを変更するだけです 道順として有望な自転車 ルートを表示したいので 応答から最初のルートを取得し MapPolylineを使用して それをマップに追加します 道順を表示するのはとても簡単です
MapKitを使った自転車ルートは強力です 自動車では利用できない小道や サイクリングロードを利用し 自転車に適さない特定の道路を除外します また MapKit JSを使用して自転車の道順や 到着予定時刻を取得することもできます Swiftの場合と同様に 必要な作業は 既存の道順要求に 1行の構成を追加し 交通手段タイプとして 自転車を指定するだけです
また今回初めてwatchOSで MapKitを使用して 道順を取得できるようになりました 実際 最新のwatchOS SDKにより 20を超えるMapKit APIを Apple Watchで利用できます
私の噴水ツアーに適した 自転車ルートができたので 事前にルートを詳しく 調べることができれば より快適に走れるでしょう マップのLook Around機能を有効に すると360度のインタラクティブな ストリート画像を取得でき 道路 自転車レーン 駐輪場 目標物を 簡単に確認できます
当社はiOS 16のMapKitアプリに Look Aroundを導入しました これには 画像が特定の場所に あるかどうかを確認するAPI 周囲の画像を確認するAPI 全画面で表示するAPIが含まれます 詳細はWWDC 2022の 「What’s new in MapKit session」を ご覧ください
今年は MapKit JSに Look Aroundを導入したので WebサイトやWebアプリで Look Aroundを有効にできます 2種類のLook Aroundビューを 追加できます
1つ目はインタラクティブな Look Aroundです 独自のUI内にユーザーが操作できるLook Aroundビューを埋め込むことができます 2つ目はLook Aroundプレビューです 目的の場所に画像の静的 スナップショットを提供できます プレビューをクリックすると全画面表示で インタラクティブな体験が起動します インタラクティブなLook Aroundビューを 追加するにはplaceオブジェクトが必要です placeLookup search geocodingなどの 場所を返す任意のMapKit JS APIを 使用できます この場合は 識別子があるので placeLookupを使用します 次に 含まれているDOM要素を渡す lookAroundオブジェクト placeオブジェクト options辞書を作成します Look Aroundビューでは 3つの オプションがサポートされています 1つ目はopenDialogです このオプションがtrueの場合 Look Aroundビューはブラウザ ウィンドウ全体をカバーします 2つ目はshowsDialogControlです これがtrueの場合 ボタンが Look Aroundビューに表示されます このボタンで全画面表示を 開始または終了できます 最後はshowsCloseControlです trueの場合 Look Aroundビューを 閉じるボタンが表示されます MapKit JSはLook Aroundビューに 関連する様々なイベントを発生させます イベントリスナーを追加して 応答したり デフォルトの動作を変更したりできます 例えば ユーザーが閉じる ボタンをタップすると closeイベントが送信されます このコールバックを使用して アニメーションを実行したり アプリに応じた状態の変更を 実行したりできます
このイベントのデフォルト 動作をキャンセルしない場合 Look Aroundビューは DOMから削除されます 他に次のようなイベントを扱えます loadイベントは ビューが完全に 読み込まれたときディスパッチされます errorイベントは問題がある 場合にディスパッチされます 例えば 画像を利用できない場合や ブラウザがビューを表示できない 場合がこれに該当します MapKit JSはエラーUIを提供しますが 独自のエラー体験またはフォールバック 体験を用意することができます 最後に Look Aroundはreadystatechange イベントを発生させます これを使用するとビューの ライフサイクルを監視できます 準備完了状態は ビューの読み込み中 読み込みの完了時 ビューでのエラー発生時 DOMからのビューの削除時に変化します Look Aroundビューに加えて Look Around Preview APIを使用すると よりシンプルな体験を実現できます Look Aroundプレビューは インタラクティブではなく ユーザーはビューの視点を 変更できません Look Aroundプレビューをクリックすると ウィンドウ全体に表示されます MapKit JSでLook Aroundを使うと Webサイトを レベルアップできます このセッションの内容は以上です とても盛りだくさんでした MapKitとMapKit JSで場所を見つけ 場所の情報を表示し マップを世界中の場所の道案内として 使用する方法を説明しました
最後に 皆さんに宿題です PlaceDescriptorを使用して 識別子が ある場合とない場合に場所を見つけて 場所の参照を他のアプリに送信してください Appleマップへのリンクを更新して 新しい 統一されたURL形式を使用してください
ジオコーディングを使用するため アプリを CoreLocationからMapKit APIに移行し 素晴らしい住所表現を活用してください 最後に 自転車の道順とLook Aroundをアプリに追加して 人々の移動を支援してください
ご視聴いただきありがとうございました
-
-
4:49 - Putting Marker on the Map with a coordinate
// Putting Marker on the Map with a coordinate let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) var body: some View { Map { Marker( "Anna Livia Fountain", coordinate: annaLiviaCoordinates ) } }
-
5:07 - Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation
// Creating and resolving a PlaceDescriptor with coordinate PlaceRepresentation import GeoToolbox import MapKit let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain" ) let request = MKMapItemRequest(placeDescriptor: annaLiviaDescriptor) do { annaLiviaMapItem = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") }
-
5:56 - Creating and resolving a PlaceDescriptor with address PlaceRepresentation
// Creating and resolving a PlaceDescriptor with address PlaceRepresentation import GeoToolbox import MapKit let address = "121-122 James's St, Dublin 8" let descriptor = PlaceDescriptor( representations: [.address(address)], commonName: "Obelisk Fountain" ) let request = MKMapItemRequest(placeDescriptor: descriptor) do { obeliskFountain = try await request.mapItem } catch { print("Error resolving placeDescriptor: \(error)") }
-
6:45 - Creating a PlaceDescriptor with identifiers
// Creating a PlaceDescriptor with identifiers import GeoToolbox let annaLiviaCoordinates = CLLocationCoordinate2D( latitude: 53.347673, longitude: -6.290198 ) let identifiers = ["com.apple.MapKit" : "ICBB5FD7684CE949"] let annaLiviaDescriptor = PlaceDescriptor( representations: [.coordinate(annaLiviaCoordinates)], commonName: "Anna Livia Fountain", supportingRepresentations: [.serviceIdentifiers(identifiers)] )
-
7:28 - Fetching a MapItem from a PlaceDescriptor
// Fetching a MapItem from a PlaceDescriptor let request = MKMapItemRequest(placeDescriptor: descriptor) let mapitem = try await request.mapItem
-
7:43 - Getting a PlaceDescriptor from a MapItem
// Getting a PlaceDescriptor from a MapItem let descriptor = PlaceDescriptor(mapItem: mapitem)
-
8:10 - Place Card
// Place Card var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) .mapItemDetailSelectionAccessory(.callout) } } }
-
10:45 - Reverse geocode with MapKit
// Reverse geocode with MapKit import MapKit let millCreekCoordinates = CLLocation(latitude: 39.042617, longitude: -94.587526) if let request = MKReverseGeocodingRequest(location: millCreekCoordinates) { do { let mapItems = try await request.mapItems millCreekMapItem = mapItems.first } catch { print("Error reverse geocoding location: \(error)") } }
-
13:50 - Forward geocoding with MapKit
// Forward geocoding with MapKit var body: some View { Map { if let mapItem { Marker(item: mapItem) } } .task { let request = MKGeocodingRequest( addressString: "1 Ferry Building, San Francisco" ) do { mapItem = try await request?.mapItems.first } catch { print("Error geocoding location: \(error)") } } }
-
14:38 - Allowing Map Selection
// Allowing Map Selection @State var selectedItem: MKMapItem? var body: some View { Map(selection: $selectedItem) { UserAnnotation() ForEach(fountains, id: \.self) { item in Marker(item: item) } } .onChange(of: selectedItem) { // Compute Route } }
-
15:00 - Fetch a route
// Fetch a route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") }
-
16:06 - Fetch a cycling route
// Fetch a cycling route let request = MKDirections.Request() request.source = MKMapItem.forCurrentLocation() request.destination = selectedItem request.transportType = .cycling let directions = MKDirections(request: request) do { let response = try await directions.calculate() returnedRoutes = response.routes } catch { print("Error calculating directions: \(error)") }
-
16:25 - Display a route on the Map
// Display a route on the Map Map { if let mapRoute { UserAnnotation() MapPolyline(mapRoute) .stroke(Color.blue, lineWidth: 5) } }
-
16:40 - Cycling directions in MapKit JS
// Cycling directions in MapKit JS let directions = new mapkit.Directions(); directions.route ({ origin: safariPlayground, destination: cherryHillFountain, transportType: mapkit.Directions.Transport.Cycling }, (error, { routes: [{ polyline }] }) => { polyline.style.lineWidth = 5; map.showItems([ new mapkit.PlaceAnnotation(place), new mapkit.PlaceAnnotation( place2, { selected: true } ), polyline ]); });
-
17:26 - Look Around
// Look Around var body: some View { Map { ForEach(fountains, id:\.name) { fountain in Marker(item: fountain) } } .overlay(alignment: .bottomLeading) { if (lookAroundScene != nil) { LookAroundPreview(scene: $lookAroundScene) .frame(width: 230, height: 140) .cornerRadius(10) .padding(8) } } }
-
18:10 - Look Around View in MapKit JS
// Look Around View in MapKit JS const placeLookup = new mapkit.PlaceLookup(); const place = await new Promise( resolve => placeLookup.getPlace( "IBE1F65094A7A13B1", (error, result) => resolve(result) ) ); // Create an interactive look around view. const lookAround = new mapkit.LookAround( document.getElementById("container"), place, options );
-
18:35 - Look Around Options
// Look Around Options for MapKit JS const options = { // Enters a full window experience // immediately on load openDialog: true, // Provides a button to enter and // exit full window. showsDialogControl: true, // Provides a button to destroy // the look around view. showsCloseControl: true, };
-
19:10 - Handle MapKit JS Look Around events
// Handle MapKit JS Look Around events lookAround.addEventListener( "close", event => { app.closeView(); event.preventDefault(); } ); lookAround.addEventListener( "load", event => app.fadeInView() ); lookAround.addEventListener( "error", event => app.fadeOutView() ); lookAround.addEventListener( "readystatechange", event => console.log(lookAround.readyState) );
-
20:01 - MapKit JS Look Around Preview
// MapKit JS Look Around Preview const lookAround = new mapkit.LookAroundPreview( document.getElementById("container"), place );
-