一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Maps SDK for iOS

为帮助您起步,我们将引导您在 Google Developers Console 中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Maps SDK for iOS
  3. 创建相应密钥
继续

地图对象

注: 本文档介绍了如何向某个 iOS 应用添加 Google 地图。 如果您想了解如何启动 Google 地图独立应用,请参阅网址架构文档。

在 API 中,地图由 UIView 的子类 GMSMapView 类表示。 地图是 Google Maps SDK for iOS 中最重要的对象,并且提供了用于添加、删除和管理其他对象(如标记和多段线)所需的方法。

简介

Google Maps SDK for iOS 允许您在 iOS 应用中显示 Google 地图。 这些地图与您在 Google 地图 iOS 应用中所看到的地图具有相同的外观,并且该 SDK 公开的许多功能也是相同的。

除了地图绘制功能外,该 API 还支持符合 iOS UI 模型的一系列交互。 例如,您可以通过定义可响应用户手势(如点按和双击)的应答器来设置与地图的交互。

使用 Map 对象时的关键类就是 GMSMapView 类。 GMSMapView 自动处理下列操作:

  • 连接到 Google 地图服务
  • 下载地图图块。
  • 在设备屏幕上显示图块。
  • 显示如平移和缩放等各类控件。
  • 通过移动和缩放地图响应平移和缩放手势
  • 通过倾斜地图的视角来响应双指手势。

除了这些自动操作外,您还可以通过 GMSMapView 类公开的属性和方法来控制地图的行为和外观。

您可以使用 GMSMapView 添加和删除标记、底面叠层和多段线,更改已显示的地图类型,并通过 GMSCameraPosition 类控制地图上显示的内容。

添加地图

添加地图的基本步骤如下:

  1. (一次) 按照入门指南中的步骤获取 SDK,获得密钥,并添加所需的框架。

  2. 在您的 AppDelegate 中,将您的 API 密钥提供给 GMSServices 中的 provideAPIKey: 类方法。

  3. 创建或更新 ViewController。 如果要在此视图控制器变为可见时显示地图,请务必在 loadView 方法中创建它。

    1. 创建一个 GMSCameraPosition 对象,其中指定地图的中心和缩放比例。 在实例化 GMSMapView 对象时,您必须传递 GMSCameraPosition 对象作为必填参数。

    2. 使用 GMSMapViewmapWithFrame: 方法创建并实例化一个 GMSMapView 类。 如果此地图将用作视图控制器的唯一视图,那么可以使用 CGRectZero 作为地图的边框,这样地图就会自动调整大小。

    3. GMSMapView 对象设为视图控制器的视图,例如: self.view = mapView;

下面的示例向某个应用添加了一个以新加坡市区为中心的地图。

Swift

import UIKit
import GoogleMaps

class DemoViewController:UIViewController {
  override func loadView() {
    let camera = GMSCameraPosition.camera(withLatitude:1.285, longitude:103.848, zoom:12)
    let mapView = GMSMapView.map(withFrame: .zero, camera: camera)
    self.view = mapView
  }
}

Objective-C

#import "DemoViewController.h"
@import GoogleMaps;

@implementation DemoViewController

- (void)loadView {
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:1.285
                                                          longitude:103.848
                                                               zoom:12];
  GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  self.view = mapView;
}

@end

当您遵循这些步骤完成操作后,还可以进一步配置 GMSMapView 对象。

地图类型

您可以使用多种地图类型中的一种来定制地图。 地图的类型决定了地图的整体表现形式。 例如,地图集通常包含的政治地图侧重于显示边界,而道路地图则会显示某个城市或地区的所有道路。

Google Maps SDK for iOS 提供了以下地图类型:

地图类型
Normal
Value: kGMSTypeNormal
典型道路地图。显示道路、人类建造的一些特征以及河流等重要的自然特征。 此外,还会显示道路 和景观标签。这是 iOS 版 Google 地图中默认的地图模式。
Hybrid
Value: kGMSTypeHybrid
添加了道路地图的卫星照片数据。 此外,还会显示道路和景观标签。 可以通过打开卫星视图,在 iOS 版 Google 地图应用中启用此地图类型。
Satellite
Value: kGMSTypeSatellite
卫星照片数据。不显示道路和景观标签。 iOS 版 Google 地图中未提供这种模式。
Terrain
Value: kGMSTypeTerrain
地形数据。 地图包含颜色、轮廓线和标签以及透视阴影。 此外,还会显示一些道路和标签。
None
Value: kGMSTypeNone
无地图图块。 不会呈现基本地图图块。 此模式与图块层结合在一起才有用。 当地图类型设置为 None 时,显示交通数据的功能将被禁用。

更改地图类型

要设置地图的类型,请给 GMSMapView.mapType 属性赋一个新的值。 例如,如需显示卫星地图类型:

