借助 Google 地图街景,您可以通过 360 度的街道级别图像探索世界各地。您可以探索世界各地的标志性建筑、观赏自然景观、浏览行程或展示您商家外部的景象。
概览
Google 街景提供整个覆盖区域内以指定道路为中心的 360 度全景视图。通过 SDK 提供的覆盖范围与 iOS 版 Google 地图应用或 https://maps.google.com/
的覆盖范围相同。您可以在关于街景中详细了解街景并查看互动式地图上支持的区域。
Maps SDK for iOS 提供了用于获取和处理 Google 地图街景中使用的图像的街景服务。街景图像以全景图片形式返回,可在街景查看器(一个类型为 GMSPanoramaView
的对象)中查看。
街景全景图片
每张街景全景图片都是一个或一组图片,提供以单个位置为中心的 360 度全景视图。图像符合等距柱状投影 (Plate Carrée) 投影,包含 360 度水平视角(完整环绕)和 180 度垂直视角(直上直下)。生成的 360 度全景图片定义了一个球面投影,其图像包绕在该球面的二维表面上。
街景全景图片可通过 GMSPanoramaView
对象查看。此对象提供了一个查看器,以镜头为中心,将全景图片渲染为一个球面。您可以通过编程方式控制相机的朝向,以及用于自定义查看器的多个属性。
访问街景数据
街景全景图由两种元数据中的一种来标识:
panoramaID
- 街景全景图片的唯一 ID。此
panoramaID
可能会随时间而变化,不适合作为长期或硬编码的参考。panoramaID
最适合用于以编程方式访问不同的街景图像。 coordinate
- 此图像的确切位置,以
CLLocationCoordinate2D
表示。使用coordinate
持久存储全景图片位置,或将地图上的用户操作转换为街景图像。
panoramaID
和 coordinate
均存储为 GMSPanorama
对象的属性。您可以使用 coordinate
或 panoramaID
从 GMSPanoramaService
请求 GMSPanorama
。生成的对象将包含这两种元数据,以及指向附近全景图片的链接数组。
设置全景图片的位置
可根据坐标来设置街景全景图片的位置。
moveNearCoordinate
方法用于请求该坐标附近的全景图片。moveNearCoordinate:radius
方法与此类似,但可让您指定坐标周围的搜索半径(以米为单位)。借助
moveNearCoordinate:source
方法,您可以指定来源。如果您希望限制街景,以便仅查找外部全景图片,就可以使用来源。默认情况下,位置全景图片要么位于室内,要么位于室外。请注意,指定位置可能不存在室外全景图片。借助
moveNearCoordinate:radius:source
方法,您可以同时指定半径和来源。
查看街景图片
添加街景查看器
添加查看器的基本步骤如下:
- (一次性)按照使用入门中的步骤获取 SDK、获取密钥并添加所需的框架。
- 创建或更新
ViewController
。如果要在此视图控制器变为可见时显示全景图片,请务必在loadView
方法中创建全景图片。 - 使用
GMSPanoramaView
initWithFrame:
方法创建并实例化GMSPanoramaView
类。如果将此属性用作视图控制器的唯一视图,则CGRectZero
可用作地图的框架,系统会自动调整地图大小。 - 将
GMSPanoramaView
对象设置为视图控制器的视图,例如self.view = panoView;
。 - 使用
moveNearCoordinate:
等方法设置街景图像的位置。
下面的示例向某个应用添加了一个街景 查看器。
Swift
import GoogleMaps class StreetView: UIViewController { override func loadView() { let panoView = GMSPanoramaView(frame: .zero) self.view = panoView panoView.moveNearCoordinate(CLLocationCoordinate2D(latitude: -33.732, longitude: 150.312)) } }
Objective-C
#import "StreetView.h" @import GoogleMaps; @interface StreetView () @end @implementation StreetView - (void)loadView { GMSPanoramaView *panoView = [[GMSPanoramaView alloc] initWithFrame:CGRectZero]; self.view = panoView; [panoView moveNearCoordinate:CLLocationCoordinate2DMake(-33.732, 150.312)]; } @end
自定义查看器
您可以通过限制可用手势来对查看器进行自定义。默认情况下,平移、缩放和前往相邻全景图片都将启用。各个手势通过 GMSPanoramaView
的属性进行控制。通过这些属性,可以启用或停用由用户控制的手势;停用手势后,仍然可以通过程序化方式进行更改。
orientationGestures
- 用户是否能够通过点按或拖动来调整相机朝向。设置为
NO
可禁止更改相机的方向。 zoomGestures
- 用户是否能够通过双指张合进行缩放。设置为
NO
可停用缩放功能。 navigationGestures
- 用户能否更改可见的全景图片。用户可以通过单次点按导航链接或两次点按视图来更改全景图片。设置为
NO
可停用导航更改功能。
您可以使用 setAllGesturesEnabled:
方法一次启用或停用所有手势。
Swift
panoView.setAllGesturesEnabled(false)
Objective-C
[panoView setAllGesturesEnabled:NO];
通过网址方案启动街景
您可以在 iOS 版 Google 地图应用中查看 Google 街景图像。您可以使用 comgooglemaps
网址架构,在街景模式下启动 iOS 版 Google 地图应用,只需将 mapmode
参数设置为 streetview
即可。下面显示了一个可启动街景的网址示例。如需了解详情,请参阅网址方案文档。
comgooglemaps://?center=46.414382,10.013988&mapmode=streetview
街景位置和视角 (POV)
GMSPanoramaCamera
可让您结合使用方向、倾斜度和缩放级别设置街景相机的视角。
下面这段代码将使摄像头朝南,并且略微向下。
Swift
panoView.camera = GMSPanoramaCamera(heading: 180, pitch: -10, zoom: 1)
Objective-C
panoView.camera = [GMSPanoramaCamera cameraWithHeading:180 pitch:-10 zoom:1];
方向
街景位置会定义图像的相机焦点位置,但不会定义该图像的相机朝向。为此,GMSOrientation
对象会定义以下两个属性:
heading
以相对于正北方的度数定义以相机所在地为中心的旋转角度。方位按顺时针进行测量:正北方为 0,东方为 90,南方为 180,西方为 270。pitch
(默认值为0
),定义与相机初始默认倾斜度的“向上”或“向下”角度差值。相机的初始默认倾斜度通常(但并不总是)为水平。(例如,在山上拍摄的图像可能会呈现出非水平的默认倾斜度。)当相机仰视时,测量出的倾斜角度为正值(最大 +90 度,表示垂直向上,与默认倾斜度正交);当相机俯视时,测量出的倾斜角度为负值(最大 -90 度,表示垂直向下,与默认倾斜度正交)。
放大
街景支持通过缩放实现不同的图像细节级别。您可以通过编程方式设置缩放级别,也可以通过双指张合进行缩放来更改查看器中的缩放级别。
移动镜头
创建 GMSPanoramaView
后,如果它具有已配置或默认的相机,您可以通过多种方式之一来进行更改。更改相机位置时,可以选择以动画方式呈现相机移动的效果。动画会插入当前相机属性和新的相机属性之间。
您可以修改 GMSPanoramaCamera
对象,并在 GMSPanoramaView
的 camera
属性上进行设置。这会在没有动画的情况下将相机贴靠到新的视角。可以创建一个 GMSCameraPosition
来配置方向和缩放的任意组合。
Swift
panoView.camera = GMSPanoramaCamera(heading: 180, pitch: -10, zoom: 1)
Objective-C
panoView.camera = [GMSPanoramaCamera cameraWithHeading:180 pitch:-10 zoom:1];
您可以调用 GMSPanoramaView
的 animateToCamera:animationDuration:
方法,为过渡添加动画效果。另外,您也可以利用Core Animation控制镜头。这是通过 GMSPanoramaLayer
上的 GMSPanoramaView
上的自定义 CALayer
提供的。
街景中的标记
GMSPanoramaView
对象能够显示地图标记。您可以对 GMSMapView
或 GMSPanoramaView
对象使用相同的 GMSMarker
对象,只需设置相应的属性即可:
Swift
// Create a marker at the Eiffel Tower let position = CLLocationCoordinate2D(latitude: 48.858, longitude: 2.294) let marker = GMSMarker(position: position) // Add the marker to a GMSPanoramaView object named panoView marker.panoramaView = panoView // Add the marker to a GMSMapView object named mapView marker.map = mapView
Objective-C
// Create a marker at the Eiffel Tower CLLocationCoordinate2D position = CLLocationCoordinate2DMake(48.858,2.294); GMSMarker *marker = [GMSMarker markerWithPosition:position]; // Add the marker to a GMSPanoramaView object named panoView marker.panoramaView = panoView; // Add the marker to a GMSMapView object named mapView marker.map = mapView;
标记的大小会根据标记位置与 GMSCameraView
位置之间的距离缩放。如果此距离变得太远,标记会变得太小而无法显示,并且将隐藏在视图中。
将 panoramaView
属性设置为 nil
即可将其从 GMSPanoramaView
中移除。
Swift
marker.panoramaView = nil
Objective-C
marker.panoramaView = nil;
活动
您可以监听街景全景图片上发生的事件,例如当用户点按全景图片时。如需监听事件,您必须实现 GMSPanoramaViewDelegate
协议。请参阅总体事件指南以及 GMSPanoramaViewDelegate
中的方法列表。