[Swift] GoogleMapsSKD for ios の使い方(ピンの画像変更、吹き出しに画像やボタンの追加)について　備忘録

こんにちは。
多くの先人たちがブログなどで知識を残していってくれているので書く必要はないかと思いますが、自分用に記事を書いてみました。

##導入方法
こちらの記事をみてください。

[[iPhone] Google Maps SDK for iOS を使って地図を表示する](https://i-app-tec.com/ios/google-map.html)
[iOS向けGoogleマップSDKチュートリアル（Swift）-SDKのダウンロード
](https://medium.com/@mikachika/google-maps-sdk-for-ios%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-swift-sdk%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89-e8b02747a02)[ドットインストール](https://dotinstall.com/lessons/basic_google_maps_v2)

**注意点**としては
Googleでキーを取得する認証情報上のライブラリを選択し、Maps SDK for ios のAPIを有効にすることを忘れないでください。

参考動画　[Google Maps SDK for iOSのインストール、設定や地図を含めたiOSマップのアプリの起動ガイド](https://www.youtube.com/watch?v=oSeyt1IkWis)


##ピンを画像に変換する方法

```swift

import UIKit
import GoogleMaps
import GooglePlaces

class ViewController: UIViewController, GMSMapViewDelegate {
    var mapView: GMSMapView!
    
    override func viewDidLoad() {
        super.viewDidLoad()    
        let camera = GMSCameraPosition.camera(withLatitude: 34.077875549971,
                                              longitude: 134.56156512254,
                                              zoom: 10.0)    

        let mapView = GMSMapView.map(withFrame: view.frame,
                                     camera: camera)

        self.view = mapView  //Main.storyboardのviewに表示
        
        let marker = GMSMarker()
        //marker.icon = GMSMarker.markerImage(with: .black)  //ピンの色変更
        marker.position = CLLocationCoordinate2D(latitude: 34.077875549971,
                                                 longitude: 134.56156512254)
        marker.title = "メインタイトル"
        marker.snippet = "サブタイトル"
        marker.icon = self.imageWithImage(image: UIImage(named: "camera_1")!, scaledToSize: CGSize(width: 50.0, height: 50.0))
        marker.tracksViewChanges = true
        marker.map = mapView

        mapView.delegate = self  //いらないかも
    }
 
    //ピンの縮尺を変更する
    func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
        image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }
```

camera_1という画像を表示させた
プロジェクト名を右クリックしAdd files to "プロジェクト名"　を選んで追加する。


##ピンをタップした際、xibファイル(ボタンやラベル、ImageView)を表示する方法
このサイトと同じことをやってください
[Interactive InfoWindow GoogleMaps iOS](https://medium.com/@mnaga/interactive-infowindow-googlemaps-ios-d3d1ec1e3d23)

ただコードが写真だったのでコピペできるようにマークダウンで書いておきます。
全コード

```ViewController.swift

import UIKit
import GoogleMaps
import GooglePlaces

class ViewController: UIViewController, GMSMapViewDelegate {
    var mapView: GMSMapView!
    var tappedMarker : GMSMarker?  //追加
    var customInfoWindow : CustomInfoWindow?  //追加
    
    override func viewDidLoad() {
        super.viewDidLoad()    
        let camera = GMSCameraPosition.camera(withLatitude: 34.077875549971,
                                              longitude: 134.56156512254,
                                              zoom: 10.0)    

        let mapView = GMSMapView.map(withFrame: view.frame,
                                     camera: camera)

        self.view = mapView  //Main.storyboardのviewに表示
        
        let marker = GMSMarker()
        //marker.icon = GMSMarker.markerImage(with: .black)  //ピンの色変更
        marker.position = CLLocationCoordinate2D(latitude: 34.077875549971,
                                                 longitude: 134.56156512254)
        marker.title = "メインタイトル"
        marker.snippet = "サブタイトル"
        marker.icon = self.imageWithImage(image: UIImage(named: "camera_1")!, scaledToSize: CGSize(width: 50.0, height: 50.0))
        marker.tracksViewChanges = true
        marker.map = mapView

        mapView.delegate = self

        self.tappedMarker = GMSMarker()  //追加
        self.customInfoWindow = CustomInfoWindow().loadView()  //追加
    }
 
    //ピンの縮尺を変更する
    func imageWithImage(image:UIImage, scaledToSize newSize:CGSize) -> UIImage{
        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
        image.draw(in: CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height))
        let newImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return newImage
    }
  
    //以下　追加
    func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
        NSLog("marker was tapped")
        tappedMarker = marker
        
        let position = marker.position
        mapView.animate(toLocation: position)
        let point = mapView.projection.point(for: position)
        let newPoint = mapView.projection.coordinate(for: point)
        let camera = GMSCameraUpdate.setTarget(newPoint)
        mapView.animate(with: camera)
        
        let opaqueWhite = UIColor(white: 1, alpha: 0.85)
        customInfoWindow?.layer.backgroundColor = opaqueWhite.cgColor
        customInfoWindow?.layer.cornerRadius = 8
        customInfoWindow?.center = mapView.projection.point(for: position)
        mapView.addSubview(customInfoWindow!)
        return false
     }
    func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
        return UIView()
    }
    func mapView(_ mapView: GMSMapView, didTapAt coordinate: CLLocationCoordinate2D) {
        customInfoWindow?.removeFromSuperview()
    }
    func mapView(_ mapView: GMSMapView, didChange position: GMSCameraPosition) {
        let position = tappedMarker?.position
        customInfoWindow?.center = mapView.projection.point(for: position!)
        customInfoWindow?.center.y -= 140
    }
    
```


参考サイトと少し違うよ

```CustomInfoWindow.swift

import UIKit
import Foundation


class CustomInfoWindow: UIView {
    var view : UIView!
    
    @IBOutlet weak var Image: UIImageView!
    
    @IBOutlet weak var label: UILabel!
    
    
    @IBAction func button(_ sender: UIButton) {
        label.text = "タップされました"
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    
    
    func loadView() -> CustomInfoWindow{
        let customInfoWindow = Bundle.main.loadNibNamed("CustomInfoWindow", owner: self, options: nil)?[0] as! CustomInfoWindow
        return customInfoWindow
    }

}
```








xibファイル

<img width="1260" alt="スクリーンショット 2020-03-06 14.19.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517291/cc1688b9-ffd7-e2d6-ebff-48d3583f0940.png">


おわり
次はgeoJsonについて書こうと思う

ありがとうございました。