Swift

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

Objective-C

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

下面的选择程序显示了同一位置 terrain 地图、normal 地图和 hybrid 地图的比较情况:

室内地图

在高缩放级别下,Google Maps SDK for iOS 将显示机场、购物中心、大型零售店和中转站等室内场所的平面图。

室内平面图都集成到了“Normal”地图类型 (kGMSTypeNormal) 的默认地图图块中,它们会在用户放大地图时自动启用,并在用户缩小地图时逐渐消失。

您可以通过将 GMSMapViewindoorEnabled 属性设置为 NO 来禁用室内地图。

Swift

var mapView = GMSMapView.map(withFrame: .zero, camera:camera)
mapView.isIndoorEnabled = false

Objective-C

GMSMapView *mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
mapView.indoorEnabled = NO;

或者,您也可以只停用楼层选取器控件

添加平面图

选择位置中提供了平面图。 如果您想在应用中突出显示的建筑没有平面图数据,您可以:

  • 直接向 Google 地图添加平面图。 这样做会将您的平面图提供给 Google 地图的所有用户。

  • 将平面图作为底面叠层显示。 这样一来,只有您的应用的用户才能查看您的平面图。

辅助工具

默认情况下,地图上的辅助工具元素处于隐藏状态。 您可以通过将 GMSMapViewaccessibilityElementsHidden 属性设置为 NO 来启用辅助工具。

这将导致为叠层对象(如 GMSMarker 和信息窗口、GMSPolyline 等)生成辅助工具元素。

Swift

mapView.accessibilityElementsHidden = false

Objective-C

mapView.accessibilityElementsHidden = NO;

此属性遵循非正式的 UIAccessibility 协议,除非 Google Maps SDK for iOS 中的默认值为 YES

My Location

默认情况下,地图上不显示任何位置数据。 您可以通过设置 GMSMapView 中的 myLocationEnabled 来启用蓝色的“My Location”圆点和指南针方向。

Swift

mapView.isMyLocationEnabled = true

Objective-C

mapView.myLocationEnabled = YES;

启用此功能后,还可通过 myLocation 属性提供用户的当前位置。 这一属性可能不会立即可用 – 例如,如果 iOS 提示用户允许他人访问此数据, 在这种情况下,它将为 nil。

Swift

// The myLocation attribute of the mapView may be null
if let mylocation = mapView.myLocation {
  print("User's location: \(mylocation)")
} else {
  print("User's location is unknown")
}

Objective-C

NSLog(@"User's location: %@", mapView.myLocation);

地图内边距

Google 地图被设计成填满 GMSMapView 所定义的整个区域。 地图外观和行为的若干方面都由视图的各种尺寸定义:

  • 摄像头的目标将反映内边距区域的中心
  • 地图控件以地图边缘为参照物进行定位。

  • 版权声明或 Google 徽标等法律信息 沿地图底部边缘显示

您可以利用 GMSMapViewpadding 属性围绕地图边缘添加内边距。 地图将继续充满整个容器, 但文本和控件定位、 地图手势以及摄像头移动将呈现出将地图置于较小空间时的行为。 这会带来以下变化:

  • 通过 API 调用或按下按钮(例如指南针按钮、My Location 按钮)进行的摄像头移动将以带有内边距的区域为参照物。

  • GMSMapView.projection 返回的投影将只包括带有内边距的区域。

  • 将以指定点数作为 UI 控件相对于容器边缘的偏移量。

内边距可能有助于设计与地图某一部分发生重叠的 UI。 例如,在以下图像中,地图沿顶部边缘和右侧边缘设置了内边距。 可见地图控件和法律文本将沿带有内边距的区域的边缘显示(显示为绿色),而地图仍将充满整个容器(显示为蓝色)。

在此示例中,您可以在地图右侧设置一个浮动菜单而不会遮盖住地图控件。

地图内边距

要向地图添加内边距,请创建一个 UIEdgeInsets 对象,并将它传递给 GMSMapView.padding 属性。

Swift

let mapInsets = UIEdgeInsets(top:100.0, left:0.0, bottom:0.0, right:300.0)
mapView.padding = mapInsets

Objective-C

// Insets are specified in this order: top, left, bottom, right
UIEdgeInsets mapInsets = UIEdgeInsetsMake(100.0, 0.0, 0.0, 300.0);
mapView.padding = mapInsets;

注:按照 Google Maps API 服务条款,您的应用不得删除或遮盖 Google 徽标或版权声明。 地图内边距允许您在必要时重新定位这些元素。 如果您在地图底部显示自定义 UI,请在地图底部添加内边距,以使徽标和法律声明始终可见。

发送以下问题的反馈:

此网页
Google Maps SDK for iOS
Google Maps SDK for iOS
需要帮助?请访问我们的支持页面