Penanda

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Pilih platform: Android iOS JavaScript

Penanda menunjukkan satu lokasi pada peta.

Secara default, penanda menggunakan ikon standar yang memiliki tampilan dan nuansa Google Maps yang umum. Jika ingin menyesuaikan penanda, Anda dapat mengubah warna penanda default, atau mengganti gambar penanda dengan ikon kustom, atau mengubah properti penanda lainnya.

Sebagai respons terhadap peristiwa klik pada penanda, Anda dapat membuka jendela info. Jendela info menampilkan teks atau gambar dalam jendela pop-up di atas penanda. Anda dapat menggunakan jendela info default untuk menampilkan teks, atau membuat jendela info kustom sendiri untuk sepenuhnya mengontrol kontennya.

Menambahkan penanda

Untuk menambahkan penanda, buat objek GMSMarker yang menyertakan position dan title, lalu tetapkan map-nya.

Contoh berikut menunjukkan cara menambahkan penanda ke objek GMSMapView yang ada. Penanda dibuat pada koordinat 10,10, dan menampilkan string "Hello world" di jendela info saat diklik.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.title = "Hello World"
marker.map = mapView
      

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.title = @"Hello World";
marker.map = mapView;
      

Anda dapat menganimasikan penambahan penanda baru ke peta dengan menetapkan properti marker.appearAnimation ke:

  • kGMSMarkerAnimationPop agar penanda muncul dari groundAnchor saat ditambahkan.
  • kGMSMarkerAnimationFadeIn agar penanda memudar saat ditambahkan.

Menghapus penanda

Anda dapat menghapus penanda dari peta dengan menetapkan properti map dari GMSMarker ke nil. Atau, Anda dapat menghapus semua overlay (termasuk penanda) yang ada di peta dengan memanggil metode GMSMapView clear.

Swift

let camera = GMSCameraPosition.camera(
  withLatitude: -33.8683,
  longitude: 151.2086,
  zoom: 6
)
let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
// ...
mapView.clear()
      

Objective-C

GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.8683
                                                        longitude:151.2086
                                                             zoom:6];
mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
// ...
[mapView clear];
      

Jika ingin memodifikasi penanda setelah menambahkannya ke peta, pastikan Anda tetap mempertahankan objek GMSMarker. Anda dapat mengubah penanda ini nanti dengan membuat perubahan pada objek ini.

Swift

let position = CLLocationCoordinate2D(latitude: 10, longitude: 10)
let marker = GMSMarker(position: position)
marker.map = mapView
// ...
marker.map = nil
      

Objective-C

CLLocationCoordinate2D position = CLLocationCoordinate2DMake(10, 10);
GMSMarker *marker = [GMSMarker markerWithPosition:position];
marker.map = mapView;
// ...
marker.map = nil;
      

Mengubah warna penanda

Anda dapat menyesuaikan warna gambar penanda default dengan meminta versi berwarna dari ikon default dengan markerImageWithColor:, dan meneruskan gambar yang dihasilkan ke properti ikon GMSMarker.

Swift

marker.icon = GMSMarker.markerImage(with: .black)
      

Objective-C

marker.icon = [GMSMarker markerImageWithColor:[UIColor blackColor]];
      

Menyesuaikan gambar penanda

Jika ingin mengubah gambar penanda default, Anda dapat menetapkan ikon khusus menggunakan properti icon atau iconView penanda.

Jika iconView ditetapkan, API akan mengabaikan properti icon. Update untuk icon saat ini tidak dikenali selama iconView ditetapkan.

Menggunakan properti `icon` penanda

Cuplikan berikut membuat penanda dengan ikon kustom yang disediakan sebagai UIImage di properti icon. Ikon berada dalam posisi tengah di London, Inggris. Cuplikan tersebut mengasumsikan bahwa aplikasi Anda berisi gambar bernama "house.png".

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let london = GMSMarker(position: positionLondon)
london.title = "London"
london.icon = UIImage(named: "house")
london.map = mapView
      

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *london = [GMSMarker markerWithPosition:positionLondon];
london.title = @"London";
london.icon = [UIImage imageNamed:@"house"];
london.map = mapView;
      

