从坐标数组到表格中的位置之间的距离
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()
【讨论】:
以上是关于从坐标数组到表格中的位置之间的距离的主要内容,如果未能解决你的问题,请参考以下文章