Гео-пространственная прямоугольная ошибка в вычислениях ограничительной рамки: неправильная широта

Может кто-либо аккуратный или эксперты 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

6
задан Mogsdad 9 December 2013 в 04:54
поделиться

2 ответа

Я не смотрел ваш код, но вы также можете использовать функцию 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);
13
ответ дан 8 December 2019 в 16:01
поделиться

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

1
ответ дан 8 December 2019 в 16:01
поделиться