найти объекты рядом с моим - PullRequest
0 голосов
/ 18 марта 2011

Я создаю приложение для iphone и ищу идею, как расположить объекты ближе к моей позиции.объекты имеют адрес, указанный в моей базе данных.теперь мне интересно показать объекты, которые находятся близко к моему на карте.как я могу получить это свойство?сначала я подумал о floyd-warshall но есть ли лучшее решение, чем я сам его кодирую?

Ответы [ 3 ]

1 голос
/ 18 марта 2011

Возможно, это не то решение, которое вам нужно, но это поможет вам определить расстояние между точками.Если вы наносите их на карту, у вас могут быть координаты.Затем вы можете получить расстояние от этих точек до вашего местоположения, используя distanceFromlocation: метод CLLocation , чтобы получить расстояние.Затем вы можете построить их в зависимости от расстояния.

1 голос
/ 18 марта 2011

Первое, что вам нужно сделать - это получить в базе данных позиции Long Long вместо адресов. Существует инструмент, который предоставляет Google, который делает это. Существует также ручной подход .

Тогда вы можете использовать формулу Haversine , чтобы определить, находится ли она в пределах определенного радиуса от вашего местоположения.

Вот пример. Вы можете перемещаться по объектам (местоположению) на карте и видеть, как далеко они находятся от вас.

-(CGFloat) getDistance :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude
{
    CGFloat earthRadius = 6371;

    CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
    CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);

    CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
        cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) * 
        sin(deltaLong/2) * sin(deltaLong/2);

    CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
    CGFloat d = earthRadius * c;

    d = round(d, 4); // round to 4dp
    d = d * 1000; // convert from km to m
    d = d * 0.621371192; // convert from km to miles

    return d; // m
}

Вы можете изменить этот метод, чтобы он возвращал значение ИСТИНА, если оно находится в пределах определенного расстояния, и ЛОЖЬ, если это не так:

-(BOOL) doesObjFallWithinMyRadius :(CGFloat)objLatitude :(CGFloat)objLongitude :(CGFloat)currentLocationLatitude :(CGFloat)currentLocationLongitude :(CGFloat)distanceLimit
{
    CGFloat earthRadius = 6371;

    CGFloat deltaLat = deg2rad(currentLocationLatitude - objLatitude);
    CGFloat deltaLong = deg2rad(objLongitude - currentLocationLongitude);

    CGFloat a = sin(deltaLat/2) * sin(deltaLat/2) +
        cos(deg2rad(objLatitude)) * cos(deg2rad((double)currentLocationLatitude)) * 
        sin(deltaLong/2) * sin(deltaLong/2);

    CGFloat c = 2 * atan2(sqrt(a), sqrt(1 - a));
    CGFloat d = earthRadius * c;

    d = round(d, 4); // round to 4dp
    d = d * 1000; // convert from km to m
    d = d * 0.621371192; // convert from km to miles

    if(d < distanceLimit) return TRUE;
    else return FALSE;
}

Чтобы узнать ваше текущее местоположение, вам нужно использовать CLLocationManager , который является частью iOS SDK.

0 голосов
/ 18 марта 2011

Вы видели KD-дерево ? Вы можете использовать это, чтобы найти места рядом с вами.

Конечно, вы должны были бы предположить, что Земля была плоской, но я не могу поверить, что это может вызвать проблемы, верно? :) Это интересная структура данных, которую нужно посмотреть.

...