Может кто-либо аккуратный или эксперты 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: 1 000 переноса: 0 (север)
newLatitude возвращается-0.36726592610659514 (неправильный).
Какие-либо предложения? Я кодировал вокруг этой конкретной формулы до сих пор, и этому озадачили меня. Я также попытался перевести другую формулу из PHP напрасно. Я полагаю, что вышеупомянутое точно, в чем я нуждаюсь, если его можно настроить.
Спасибо, b.dot
Я не смотрел ваш код, но вы также можете использовать функцию 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);
CLLocationCoordinate2D хранит координаты в градусах, но триггерные функции, которые вы используете требуются радианы. Если преобразовать в радианы (умножить на M_PI / 180 или 0,017453293f), это, вероятно, сработает.