我有这个功能,可以找到一些预先确定的位置到当前位置的最近位置。我得到了价值,但我想要的是名字。在这个例子中,它将是“Larkspur”
let lat = 37.941053
let long = -122.483915
let locationLarkspur = CLLocation(latitude: 37.944804, longitude: -122.509066)
let locationSaulsalito = CLLocation(latitude: 37.856315, longitude: -122.478723)
let locationSanFrancisco = CLLocation(latitude: 37.795346, longitude: -122.392711)
let locationFishermans = CLLocation(latitude: 37.809166, longitude: -122.412012)
let locationGiants = CLLocation(latitude: 37.778304, longitude: -122.387754)
let locationTiburon = CLLocation(latitude: 37.872928, longitude: -122.455806)
let locationVallejo = CLLocation(latitude: 38.100116, longitude: -122.262378)
let locationAlameda = CLLocation(latitude: 37.790633, longitude: -122.293910)
let locationHarborBay = CLLocation(latitude: 37.736799, longitude: -122.256810)
let locationJackLondon = CLLocation(latitude: 37.795287, longitude: -122.279601)
let locationSouthSF = CLLocation(latitude: 37.662428, longitude: -122.377791)
let locationCurrent = CLLocation(latitude: lat, longitude: long)
print(long)
let Larkspur = locationCurrent.distanceFromLocation(locationLarkspur)
let Saulsalito = locationCurrent.distanceFromLocation(locationSaulsalito)
let SanFrancisco = locationCurrent.distanceFromLocation(locationSanFrancisco)
let Fishermans = locationCurrent.distanceFromLocation(locationFishermans)
let Giants = locationCurrent.distanceFromLocation(locationGiants)
let Tiburon = locationCurrent.distanceFromLocation(locationTiburon)
let Vallejo = locationCurrent.distanceFromLocation(locationVallejo)
let Alameda = locationCurrent.distanceFromLocation(locationAlameda)
let HarborBay = locationCurrent.distanceFromLocation(locationHarborBay)
let JackLondon = locationCurrent.distanceFromLocation(locationJackLondon)
let SouthSF = locationCurrent.distanceFromLocation(locationSouthSF)
let numbers = [Larkspur, Saulsalito, SanFrancisco, Fishermans, Giants, Tiburon, Vallejo, Alameda, HarborBay, JackLondon, SouthSF]
numbers.minElement()
numbers.maxElement()
let closest = numbers.minElement()
print(closest)
答案 0 :(得分:1)
这基本上是gfpacheco
的答案的延伸。
代码是面向功能编程的。
Key
是该位置的名称(String
)Value
是该位置的位置(CLLocation
)let coordinates = [
"Larkspur": CLLocation(latitude: 37.944804, longitude: -122.509066),
"Saulsalito": CLLocation(latitude: 37.856315, longitude: -122.478723),
"SanFrancisco": CLLocation(latitude: 37.795346, longitude: -122.392711),
"Fishermans": CLLocation(latitude: 37.809166, longitude: -122.412012),
"Giants": CLLocation(latitude: 37.778304, longitude: -122.387754),
"Tiburon": CLLocation(latitude: 37.872928, longitude: -122.455806),
"Vallejo": CLLocation(latitude: 38.100116, longitude: -122.262378),
"Alameda": CLLocation(latitude: 37.790633, longitude: -122.293910),
"HarborBay": CLLocation(latitude: 37.736799, longitude: -122.256810),
"JackLondon": CLLocation(latitude: 37.795287, longitude: -122.279601),
"SouthSF": CLLocation(latitude: 37.662428, longitude: -122.377791)
]
let here = CLLocation(latitude: 12.3, longitude: 12.3)
let distances = coordinates.enumerate().reduce([String:CLLocationDistance]()) { (var accumulator, elm) -> [String:CLLocationDistance] in
accumulator[elm.element.0] = elm.element.1.distanceFromLocation(here)
return accumulator
}
let closest = distances.minElement { $0.1 < $1.1}?.0
现在closest
确实包含最近位置的名称。
答案 1 :(得分:1)
这里使用自定义结构保存位置信息略有不同:
import CoreLocation
// Create a custom structure to hold place names, latitude, and longitude
struct Location {
var name: String
var latitude: Double
var longitude: Double
}
let lat = 37.941053
let long = -122.483915
let locations: [Location] = [
Location(name: "Larkspur", latitude: 37.944804, longitude: -122.509066),
Location(name: "Saulsalito", latitude: 37.856315, longitude: -122.478723),
Location(name: "SanFrancisco", latitude: 37.795346, longitude: -122.392711),
Location(name: "Fishermans", latitude: 37.809166, longitude: -122.412012),
Location(name: "Giants", latitude: 37.778304, longitude: -122.387754),
Location(name: "Tiburon", latitude: 37.872928, longitude: -122.455806),
Location(name: "Vallejo", latitude: 38.100116, longitude: -122.262378),
Location(name: "Alameda", latitude: 37.790633, longitude: -122.293910),
Location(name: "HarborBay", latitude: 37.736799, longitude: -122.256810),
Location(name: "JackLondon", latitude: 37.795287, longitude: -122.279601),
Location(name: "SouthSF", latitude: 37.662428, longitude: -122.377791)
]
let currentLocation = CLLocation(latitude: lat, longitude: long)
// Use map to create an array of named tuple pairs with distance and location name
let distances:[(distance: Double, name: String)] = locations.map { (CLLocation(latitude: $0.latitude, longitude: $0.longitude).distanceFromLocation(currentLocation), $0.name) }
let closest = distances.minElement {$0.distance < $1.distance}!
print("Closest location is \(closest.name) at a distance of \(closest.distance)")
答案 2 :(得分:0)
你应该有一个dict [String:CLLocationDistance]
而不是一个数组,这样你就可以获得字符串值和距离:
let distances = [
"Larkspur": locationCurrent.distanceFromLocation(locationLarkspur)
// ...
]
您必须重写代码才能找到最小距离,但它会为您提供所需的内容。