【问题标题】:How to calculate the distance between my current location and other Pins in MapView如何计算我当前位置与 MapView 中其他引脚之间的距离
【发布时间】:2016-12-22 00:11:33
【问题描述】:

我是 Swift 新手,我需要计算我当前位置附近的最近地点。你能告诉我我应该使用哪个函数来计算我的位置和我周围最近的位置之间的距离。我必须在应用程序中显示距离和地点,以便用户选择最适合他的。我认为我应该使用可以与我的比较的经纬度坐标。我还发现我必须使用 distanceFromLocation ,但我不知道如何使用,如果有人为我提供一个可用于我的代码的示例,我会很高兴。 到目前为止我的代码是:

 class ViewThree: UIViewController, CLLocationManagerDelegate{
@IBOutlet weak var SegmentControl: UISegmentedControl!
@IBOutlet weak var Mapview: MKMapView!


var manager =  CLLocationManager()
var receiveImeNaSladkarnica: String = ""
var KordaA: String = ""
var KordaB: String = ""
var PodImeNaObekt: String = ""

  override func viewDidLoad() {
super.viewDidLoad()


    let pinLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake((KordaA as NSString).doubleValue,(KordaB as NSString).doubleValue)
    let objectAnn = MKPointAnnotation()
    objectAnn.coordinate = pinLocation
    objectAnn.title = receiveImeNaSladkarnica
    objectAnn.subtitle = PodImeNaObekt
    self.Mapview.addAnnotation(objectAnn)

 }

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func Directions(sender: AnyObject) {
    UIApplication.sharedApplication().openURL(NSURL(string: "http://maps.apple.com/maps?daddr=\((KordaA as NSString).doubleValue),\((KordaB as NSString).doubleValue))")!)



}

@IBAction func MapType(sender: AnyObject) {
    if (SegmentControl.selectedSegmentIndex == 0){
        Mapview.mapType = MKMapType.Standard
    }
    if (SegmentControl.selectedSegmentIndex == 1){
        Mapview.mapType = MKMapType.Satellite
    }


}

@IBAction func LocateMe(sender: AnyObject) {
    manager.delegate = self
    manager.desiredAccuracy = kCLLocationAccuracyBest
    manager.requestWhenInUseAuthorization()
    manager.startUpdatingLocation()

    Mapview.showsUserLocation = true



}
func  locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userlocation: CLLocation = locations[0] as CLLocation
    manager.stopUpdatingLocation()
    let location = CLLocationCoordinate2D(latitude: userlocation.coordinate.latitude, longitude: userlocation.coordinate.longitude)
    let span = MKCoordinateSpanMake(0.5, 0.5)
    let region = MKCoordinateRegion(center: location, span: span)
    Mapview.setRegion(region, animated: true )
}

【问题讨论】:

    标签: ios mkmapview distance


    【解决方案1】:

    您可以使用distanceFromLocation方法获取距离

    let distance = userlocation.distanceFromLocation(YourPinInMap)
    

    【讨论】:

    • 非常感谢它完美运行。你知道我如何比较多个位置吗,因为在我们的例子中,现在我只能将我的位置与位置 B 进行比较,但我也想检查位置 C、D、E 等......并显示所有位于距离我 5 公里(仅示例)。
    【解决方案2】:

    我在其他应用中遇到了同样的情况。

    CLLocation对象中,有一个实例函数:

    func distanceFromLocation(location: CLLocation) -> CLLocationDistance

    //Get your two locations that you want to calculate the distance from:
    
    let userLocation: CLLocation = ...
    let locationToCompare: CLLocation = ...
    
    // Returned value is in meters
    let distanceMeters = userLocation.distanceFromLocation(locationToCompare)
    
    // If you want to round it to kilometers
    let distanceKilometers = distanceMeters / 1000.00
    
    // Display it in kilometers
    let roundedDistanceKilometers = String(Double(round(100 * distanceKilometers) / 100)) + " km"
    

    更新

    适合您的用例

    let locations = ... // All locations you want to compare
    
    for location in locations {
    
        let distanceMeters = userLocation.distanceFromLocation(location)
    
        if distanceMeters > 5000 { // Some distance filter
              // Don't display this location
        } else {
              // Display this location
        }
    
    }
    

    我的代码: 改进

        func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    
        let userlocation:CLLocation = locations[0] as CLLocation
    
        manager.stopUpdatingLocation()
    
        let location = CLLocationCoordinate2D(latitude: userlocation.coordinate.latitude, longitude: userlocation.coordinate.longitude)
    
        let span = MKCoordinateSpanMake(0.5, 0.5)
    
        let region = MKCoordinateRegion(center: location, span: span)
    
        Mapview.setRegion(region, animated: true)
    
        let locationStrings = ["42.6977,23.3219","43.6977,24.3219"]
    
        // This array must be an array that contains CLLocation objects        
        var locations: [CLLocation] = []
    
        // We must retrieve the latitude and longitude from locationStrings array to convert them into CLLocation objects
        for locationString in locationStrings {
    
            let location = CLLocation(latitude: <latitude_value>, longitude: <latitude_value>)
    
            locations.append(location)
    
        }
    
        // Then you will be able to enumerate through the array
        for location in locations {
    
            let distanceMeters = userLocation.distanceFromLocation(location)
    
            if distanceMeters > 5000 { // Some distance filter
                // Don't display this location
            } else {
                // Display this location
            }
    
        }
    

    【讨论】:

    • 非常感谢它完美运行。你知道我如何比较多个位置吗,因为在我们的例子中,现在我只能将我的位置与位置 B 进行比较,但我也想检查位置 C、D、E 等......并显示所有位于距离我 5 公里(仅示例)。
    • 没有问题!对于该用例,您需要将要比较的位置保存在一个数组中,然后使用 for 循环迭代该数组,并将每个位置与用户位置进行比较。使用 if 语句检查计算的距离是否大于您要过滤的距离。 检查更新的答案
    • 你能复习一下吗?我收到一个错误。另外,如何在数组中添加坐标: ["42.6977,23.3219","43.6977,24.3219"] 或?
    【解决方案3】:
      locA = [[CLLocation alloc] initWithLatitude:[[[NSUserDefaults standardUserDefaults]valueForKey:@"startLat"]floatValue] longitude:[[[NSUserDefaults standardUserDefaults]valueForKey:@"startlong"]floatValue]];
    
    
     locB = [[CLLocation alloc] initWithLatitude:[[[NSUserDefaults standardUserDefaults]valueForKey:@"destLat"]floatValue]  longitude:[[[NSUserDefaults standardUserDefaults]valueForKey:@"destLong"]floatValue]];
    
    
    distance = [locA distanceFromLocation:locB];
    

    其中 locA 和 locB 是 CLLocation 类型在那边传递 lat long

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-20
      • 2013-06-02
      • 2017-04-20
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 1970-01-01
      相关资源
      最近更新 更多