11

ここに投稿された質問で、ユーザーは次のように尋ねました。

経度と緯度でいっぱいの配列があります。ユーザーの場所に2つの二重変数があります。ユーザーの位置間の距離を配列に対してテストして、どの位置が最も近いかを確認したいと思います。どうすればいいですか?

これは2つの場所の間の距離を取得しますが、場所の配列に対してどのようにテストするかを理解するのに苦労しています。

応答として、彼は次のコードを受け取りました。

NSArray *locations = //your array of CLLocation objects
CLLocation *currentLocation = //current device Location

CLLocation *closestLocation;
CLLocationDistance smallestDistance = DBL_MAX; // set the max value

for (CLLocation *location in locations) {
    CLLocationDistance distance = [currentLocation  distanceFromLocation:location];

    if (distance < smallestDistance) {
        smallestDistance = distance;
        closestLocation = location;
    }
}
NSLog(@"smallestDistance = %f", smallestDistance);

私が取り組んでいるアプリケーションでもまったく同じ問題があり、このコードは完全に機能すると思います。ただし、私は Swift を使用しており、このコードは Objective-C です。

私の唯一の質問は、Swift でどのように見えるべきかということです。

助けてくれてありがとう。私はこれらすべてに慣れていないので、Swift でこのコードを見ると、大きな一歩を踏み出すことができます。

4

3 に答える 3

25

Swift 3では、この小さな「機能」コードを作成しました。

let coord1 = CLLocation(latitude: 52.12345, longitude: 13.54321)
let coord2 = CLLocation(latitude: 52.45678, longitude: 13.98765)
let coord3 = CLLocation(latitude: 53.45678, longitude: 13.54455)

let coordinates = [coord1, coord2, coord3]

let userLocation = CLLocation(latitude: 52.23678, longitude: 13.55555)

let closest = coordinates.min(by: 
{ $0.distance(from: userLocation) < $1.distance(from: userLocation) })
于 2016-11-23T20:12:39.353 に答える
21
var closestLocation: CLLocation?
var smallestDistance: CLLocationDistance?

for location in locations {
  let distance = currentLocation.distanceFromLocation(location)
  if smallestDistance == nil || distance < smallestDistance {
    closestLocation = location
    smallestDistance = distance
  }
}

print("smallestDistance = \(smallestDistance)")

または関数として:

func locationInLocations(locations: [CLLocation], closestToLocation location: CLLocation) -> CLLocation? {
  if locations.count == 0 {
    return nil
  }

  var closestLocation: CLLocation?
  var smallestDistance: CLLocationDistance?

  for location in locations {
    let distance = location.distanceFromLocation(location)
    if smallestDistance == nil || distance < smallestDistance {
      closestLocation = location
      smallestDistance = distance
    }
  }

  print("closestLocation: \(closestLocation), distance: \(smallestDistance)")
  return closestLocation
}
于 2015-11-25T22:30:23.477 に答える
0
    func closestLoc(userLocation:CLLocation){
    var distances = [CLLocationDistance]()
    for location in locations{
        let coord = CLLocation(latitude: location.latitude!, longitude: location.longitude!)
        distances.append(coord.distance(from: userLocation))
        print("distance = \(coord.distance(from: userLocation))")
    }

    let closest = distances.min()//shortest distance
    let position = distances.index(of: closest!)//index of shortest distance
    print("closest = \(closest!), index = \(position)")
}
于 2018-04-23T09:22:02.113 に答える