Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Indoor Mapping Data Format を使った屋内フロアマップの表示

Avatar for Haruki Inoue Haruki Inoue
September 20, 2025
93

Indoor Mapping Data Format を使った屋内フロアマップの表示

この発表は iOSDC2025 で発表した内容です。
https://fortee.jp/iosdc-japan-2025/proposal/bc043c75-bab6-4d74-8676-7cae7ce461c3

マップを活用したiOSアプリは、建物や道路といった屋外の情報を扱うことが多いですが、建物にズームしたときに、その建物内のフロアマップが表示されるような機能を兼ね備えたアプリも存在します。

みなさんは、ショッピングセンターや空港といった施設内の位置情報を定義できるフォーマットをご存知でしょうか?Appleは、Indoor Mapping Data Format (IMDF) というフォーマットを提唱しています。これを使うと、フロア内の部屋の領域だけではなく、消化器や机といった屋内にある備品の位置情報も定義することができます。

IMDFで定義した屋内フロアマップは、MapKitを使って表示することができます。IMDFで定義した屋内マップを地図上に表現することで、屋内の場所をわかりやすく表示したり、施設内の情報を表示する機能なども提供できます。

このセッションでは、Appleが提唱している建物内の位置情報を定義できる IMDF についての仕様や定義の仕方について紹介をします。また、このフォーマットに則って実際に建物内の位置情報を定義して、MapKitを使って屋内のフロアマップ実装例について紹介します。

話すこと:

- Indoor Mapping Data Format の概要
- 位置情報を定義できるJSON「GeoJSON」とはなにか?
- 各フォーマットでどのような情報を定義するべきなのか
- Indoor Map Data Formatの制約について
- MapKitで屋内フロアマップの表示をする実装例
- MKGeoJSONDecoderによるGeoJSONのデコード
- 屋内フロアマップを地図の上に表示
- フロアマップ内で位置を選択して施設内の情報を表示する機能

Avatar for Haruki Inoue

Haruki Inoue

September 20, 2025
Tweet

