我创建了苹果地图应用程序并使用MKCircle和MKPolyline处理位置映射。
我用过
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
{}
以上地图视图中自定义注释更新的方法。
当注释到达特定时间点时,我可以旋转图像。
我要求将注释移动三个位置从洛杉矶和纽约开始,最后是墨西哥城,所以当注释到达纽约时我想要旋转注释图像。有可能请给我一些说明。
有关详细信息,请参阅以下编码部分。
//
// ViewController.swift
// RouteMap
//
// Created by Suthan M.
// Copyright © 2016 suthan.nimalan.m All rights reserved.
//
import UIKit
import MapKit
extension Double {
/** Converts the specified value in degrees into radians. */
func degrees() -> CGFloat {
return CGFloat(self) * CGFloat(M_PI / 180.0)
}
}
class ViewController: UIViewController,MKMapViewDelegate {
@IBOutlet var mkMapView: MKMapView!
var flightpathPolyline: MKGeodesicPolyline!
var planeAnnotation: MKPointAnnotation!
var planeAnnotationPosition = 0
var planeDirection: CLLocationDirection!
var testValue: MKMapPoint!
var testCount: Int!
var radiusInSomething : CLLocationDistance = 10000000.0
var circle:MKCircle!
override func viewDidAppear(animated: Bool) {
let location = CLLocationCoordinate2D(
latitude: 33.9424955,
longitude: -118.4080684
)
self.mkMapView.setRegion(MKCoordinateRegion(center: location, span: MKCoordinateSpan(latitudeDelta: 95, longitudeDelta: 95)), animated: true)
let LAX = CLLocation(latitude: 33.9424955, longitude: -118.4080684)
let JFK = CLLocation(latitude: 40.6397511, longitude: -73.7789256)
let WAS = CLLocation(latitude: 19.432608, longitude: -99.133209)
let mexicoCityLoc = CLLocationCoordinate2D(latitude: 19.4284700, longitude: -99.1276600)
mkMapView.addOverlay(MKCircle(centerCoordinate: mexicoCityLoc,
radius: radiusInSomething * MKMetersPerMapPointAtLatitude(mexicoCityLoc.latitude)))
var coordinates = [LAX.coordinate, JFK.coordinate, WAS.coordinate]
flightpathPolyline = MKGeodesicPolyline(coordinates: &coordinates, count: 3)
mkMapView.addOverlay(flightpathPolyline)
let coordin = CLLocationCoordinate2D(latitude: 19.4284700, longitude: -99.1276600)
circle = MKCircle(centerCoordinate: coordin, radius: 2000)
mkMapView.addOverlay(circle)
let annotation = MKPointAnnotation()
annotation.title = NSLocalizedString("Plane", comment: "Plane marker")
mkMapView.addAnnotation(annotation)
self.planeAnnotation = annotation
self.updatePlanePosition()
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Work with MKMapview
self.planeDirection = 360.0
testCount = 0
mkMapView.delegate = self
mkMapView.mapType = MKMapType.Standard
mkMapView.showsUserLocation = true
}
func mapView(mapView: MKMapView, rendererForOverlay overlay: MKOverlay) -> MKOverlayRenderer {
if overlay is MKPolyline {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.lineWidth = 3.0
renderer.alpha = 0.5
renderer.strokeColor = UIColor.blueColor()
return renderer
}else if overlay is MKCircle {
let circleRenderer = MKCircleRenderer(overlay: overlay)
circleRenderer.fillColor = UIColor.blueColor().colorWithAlphaComponent(0.1)
circleRenderer.strokeColor = UIColor.blueColor()
circleRenderer.lineWidth = 1
return circleRenderer
}
return MKOverlayRenderer()
}
func updatePlanePosition() {
let step = 5
guard planeAnnotationPosition + step < flightpathPolyline.pointCount
else { return }
let points = flightpathPolyline.points()
self.planeAnnotationPosition += step
let nextMapPoint = points[planeAnnotationPosition]
self.planeAnnotation.coordinate = MKCoordinateForMapPoint(nextMapPoint)
let previousMapPoint = points[planeAnnotationPosition]
planeAnnotationPosition += step
self.planeDirection = directionBetweenPoints(previousMapPoint, nextMapPoint)
// set turn point of plane
if(testValue.x == 79197107.0566392){
testCount = 1
planeDirection = 360.0
self .mapView(mkMapView, viewForAnnotation: planeAnnotation )
}
performSelector("updatePlanePosition", withObject: nil, afterDelay: 0.03)
}
private func directionBetweenPoints(sourcePoint: MKMapPoint, _ destinationPoint: MKMapPoint) -> CLLocationDirection {
//print(sourcePoint)
//MKMapPoint(x: 74074213.8054451, y: 105154930.159039)
//MKMapPoint(x: 74074213.8054451, y: 105154930.159039)
testValue = sourcePoint
let x = destinationPoint.x - sourcePoint.x
let y = destinationPoint.y - sourcePoint.y
return radiansToDegrees(atan2(y, x)) % 360 + 90
}
private func radiansToDegrees(radians: Double) -> Double {
return radians * 180 / M_PI
}
private func degreesToRadians(degrees: Double) -> Double {
return degrees * M_PI / 180
}
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
let planeIdentifier = "Plane"
let annotationView = mapView.dequeueReusableAnnotationViewWithIdentifier(planeIdentifier)
?? MKAnnotationView(annotation: annotation, reuseIdentifier: planeIdentifier)
annotationView.image = UIImage(named: "pointer")
if(testCount == 1){
let angle = CGFloat(self.degreesToRadians(self.planeDirection))
annotationView.transform = CGAffineTransformRotate(mapView.transform, angle)
}
else{
let angle = CGFloat(degreesToRadians(planeDirection))
annotationView.transform = CGAffineTransformRotate(mapView.transform, angle)
}
return annotationView
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
感谢。
答案 0 :(得分:1)
在我的情况下,我得到了目的地的标题(角度)。所以我在我的项目中做的就像漫游图像而不是注释视图。
// viewForAnnotation方法
public StreamingResponseBody stream(HttpServletRequest req)
throws FileNotFoundException {
File file = new File(req.getRealPath("/")+"js/loginPage/usermanual.pdf");
InputStream is = new FileInputStream(file);
return (os) -> {
IOUtils.copy(is, os);
};
}
我添加了一个扩展程序。https://ruigomes.me/blog/how-to-rotate-an-uiimage-using-swift/
annotationView.image = UIImage(named: "pointer")?.imageRotatedByDegrees(CGFloat(angle), flip: false)