39
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

概要

  • 2023年6月 WWDC2023にて、「地図アプリを簡単に作成できる」とAppleは公言しています。
  • そんな簡単に地図アプリができるわけないやろ?と思った人もいるはず。
  • iOS17の新機能でお手軽に遊びたい人向けの記事です。

WWDCの記事はこちら↓
https://developer.apple.com/videos/play/wwdc2023/10043/

Appleデベロッパ向けのサイト
(2023/09/21付)でも簡単にできると書いてあるので、疑い半分で実際に試してみます。

Mapを出してみたい

プロジェクトを新規作成してContentView.swiftの中で噂のMapKitをimportしてみます。
そして、Map()だけ書いてみます。
すると・・・?

import SwiftUI
import MapKit // ←これ

struct ContentView: View {
    var body: some View {
        Map() // ←これ
    }
}

なんか日本のマップ出てきた!すごい!
"Hello World"よりも短いコードで書けるので、確かに簡単に書けてしまいます。

そして、一行追加するだけで、mapの形式を変えられてしまいます。

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

Japan is Beautiful!!!リアルな地図に切り替えるのも簡単です。

アノテーションをつけてみたい

まずはピンを建てたい座標(緯度・経度)を調べます。
⚠️: 緯度経度にはdegree形式とdms形式という二種類があり数値が異なるので注意してください。
degree形式がiOS開発環境の場合はデフォルトのようです。

打つ文字数が少ないってこともあり、三重県の「津駅」を今回は使います。

CLLocationCoordinate2Dを使って座標を定義して、
新機能のMarkerを使います。

extension CLLocationCoordinate2D {
    static let tsu_station = CLLocationCoordinate2D(latitude: 34.7345036, longitude: 136.5101973)
}

struct ContentView: View {
    var body: some View {
        Map {
            Marker("Tsu-Station", systemImage: "train.side.front.car", coordinate: .tsu_station)
                .tint(.blue)
        }
    }
}

systemImageはSF Symbolsから画像を探します。

Marker部分を消して、Anotationに変えてみると・・・

            Annotation("Tsu-Station",
                       coordinate: .tsu_station, anchor: .bottom) {
                VStack {
                    Text("Mie is Tokai")
                    Image(systemName: "flag.2.crossed")
                }
                .foregroundColor(.blue)
                .padding()
                .background(in: .capsule)
            }

津駅「三重 is 都会」・・・なんて遊びもできます。

中心地(現在地)に戻る機能

現在地を取得する には権限の関係でInfo.plist の設定とかもあって、めんd・・・ 機能はiOS17以前と変わらないので別途調べてください。

地図アプリ使用中に特定の位置、つまりUserLocationに戻りたい場合があると思います。
その場合はMapCameraPositionを使います。

中心地に戻るボタン(LocationButton.swift)を追加した例です。

ContextView.swift

struct ContentView: View {
    
    @State var position: MapCameraPosition = .automatic // ←ここ追加
    
    var body: some View {
        Map(position: $position)  {
            
            UserAnnotation(anchor: .center) // ←ここ追加
            
            Annotation("Tsu-Station",
                       coordinate: .tsu_station, anchor: .bottom) {
                VStack {
                    Text("Mie is Tokai")
                    Image(systemName: "flag.2.crossed")
                    LocationButton(position: $position) // ←ここ追加
                }
                .foregroundColor(.blue)
                .padding()
                .background(in: .capsule)
            }
        }
    }
}

LocattionButton.swift(新規作成)

import SwiftUI
import MapKit

struct LocationButton: View {
    
    @Binding var position: MapCameraPosition

    var body: some View {
        
        Button {
            position = .userLocation(fallback: .automatic)
        } label: {
            Label("ふるさと",systemImage: "location.circle")
        }
    }
}

上記のソースを実行し、"ふるさと"をタップすると津駅が中央になります。
これはもう津駅は都会と言っても過言ではないですね。

方角やら3Dやら

地図アプリの右上ら辺にある諸々を出したいときは、mapControlsを使います。

        Map()
        .mapControls {
            MapUserLocationButton()

時間があればやってみたいこと

WWDC2023のサンプルでは検索アプリのようなものを作っていましたが、緯度経度を取得するAPIを使ってみると面白いかもしれません。

個人的に興味があったのは「湧き水API」というものがあり、それを使って、湧き水の位置アプリを作ると面白そうです。(思ったより日本中に湧き水ってあるんですね。)
https://springwaterapi.docs.apiary.io/#introduction

  "result": [
    {
      "access": "◎",
      "activity": "市民モニターによる実態調査",
      "address": "愛知県名古屋市千種区天白町大字植田植田山",
      "createCd": "admin",
      "createDate": 1672239600000,
      "furigana": "きんめいすい",
      "id": 1830,
      "latitude": 35.1507491,
      "link": "<ahref="map/23100-1.jpg"<=""a="">写真・地図</a>",
      "longitude": 136.9848604,
      "name": "金明水",
      "oldAddress": "名古屋市千種区天白町",
      "overview": "東山動植物園の東南の斜面から湧出しており、近傍には小さな祠が作られています。",
      "updateCd": "admin",
      "updateDate": 1672239600000
    },

水のアイコン&Anotationでコメント出したりするとか?災害時に使えたり?
興味を持たれた方はぜひアプリ作ってみてはいかがでしょうか。

まとめ

  • 数行で簡単に作れた
  • SwiftUIの進化を改めて感じる。
  • 画像やピン留めなどが簡単にできるので位置情報使った簡単なゲームも作れる気がする。
  • iOS17最高かよ・・・
39
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?