Jika Anda membuat beberapa penanda dengan gambar yang sama, gunakan instance UIImage yang sama untuk setiap penanda. Hal ini membantu meningkatkan performa aplikasi Anda saat menampilkan banyak penanda.

Gambar ini mungkin memiliki beberapa bingkai. Selain itu, properti alignmentRectInsets juga dipatuhi, yang berguna jika penanda memiliki bayangan atau wilayah yang tidak dapat digunakan lainnya.

Menggunakan properti `iconView` penanda

Cuplikan berikut membuat penanda dengan ikon kustom dengan menetapkan properti iconView penanda dan menganimasikan perubahan warna penanda. Cuplikan tersebut menganggap bahwa aplikasi Anda berisi gambar bernama "house.png".

Swift

import CoreLocation
import GoogleMaps

class MarkerViewController: UIViewController, GMSMapViewDelegate {
  var mapView: GMSMapView!
  var london: GMSMarker?
  var londonView: UIImageView?

  override func viewDidLoad() {
    super.viewDidLoad()

    let camera = GMSCameraPosition.camera(
      withLatitude: 51.5,
      longitude: -0.127,
      zoom: 14
    )
    let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
    view = mapView

    mapView.delegate = self

    let house = UIImage(named: "House")!.withRenderingMode(.alwaysTemplate)
    let markerView = UIImageView(image: house)
    markerView.tintColor = .red
    londonView = markerView

    let position = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
    let marker = GMSMarker(position: position)
    marker.title = "London"
    marker.iconView = markerView
    marker.tracksViewChanges = true
    marker.map = mapView
    london = marker
  }

  func mapView(_ mapView: GMSMapView, idleAt position: GMSCameraPosition) {
    UIView.animate(withDuration: 5.0, animations: { () -> Void in
      self.londonView?.tintColor = .blue
    }, completion: {(finished) in
      // Stop tracking view changes to allow CPU to idle.
      self.london?.tracksViewChanges = false
    })
  }
}
      

Objective-C

@import CoreLocation;
@import GoogleMaps;

@interface MarkerViewController : UIViewController <GMSMapViewDelegate>
@property (strong, nonatomic) GMSMapView *mapView;
@end

@implementation MarkerViewController {
  GMSMarker *_london;
  UIImageView *_londonView;
}

- (void)viewDidLoad {
  [super viewDidLoad];

  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5
                                                          longitude:-0.127
                                                               zoom:14];
  _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  self.view = _mapView;

  _mapView.delegate = self;

  UIImage *house = [UIImage imageNamed:@"House"];
  house = [house imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
  _londonView = [[UIImageView alloc] initWithImage:house];
  _londonView.tintColor = [UIColor redColor];

  CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
  _london = [GMSMarker markerWithPosition:position];
  _london.title = @"London";
  _london.iconView = _londonView;
  _london.tracksViewChanges = YES;
  _london.map = self.mapView;
}

- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position {
  [UIView animateWithDuration:5.0
                   animations:^{
    self->_londonView.tintColor = [UIColor blueColor];
  }
                   completion:^(BOOL finished) {
    // Stop tracking view changes to allow CPU to idle.
    self->_london.tracksViewChanges = NO;
  }];
}

@end
      

Karena iconView menerima UIView, Anda dapat memiliki hierarki kontrol UI standar yang menentukan penanda, setiap tampilan memiliki kumpulan kemampuan animasi standar. Anda dapat menyertakan perubahan pada ukuran penanda, warna, dan tingkat alfa, serta menerapkan transformasi arbitrer. Properti iconView mendukung animasi semua properti animasi UIView kecuali frame dan center.

