从坐标数组到表格中的位置之间的距离

Posted

技术标签:

【中文标题】从坐标数组到表格中的位置之间的距离【英文标题】:Distance between locations from an Array of coordinates into a table 【发布时间】:2016-05-24 20:22:03 【问题描述】:

我试图用行来填充表格,这些行显示从坐标数组到用户当前位置的位置的距离。我有一个空数组中的坐标,我有用户的位置。

我坚持将坐标数组放入一个计算距离的函数中,然后将每个距离值放入表格行中的标签中。非常感谢任何见解。

var locationArray: [CLLocationCoordinate2D] = []
var shopperLocation = String()
var distanceText: [String] = []

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    let userLocation:CLLocation = locations[0]

    shopperLocation = userLocation

    self.manager.stopUpdatingLocation()


//This is the function I am trying to use to get distance from the array of coordinates //

func distanceToLocation()

    if locationArray == nil 

        locationArray = userLocation
    

    let distanceBetween: CLLocationDistance =   shopperLocation.distanceFromLocation(startLocation) / 1609.34

    let distanceInMilesFromUser = String(format: "%.2f", distanceBetween)

    distanceText = "\(distanceInMilesFromUser) mi"
   

  // Here I am trying to get the distance values in the correct rows //

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! listViewCell

    cell.myDistance.text = distanceText[indexPath.row]

    return cell

【问题讨论】:

@ZGski 我得到的两点之间的距离。我的问题涉及一组坐标并在表格中填充。 @ZGski 您的“可能重复”没有提到我在这里问的内容。它与数组无关,与填充表格无关...... 那你需要更具体一些。遍历数组肯定不是你的问题?!​​ 【参考方案1】:

这是因为您必须明确告诉表格视图重新加载数据,即再次要求其TableViewDataSource 为每个单元格配置新数据。

您可以通过在您的CLLocationManager 的委托方法中调用tableView.reloadData() 轻松地做到这一点。下面的代码是实现这一目标的一种方法。顺便说一句:

我发现使用var myArray = [Type]() 初始化数组比提供显式类型然后分配一个空数组更优雅

您最好将商店参数(名称、坐标等)保存在结构中

跟踪当前用户位置而不是距离;这样做可以让您轻松添加新商店,而无需再次请求用户位置

使用MKDistanceFormatter 为您的距离获得良好的人类可读文本输出 - 这非常强大,可以免费适应您用户的区域设置和首选单位系统!

不要忘记导入所有必需的模块:

import UIKit
import CoreLocation
import MapKit

定义你的常量:

let locationCellIdentifier = "LocationCell"

和你的结构:

struct Shop 
    let name: String
    let coordinates: CLLocation

然后是你的视图控制器:

final class LocationTableView: UITableViewController, CLLocationManagerDelegate 
    
    var shops = [Shop]()
    var userLocation: CLLocation?
    let distanceFormatter = MKDistanceFormatter()
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        
        // Save the location and reloads table view
        if !locations.isEmpty 
            userLocation = locations.first
            manager.stopUpdatingLocation()
            tableView.reloadData()
        
    
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return shops.count
    
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCellWithIdentifier(locationCellIdentifier, forIndexPath: indexPath)
        
        // Configure the cell
        let shop = shops[indexPath.row]
        cell.textLabel?.text = shop.name
        
        if let userLocation = userLocation 
            let distance = shop.coordinates.distanceFromLocation(userLocation)
            let formattedDistance = distanceFormatter.stringFromDistance(distance)
            cell.detailTextLabel?.text = formattedDistance
         else 
            cell.detailTextLabel?.text = nil
        
        
        return cell
    

【讨论】:

很好的例子。非常感谢!【参考方案2】:

现在这看起来有点粗略,所以我将尝试根据您正在尝试做的事情以及您似乎遇到的问题给出一个大纲。

首先你有一个 locationArray,但它是空的,我假设你会以某种方式填充它。

您还有一个 distanceText 数组,所以这里有一个建议的方法。 (并且这些都没有经过测试或验证,因此更多地将其视为伪代码)。

您的位置更新时

    获取最后一个位置(最近的) 将当前位置数组映射到新的 distanceText 数组。

    要求 tableView 重新加载它的数据。

    var locationArray: [CLLocationCoordinate2D] = [] 
    var distanceText: [String] = []
    
    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
        let userLocation = locations.last
        distanceText = locationArray.map  location in 
            // add your code to calculated the distance and return it
            let distanceAsText = .......  // some function of location and userLocation
            return distanceAsText
        
        tableView?.reloadData()        
    
    

【讨论】:

以上是关于从坐标数组到表格中的位置之间的距离的主要内容,如果未能解决你的问题,请参考以下文章

在excel图表中怎么设置网格线之间的距离啊 ?

在给定距离处查找彼此远离的表格中的坐标

AngularJS获取多个坐标之间的距离

使用 Google Maps API 查找两个位置之间的路线和距离并将其呈现在表格中

请教excel的坐标距离计算公式。

Swift如何按距离对表格视图进行排序