Transcript

  1. *.%'ͷϑΝΠϧߏ੒ ϑΝΠϧ໊ ඞਢϑϥά આ໌ NBOJGFTUKTPO ඞਢ *.%'ʹؔ͢Δϝλσʔλͷ৘ใ BEESFTTHFPKTPO ඞਢ ॅॴͷ৘ใ

    WFOVFHFPKTPO ඞਢ ࢪઃશମͷ৘ใ BNFOJUZHFPKTPO ެऺి࿩ͳͲݐ෺಺ͷඋ඼ʹؔ͢Δ৘ใ BODIPSHFPKTPO ஍෺ͷΞϯΧʔϙΠϯτΛఆΊΔ৘ใ CVJMEJOHHFPKTPO Ϗϧɾݐ෺ࣗମʹؔ͢Δ৘ใ EFUBJMHFPKTPO ֊ஈͷઢͳͲݐ෺಺ͷࡉ͔͍஍෺ΛఆΊΔ fi YUVSFHFPKTPO ςʔϒϧͳͲͷ൒ݻఆͷඋ඼ʹؔ͢Δ৘ใ GPPUQSJOUHFPKTPO ۭதɾ஍্ɾ஍ԼͷྖҬʹؔ͢Δ৘ใ LJPTLHFPKTPO ചళʹؔ͢Δ৘ใ MFWFMHFPKTPO ݐ෺಺ͷϑϩΞશମͷྖҬʹؔ͢Δ৘ใ PDDVQBOUHFPKTPO ࢪઃͷςφϯτʹؔ͢Δ৘ใ PQFOJOHHFPKTPO ෦԰ͷग़ೖޱʹؔ͢Δ৘ใ SFMBUJPOTIJQHFPKTPO ֤ྖҬ͕ؒͲͷΑ͏ʹҠಈͰ͖Δͷ͔ఆΊΔ TFDUJPOHFPKTPO น͸۠੾ΒΕ͍ͯͳ͍͕۠෼͚͞Ε͍ͯΔྖҬʹؔ͢Δ৘ใʢੜ઱ചΓ৔ͳͲʣ HFPGFODFHFPKTPO Ծ૝తͳڥքΤϦΞͷ৘ใΛఆΊΔ VOJUHFPKTPO นͳͲͰ۠੾ΒΕ͍ͯΔ෦԰ʹؔ͢Δ৘ใ Ҿ༻IUUQTEPDTPHDPSHDT3FGFSFODFJOEFYIUNMઆ໌͸ಠࣗͰهࡌ
  2. (FP+40/ͱ͸ʁ ஍ཧ৘ใΛ+40/ܗࣜͰѻ͏ϑΥʔϚοτ "type": "Point" ୯Ұͷ఺Λఆٛ "type": "LineString" ୯ҰͷઢΛఆٛ "type": "Polygon"

    ୯Ұͷ໘Λఆٛ "type": "MultiPoint" ෳ਺ͷ఺Λఆٛ "type": "MultiLineString" ෳ਺ͷઢΛఆٛ "type": "MultiPolygon" ෳ਺ͷ໘Λఆٛ type৘ใͷछྨΛఆٛ 1⃣properties஍෺ͷଐੑ৘ใΛఆٛ 2⃣geometry஍෺ͷδΦϝτϦΛهࡌ HFPNFUSZͰఆٛͰ͖Δछྨ 1⃣ 2⃣
  3. manifest.json*.%'ͷϝλσʔλΛఆٛ version *.%'ͷόʔδϣϯ ݻఆ created ࡞੒೔࣌ generated_by *.%'Λ࡞੒ͨ͠ιϑτ language ݴޠ

    extensions ֦ு৘ใ ͜ͷϑΝΠϧ͸JSONܗࣜͰهࡌ ඞཁͳ৘ใ LFZ͕ଠจࣈͷ߲໨͸ඞਢ
  4. address.geojsonॅॴʹؔ͢Δ৘ใΛఆٛ address ॅॴ unit ෦԰൪߸ locality ࢢொଜ province ౎ಓ෎ݝͷίʔυ country

    ࠃͷίʔυ postal_code ༣ศ൪߸ postal_code_ext ༣ศ൪߸ͷ֦ு෦෼ postal_code_vanity ༣ศ൪߸ͷ֦ு෦෼ properties geometry nullΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ
  5. venue.geojsonࢪઃʹؔ͢Δ৘ใΛఆٛ category ࢪઃͷΧςΰϦ restriction ࢪઃͷ੍ݶΛද͢ΧςΰϦ name ࢪઃͷ໊લ alt_name ࢪઃͷ௨শ hour

    Ӧۀ࣌ؒ phone ࢪઃͷి࿩൪߸ website ࢪઃͷ8FCαΠτ display_point ࢪઃΛ఺Ͱදݱ͢Δ৔߹ͷ఺ address_id ॅॴͷ*% properties geometry PolygonͷδΦϝτϦΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ
  6. level.geojsonϑϩΞ Ϩϕϧ ʹؔ͢Δ৘ใΛఆٛ category ϨϕϧͷΧςΰϦ restriction ੍ݶΛද͢ΧςΰϦ outdoor USVFͷ৔߹͸԰֎Λࣔ͢ ordinal

    Ϩϕϧͷॱ൪ɻ஍্֊͸ɻ஍Լ֊͸ name Ϩϕϧͷ໊લ short_name Ϩϕϧͷ୹ॖ໊ display_point ϨϕϧΛ఺Ͱදݱ͢Δ৔߹ͷ఺ address_id ॅॴͷ*% building_ids ͜ͷϨϕϧͷೖ͍ͬͯΔϏϧͷ*% properties geometry PolygonͷδΦϝτϦΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ
  7. unit.geojsonนͰ۠੾ΒΕͨ෦԰ͷ৘ใΛఆٛ category ϢχοτͷΧςΰϦ restriction ੍ݶΛද͢ΧςΰϦ accessibility ΞΫηγϏϦςΟͷΧςΰϦ name Ϣχοτͷ໊લ alt_name

    Ϣχοτͷผ໊ level_id Ϣχοτ͕ଘࡏ͢ΔϨϕϧ*% display_point ϢχοτΛ఺Ͱදݱ͢Δ৔߹ͷ఺ properties geometry PolygonͷδΦϝτϦΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ
  8. opening.geojson෦԰΍ݐ෺ͷग़ೖޱΛఆٛ category ग़ೖޱͷΧςΰϦ accessibility ΞΫηγϏϦςΟͷΧςΰϦ access_control ΞεηείϯτϩʔϧͷΧςΰϦ door υΞͷ৘ใʢεϥΠυࣜͷυΞͳͲʣ name

    ग़ೖޱͷ໊લ alt_name ग़ೖޱͷ௨শ display_point ग़ೖޱΛ఺Ͱදݱ͢Δ৔߹ͷ఺ level_id ग़ೖޱ͕ଘࡏ͢ΔϨϕϧͷ*% properties geometry LineStringͷδΦϝτϦΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ ✅ ϢχοτͷྠֲʹԊͬͯఆٛ͢Δ
  9. occupant.geojsonςφϯτͷ৘ใΛఆٛ properties geometry nullΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ category ςφϯτͷΧςΰϦ name ςφϯτͷ໊લ anchor_id

    ΞϯΧʔͷ*% hours ςφϯτͷӦۀ࣌ؒ phone ςφϯτͷి࿩൪߸ website ςφϯτͷ΢ΣϒαΠτ validity ςφϯτͷ༗ޮظݶ correlation_id ࿈ܞ*% ചళ ചళ ձٞࣨ
  10. amenity.geojsonϑϩΞ಺ͷઃඋΛఆٛ properties geometry PointͷδΦϝτϦΛఆٛ LFZ͕ଠจࣈͷ߲໨͸ඞਢ category ઃඋͷΧςΰϦ accessibility ΞΫηγϏϦςΟͷΧςΰϦ name

    ઃඋͷ໊લ alt_name ઃඋͷ௨শ hours ઃඋͷӦۀ࣌ؒ phone ઃඋͷి࿩൪߸ website ઃඋͷ΢ΣϒαΠτ unit_ids ઃඋ͕ଘࡏ͢ΔϢχοτͷ*%ʢ഑ྻʣ address_id ઃඋ͕ଘࡏ͢Δ*% correlation_id ࿈ܞ*% ചళ ചళ ձٞࣨ ফԽث τΠϨ
  11. IMDFDecoder Venue Level: 1F Level: 2F Level: 10F Unit: RoomA

    Unit: RoomB Opening1 Opening2 1⃣7FOVFʹඥͮ͘-FWFMΛఆٛ 1⃣ 2⃣ 2⃣-FWFMʹඥͮ͘6OJU౳Λఆٛ
  12. MKMapViewDelegate 0WFSMBZΛ௥Ճͨ͠ͱ͖ʹ ࣮ߦ͞ΕΔϝιου  'FBUVSFΛऔಘ  3FOEFSFSΛఆٛ  configureؔ਺Ͱ ελΠϧద༻

     3FOEFSFSΛฦ͢ configure͸ಠࣗͰఆٛ ஍ਤ্ʹඳը͢Δ ઢ΍໘ͷݟͨ໨ΛܾΊΔ