Ошибка вычисления прямоугольника пространственной ограничительной рамки: неверная широта - PullRequest
6 голосов
/ 09 марта 2010

Могут ли какие-нибудь специалисты по тригам или GPS помочь мне здесь? Я пытаюсь создать вычисление гео-пространственного ограничивающего прямоугольника (прямоугольника), возвращая максимальную широту и долготу, используя следующий метод, который я получил. Я называю метод один раз для каждого из подшипников: север, юг, восток и запад. С этими четырьмя значениями я собираюсь запросить в моем Базовом хранилище данных все объекты в блоке.

  -(CLLocation*) offsetLocation:(CLLocation*)startLocation:(double)offsetMeters:(double)bearing {


    double EARTH_MEAN_RADIUS_METERS = 6372796.99;
    double newLatitude = asin( sin(startLocation.coordinate.latitude) * cos(offsetMeters/EARTH_MEAN_RADIUS_METERS) + cos(startLocation.coordinate.latitude) * sin(offsetMeters/EARTH_MEAN_RADIUS_METERS) * cos(bearing) );
    double newLongitude = startLocation.coordinate.longitude + atan2( sin(bearing) * sin(offsetMeters/EARTH_MEAN_RADIUS_METERS) * cos(startLocation.coordinate.latitude), cos(offsetMeters/EARTH_MEAN_RADIUS_METERS) - sin(startLocation.coordinate.latitude) * sin(newLatitude));


    CLLocation *tempLocation = [[CLLocation alloc] initWithLatitude:newLatitude longitude:newLongitude];
    [tempLocation autorelease];
    return tempLocation;
}

Проблема в том, что вычисление для смещения newLatitude определенно неверно. Учитывая следующее:

startLocation: широта 37.331688999999997, долгота -122.030731 offsetMeters: 1000 подшипник: 0 (север)

newLatitude возвращает -0,36726592610659514 (неверно).

Есть предложения? Я закодировал эту конкретную формулу до сих пор, и эта поставила меня в тупик. Я также пытался перевести другую формулу из PHP безрезультатно. Я полагаю, что это именно то, что мне нужно, если это можно настроить.

Спасибо, б.дот

Ответы [ 3 ]

13 голосов
/ 09 марта 2010

Я не посмотрел ваш код, но вы также можете использовать функцию MapKit MKCoordinateRegionMakeWithDistance(), чтобы инфраструктура вычисляла ограничивающую рамку для вас.

CLLocationCoordinate2D center = { 37.3, -122.0 };
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(center, 2000.0, 2000.0);
CLLocationCoordinate2D northWestCorner, southEastCorner;
northWestCorner.latitude  = center.latitude  - (region.span.latitudeDelta  / 2.0);
northWestCorner.longitude = center.longitude + (region.span.longitudeDelta / 2.0);
southEastCorner.latitude  = center.latitude  + (region.span.latitudeDelta  / 2.0);
southEastCorner.longitude = center.longitude - (region.span.longitudeDelta / 2.0);
1 голос
/ 04 июля 2011

Как вы, ребята, настраиваете NSP-предикаты?

Кажется, у меня проблемы с производительностью.

NSPredicate *northWestLat = [NSPredicate predicateWithFormat:@"ANY locations.lat > %lf", northWestCorner.latitude];
NSPredicate *southhWestLat = [NSPredicate predicateWithFormat:@"ANY locations.lat < %lf", southEastCorner.latitude];
NSPredicate *latitudePredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:northWestLat, southhWestLat, nil]];

NSPredicate *northWestLng = [NSPredicate predicateWithFormat:@"ANY locations.lng < %lf", northWestCorner.longitude];
NSPredicate *southEastLng = [NSPredicate predicateWithFormat:@"ANY locations.lng > %lf", southEastCorner.longitude];
NSPredicate *longitudePredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:northWestLng, southEastLng, nil]];

NSPredicate *coordPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:latitudePredicate, longitudePredicate, nil]];
1 голос
/ 10 марта 2010

CLLocationCoordinate2D хранит координаты в градусах, но для использования функций триггера требуются радианные единицы. Если вы преобразуете в радианы (умножьте на M_PI / 180 или 0,017453293f), это, вероятно, будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...