用箭头替换 GMSMapView 中的蓝点 - Swift
Replace blue dot in GMSMapView by an arrow - Swift
我将 Google SDK 用于应用程序 iOS8 (Swift)。
我想用箭头替换 GMSMapView 中的蓝点(我的位置) 根据智能手机的方向旋转。
我该怎么做?
编辑:
我设法看到了我的箭头,但我遇到了三个问题:
1 : 箭头被切断了,我没有发现扩大面积
2 : 箭头的位置不在我的位置我通过删除“0,5”来解决这个问题:
CGContextTranslateCTM(context, size.width, size.height)
3 : 箭头的方向与原来对称 我解决这个问题的方法是在 "degrees" 前加上“-” :
CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(-degrees))))
如何解决这些问题?
如果您正在使用 Google Maps iOS SDK,似乎有 no way to replace 默认用户位置图标。但是默认图标已经有一个箭头指示用户前进的方向(只需调用 mapView.myLocationEnabled = true
)。
解决方法是在用户当前位置放置一个标记,并根据航向更改标记图像。
示例代码(the full source code):
func RadiansToDegrees(radians: Double) -> Double {
return radians * 180.0/M_PI
}
func DegreesToRadians(degrees: Double) -> Double {
return degrees * M_PI / 180.0
}
var GeoAngle = 0.0
var locationManager = CLLocationManager()
var marker = GMSMarker()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var camera = GMSCameraPosition.cameraWithLatitude(-33.86,
longitude: 151.20, zoom: 6)
var mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
self.view = mapView
marker.map = mapView
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
}
func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
var camera = GMSCameraPosition.cameraWithLatitude(newLocation.coordinate.latitude,
longitude: newLocation.coordinate.longitude, zoom: 15)
(self.view as GMSMapView).animateToCameraPosition(camera)
GeoAngle = self.setLatLonForDistanceAndAngle(newLocation)
marker.position = newLocation.coordinate
}
func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!) {
var direction = -newHeading.trueHeading as Double
marker.icon = self.imageRotatedByDegrees(CGFloat(direction), image: UIImage(named: "arrow.png")!)
}
func imageRotatedByDegrees(degrees: CGFloat, image: UIImage) -> UIImage{
var size = image.size
UIGraphicsBeginImageContext(size)
var context = UIGraphicsGetCurrentContext()
CGContextTranslateCTM(context, 0.5*size.width, 0.5*size.height)
CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(degrees))))
image.drawInRect(CGRect(origin: CGPoint(x: -size.width*0.5, y: -size.height*0.5), size: size))
var newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
func setLatLonForDistanceAndAngle(userLocation: CLLocation) -> Double {
var lat1 = DegreesToRadians(userLocation.coordinate.latitude)
var lon1 = DegreesToRadians(userLocation.coordinate.longitude)
var lat2 = DegreesToRadians(37.7833);
var lon2 = DegreesToRadians(-122.4167);
var dLon = lon2 - lon1;
var y = sin(dLon) * cos(lat2);
var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
var radiansBearing = atan2(y, x);
if(radiansBearing < 0.0)
{
radiansBearing += 2*M_PI;
}
return radiansBearing;
}
关键步骤是根据func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!)
方法的度数改变图像。
您还需要确保在 info.plist
文件中添加 NSLocationAlwaysUsageDescription
和 NSLocationWhenInUseUsageDescription
。
iOS中Google张地图的默认蓝色图标可以通过设置
隐藏
mapView.myLocationEnabled = FALSE;
我将 Google SDK 用于应用程序 iOS8 (Swift)。 我想用箭头替换 GMSMapView 中的蓝点(我的位置) 根据智能手机的方向旋转。 我该怎么做?
编辑:
我设法看到了我的箭头,但我遇到了三个问题:
1 : 箭头被切断了,我没有发现扩大面积
2 : 箭头的位置不在我的位置我通过删除“0,5”来解决这个问题:
CGContextTranslateCTM(context, size.width, size.height)
3 : 箭头的方向与原来对称 我解决这个问题的方法是在 "degrees" 前加上“-” :
CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(-degrees))))
如何解决这些问题?
如果您正在使用 Google Maps iOS SDK,似乎有 no way to replace 默认用户位置图标。但是默认图标已经有一个箭头指示用户前进的方向(只需调用 mapView.myLocationEnabled = true
)。
解决方法是在用户当前位置放置一个标记,并根据航向更改标记图像。
示例代码(the full source code):
func RadiansToDegrees(radians: Double) -> Double {
return radians * 180.0/M_PI
}
func DegreesToRadians(degrees: Double) -> Double {
return degrees * M_PI / 180.0
}
var GeoAngle = 0.0
var locationManager = CLLocationManager()
var marker = GMSMarker()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var camera = GMSCameraPosition.cameraWithLatitude(-33.86,
longitude: 151.20, zoom: 6)
var mapView = GMSMapView.mapWithFrame(CGRectZero, camera: camera)
self.view = mapView
marker.map = mapView
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
locationManager.startUpdatingHeading()
}
func locationManager(manager: CLLocationManager!, didUpdateToLocation newLocation: CLLocation!, fromLocation oldLocation: CLLocation!) {
var camera = GMSCameraPosition.cameraWithLatitude(newLocation.coordinate.latitude,
longitude: newLocation.coordinate.longitude, zoom: 15)
(self.view as GMSMapView).animateToCameraPosition(camera)
GeoAngle = self.setLatLonForDistanceAndAngle(newLocation)
marker.position = newLocation.coordinate
}
func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!) {
var direction = -newHeading.trueHeading as Double
marker.icon = self.imageRotatedByDegrees(CGFloat(direction), image: UIImage(named: "arrow.png")!)
}
func imageRotatedByDegrees(degrees: CGFloat, image: UIImage) -> UIImage{
var size = image.size
UIGraphicsBeginImageContext(size)
var context = UIGraphicsGetCurrentContext()
CGContextTranslateCTM(context, 0.5*size.width, 0.5*size.height)
CGContextRotateCTM(context, CGFloat(DegreesToRadians(Double(degrees))))
image.drawInRect(CGRect(origin: CGPoint(x: -size.width*0.5, y: -size.height*0.5), size: size))
var newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage
}
func setLatLonForDistanceAndAngle(userLocation: CLLocation) -> Double {
var lat1 = DegreesToRadians(userLocation.coordinate.latitude)
var lon1 = DegreesToRadians(userLocation.coordinate.longitude)
var lat2 = DegreesToRadians(37.7833);
var lon2 = DegreesToRadians(-122.4167);
var dLon = lon2 - lon1;
var y = sin(dLon) * cos(lat2);
var x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
var radiansBearing = atan2(y, x);
if(radiansBearing < 0.0)
{
radiansBearing += 2*M_PI;
}
return radiansBearing;
}
关键步骤是根据func locationManager(manager: CLLocationManager!, didUpdateHeading newHeading: CLHeading!)
方法的度数改变图像。
您还需要确保在 info.plist
文件中添加 NSLocationAlwaysUsageDescription
和 NSLocationWhenInUseUsageDescription
。
iOS中Google张地图的默认蓝色图标可以通过设置
隐藏mapView.myLocationEnabled = FALSE;