Perhatikan pertimbangan berikut saat menggunakan iconView:

  • UIView dapat meminta resource jika tracksViewChanges ditetapkan ke YES, yang dapat mengakibatkan peningkatan penggunaan baterai. Sebagai perbandingan, satu frame UIImage bersifat statis dan tidak perlu dirender ulang.
  • Beberapa perangkat mungkin kesulitan untuk merender peta jika Anda memiliki banyak penanda di layar, dan setiap penanda memiliki UIView sendiri, dan semua penanda melacak perubahan secara bersamaan.
  • iconView tidak merespons interaksi pengguna, karena merupakan snapshot tampilan.
  • Tampilan berperilaku seolah-olah clipsToBounds disetel ke YES, terlepas dari nilai sebenarnya. Anda dapat menerapkan transformasi yang berfungsi di luar batas, tetapi objek yang Anda gambar harus berada dalam batas objek. Semua transformasi/perubahan dipantau dan diterapkan. Singkatnya: subtampilan harus dimuat dalam tampilan.

Untuk menentukan kapan harus menetapkan properti tracksViewChanges, Anda harus mempertimbangkan pertimbangan performa dibandingkan keuntungan memiliki penanda ulang secara otomatis. Contoh:

  • Jika memiliki serangkaian perubahan yang akan dibuat, Anda dapat mengubah properti ke YES, lalu kembali ke NO.
  • Saat animasi berjalan atau konten dimuat secara asinkron, Anda harus mempertahankan properti untuk ditetapkan ke YES sampai tindakan selesai.

Mengubah opasitas penanda

Anda dapat mengontrol opasitas penanda dengan properti opacity. Anda harus menentukan opasitas sebagai float antara 0.0 dan 1.0, dengan 0 sepenuhnya transparan dan 1 sepenuhnya tidak tembus pandang.

Swift

marker.opacity = 0.6
      

Objective-C

marker.opacity = 0.6;
      

Anda dapat menganimasikan opasitas penanda dengan Animasi Inti melalui GMSMarkerLayer.

Meratakan penanda

Ikon penanda biasanya digambar dengan berorientasi pada layar perangkat, bukan permukaan peta, sehingga memutar, memiringkan, atau melakukan zoom pada peta tidak perlu mengubah orientasi penanda.

Anda dapat menetapkan orientasi penanda agar datar terhadap bumi. Penanda datar diputar saat peta diputar, dan berubah perspektifnya saat peta dimiringkan. Seperti penanda biasa, penanda datar mempertahankan ukurannya saat peta diperbesar atau diperkecil.

Untuk mengubah orientasi penanda, tetapkan properti flat penanda ke YES atau true.

Swift

let positionLondon = CLLocationCoordinate2D(latitude: 51.5, longitude: -0.127)
let londonMarker = GMSMarker(position: positionLondon)
londonMarker.isFlat = true
londonMarker.map = mapView
      

Objective-C

CLLocationCoordinate2D positionLondon = CLLocationCoordinate2DMake(51.5, -0.127);
GMSMarker *londonMarker = [GMSMarker markerWithPosition:positionLondon];
londonMarker.flat = YES;
londonMarker.map = mapView;
      

Memutar penanda

Anda dapat memutar penanda di sekitar titik link-nya dengan menetapkan properti rotation. Tentukan rotasi sebagai jenis CLLocationDegrees, yang diukur dalam derajat searah jarum jam dari posisi default. Jika penanda datar pada peta, posisi default-nya adalah Utara.

Contoh berikut memutar penanda 90°. Menetapkan properti groundAnchor ke 0.5,0.5 menyebabkan penanda diputar di tengahnya, bukan dasarnya.

Swift

let degrees = 90.0
londonMarker.groundAnchor = CGPoint(x: 0.5, y: 0.5)
londonMarker.rotation = degrees
londonMarker.map = mapView
      

Objective-C

CLLocationDegrees degrees = 90;
londonMarker.groundAnchor = CGPointMake(0.5, 0.5);
londonMarker.rotation = degrees;
londonMarker.map = mapView;
      

Menangani peristiwa pada penanda

Anda dapat memproses peristiwa yang terjadi pada peta, seperti saat pengguna mengetuk penanda. Untuk memproses peristiwa, Anda harus menerapkan protokol GMSMapViewDelegate. Lihat panduan peristiwa dan daftar metode pada GMSMapViewDelegate. Untuk peristiwa Street View, lihat GMSPanoramaViewDelegate.