2

特定の場所の天気検索を使用してiPhoneアプリを作成していますが、次の問題があり、最善の方法がわかりません。

場所の緯度と経度があり、5000以上の場所のリストから最も近い緯度/経度の一致を見つけたい

5000以上の場所は、Met Office Datapoint APIからのJSONフィードから取得され、NSDictionariesのNSArrayの形式であり、NSDictionaryにはid、lat、long、およびnameが含まれます。

自分の場所をMetOfficeのリストから最も近い場所に一致させ、idキーの値を取得したいと思います。

よろしくお願いします

4

3 に答える 3

3

これでCLLocationオブジェクトを使用していると仮定しています...

- (CLLocation*)closestLocationToLocation:(CLLocation*)currLocation
{
    CLLocationDistance minDistance;

    CLLocation *closestLocation = nil;

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

        if (distance <= minDistance
            || closestLocation == nil) {
            minDistance = distance;
            closestLocation = location;
        }
    }

    //closestLocation is now the location from your array which is closest to the current location or nil if there are no locations in your array.

    return closestLocation;

}

これを行うより速い方法があるかもしれませんが、これはそれを成し遂げます。

CLLocation関数を使用するように編集

于 2013-02-06T11:28:12.450 に答える
0

私は一度同様のことを行い(最大半径のポイントを囲むすべての緯度/経度オブジェクトを検索)、次の式を使用しました: http ://www.movable-type.co.uk/scripts/latlong.html ただし、それはかなり時間がかかりました。だから私はオブジェクトの拳を「箱詰め」した。上記の計算に基づいて(もちろん元に戻しました)、正確に最大距離を持つ北、西、南、東の座標の緯度と経度を計算しました。ホースの最大値と最小値(latとlonの場合)を使用して、問題のすべてのオブジェクトを照会しました。そして、それらについてのみ、正確な距離を計算し、結果のリストに含めるか、除外しました。

ただし、これまでのところ、それはあなたの問題と完全には一致していません。しかし、私は計算をさらに高速化しようとしました。そのため、私は自分自身に、検索されたオブジェクトから私のものまでの正確な距離は必要ないが、それがボックスの座標の1つよりも近いかどうかを知るのは難しいと言いました。そして、その部分はあなたの質問によく対応する部分です:

あなたのケースははるかに簡単かもしれません。問題の場所(最短の場所)が、割り当てようとしている1つの場所に近いと仮定すると、この複雑な計算のすべてが役割を果たさない可能性があります。正確な距離は必要ありません。必要なのは最も快適なものです。そのために、私は地球が平らであり、経度(または緯度)間の距離が線形であると仮定します。もちろんそれは真実ではありませんが、どれが最も近いかを理解するのに十分なはずです。そこから行くと、ピタゴラスを使うことができます。

Distance = sqrt(sqr(difference-in-lat) + sqr(difference-in-lon));

距離を比較して最短距離を見つけるという単なる目的のために、時間のかかる正方形のルートをはるかに高速な正方形の操作に置き換えることもできます。

Square-Of-Distance = sqr(difference-in-lat) + sqr(difference-in-lon).

次に、距離ではなく、さまざまな距離の二乗を比較します。結果は同じですが、はるかに高速になります。

ところで、それはPHPプロジェクトでした。そのため、サンプルコードを提供することはできず、アルゴリムについて説明するだけです。

于 2013-02-06T11:34:32.903 に答える
-1

私はこのようなものを提案します:

NSMutableArray *tempArray = [NSMutableArray new];
for (NSMutableDictionary *location in yourArrayOfLocations){
    CLLocation coord;
    coord.latitude = [location objectForKey:@"latitude"];
    coord.longitude = [location objectForKey:@"longitude"];

    [location setValue:[usersLocation distanceFromLocation:coord] forKey:@"distance"];
    [tempArray addObject:location];
}
// Now sort the array 
NSArray *sortedArray = [tempArray sortedArrayUsingComparator:^(id o1, id o2) {
            NSDictionary *location1 = (NSDictionary *)o1;
            NSDictionary *location2 = (NSDictionary *)o2;

            return [[location1 objectForKey:@"distance"] compare:[location2 objectForKey:@"distance"]];
        }];
[tempArray release];

これで、距離順に並べられた配列ができました。オブジェクトはユーザーの位置に最も近いため、インデックス0で使用できます。

幸運を!

于 2013-02-06T11:28:04.270 に答える