Я разрабатываю некоторые пользовательские функции отображения в своем приложении и столкнулся с камнем преткновения.
Эта карта предназначена для известной области (т. Е. Я знаю точную широту / долготу верхнего левого и нижнего правого углов), и у меня есть графическое изображение области для масштабирования, которое я использую в качестве фона (я не я не хочу использовать MKMapView для этого).
Я использую CoreLocation, чтобы предоставить мне широту / долготу и пытаюсь перевести эти «реальные» координаты в точку на пользовательской карте.
Следует отметить, что моя пользовательская карта (которая отображается в UIScrollView) поворачивается с севера на определенный угол (т. Е. Верхняя часть пользовательской карты не равна северу), поэтому мне нужно перевести / повернуть все координаты, возвращенные через CoreLocation.
Я использую следующий код, чтобы попытаться сделать это:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
CLLocation *pTL = [self rotateLocation:self.topLeftCorner
aboutLocation:newLocation];
CLLocation *pBR = [self rotateLocation:self.bottomRightCorner
aboutLocation:newLocation];
double mapCoordX = ((pTL.coordinate.longitude - newLocation.coordinate.longitude) / (pTL.coordinate.longitude - pBR.coordinate.longitude)) * imageWidth;
double mapCoordY = ((pTL.coordinate.latitude - newLocation.coordinate.latitude) / (pTL.coordinate.latitude - pBR.coordinate.latitude)) * imageHeight;
if ((mapCoordX >= -self.beaconImage.frame.size.width && mapCoordX <= imageWidth + self.beaconImage.frame.size.width) && (mapCoordY >= -self.beaconImage.frame.size.height && mapCoordY <= imageHeight + self.beaconImage.frame.size.height)) {
self.beaconImage.center = CGPointMake(mapCoordX, mapCoordY);
self.beaconImage.hidden = NO;
} else {
UIAlertView *av = [[UIAlertView alloc]
initWithTitle:nil
message:@"You're not within the boundaries of the map"
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[av show];
[av release];
self.beaconImage.hidden = YES;
}
}
- (CLLocation *)rotateLocation:(CLLocation *)rotationLocation aboutLocation:(CLLocation *)baseLocation {
double mapLatitudeOffset = topLeftCorner.coordinate.latitude + bottomRightCorner.coordinate.latitude;
double mapLongitudeOffset = topLeftCorner.coordinate.longitude - bottomRightCorner.coordinate.longitude;
double mapOffsetAngle = 0;
if (mapLongitudeOffset == 0 && mapLatitudeOffset == 0) {
mapOffsetAngle = 0;
} else if (mapLongitudeOffset >= 0) {
mapOffsetAngle = atan2(mapLongitudeOffset, mapLatitudeOffset);
} else {
mapOffsetAngle = -atan2(mapLongitudeOffset, mapLatitudeOffset) + M_PI;
}
double latitudeOffset = (rotationLocation.coordinate.latitude + (baseLocation.coordinate.latitude * -1));
double longitudeOffset = (rotationLocation.coordinate.longitude + (baseLocation.coordinate.longitude * -1));
double radius = sqrt(pow(latitudeOffset, 2) + pow(longitudeOffset, 2));
double theta = 0;
if (longitudeOffset == 0 && latitudeOffset == 0) {
theta = 0;
} else if (longitudeOffset >= 0) {
theta = atan2(longitudeOffset, latitudeOffset);
} else {
theta = -atan2(longitudeOffset, latitudeOffset) + M_PI;
}
double angularOffset = theta + mapOffsetAngle;
double latitudeRotate = radius * sin(angularOffset);
double longitudeRotate = radius * cos(angularOffset);
return [[[CLLocation alloc] initWithLatitude:baseLocation.coordinate.latitude + latitudeRotate longitude:baseLocation.coordinate.longitude + longitudeRotate] autorelease];
}
К сожалению, рассчитанные значения не верны, и поэтому изображение маяка, которое я использую для обозначения моей текущей позиции, отображается в неправильной области карты.
Это кажется простой проблемой, так что я делаю не так?