借助 Google 地图街景,您可以通过街道级 360 度图像探索世界各地。您可以探索世界地标、观看自然奇观、导航旅行或展示商家的外观。
概览
Google 街景提供整个覆盖区域内以指定道路为中心的 360 度全景视图。通过该 SDK 提供的覆盖范围与 Google 地图 iOS 应用或 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
方法会请求附近坐标的 360 度全景图。moveNearCoordinate:radius
方法类似,但允许您指定坐标周围的搜索半径(以米为单位)。借助
moveNearCoordinate:source
方法,您可以指定来源。如果您想限制 Google 街景仅查找室外全景图,则来源非常有用。默认情况下,地点的全景图是室内或室外。请注意,指定地点可能没有室外全景图像。借助
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 街景图像。您可以通过将 mapmode
参数设置为 streetview
,使用 comgooglemaps
网址格式在街景模式下启动 Google 地图 iOS 应用。下面显示了用于启动街景的网址示例。如需了解详情,请参阅网址架构文档。
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控制镜头。这通过 GMSPanoramaView
上的自定义 CALayer
提供,GMSPanoramaLayer
。
街景中的标记
GMSPanoramaView
对象能够显示地图标记。您可以通过设置 GMSMapView
或 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
上的方法列表。