iOS5 で CLGeocoder を使用して CLPlacemark を取得しています。ここで、目印の領域 (CLRegion オブジェクト) を取得し、MKMapView をその領域にズームしたいと考えています。
thisの逆が欲しいのですが、-locationFromLocationWithDistance:
同等の方法がないようです。少し複雑に見えるので、Haversine 式を逆に使用する必要があると誰も言わないことを願っています...
または、そのすべての計算の代わりに、API によって提供されるメソッドを使用するだけです。
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([placemark region].center, [placemark region].radius, [placemark region].radius);
[[self mapView] setCenterCoordinate:[placemark region].center animated:NO];
ここで提供されている数学を使用してそれを行うことができます。そしてコードのために
CLLocationCoordinate2D center = placemark.location.coordinate;
CLRegion* coreLocationRegion = placemark.region;
CLLocationDistance radius = coreLocationRegion.radius;
#define kBEARING_NORTH 0.0
#define kBEARING_EAST .5 * M_PI
#define kBEARING_SOUTH M_PI
#define kBEARING_WEST 1.5 * M_PI
#define kEARTH_RADIUS_M 6371000.0
// Store the angular distance of each side from the center
double angDist = radius / kEARTH_RADIUS_M;
// Convert center lat and lng to radians
double centerLatRad = center.latitude * M_PI / 180;
double centerLngRad = center.longitude * M_PI / 180;
// Calculate latitude range
double maxLatRad = asin(sin(centerLatRad) * cos(angDist) +
cos(centerLatRad) * sin(angDist) * cos(kBEARING_NORTH));
double minLatRad = asin(sin(centerLatRad) * cos(angDist) +
cos(centerLatRad) * sin(angDist) * cos(kBEARING_SOUTH));
// Calculate longitude range
// Longitude range requires coresponding latitudes:
double tempLatRad;
// Calculate max longitude
tempLatRad = asin(sin(centerLatRad) * cos(angDist) +
cos(centerLatRad) * sin(angDist) * cos(kBEARING_EAST));
double maxLngRad = centerLngRad + atan2(sin(kBEARING_EAST) * sin(angDist) * cos(centerLatRad),
cos(angDist) - sin(centerLatRad) * sin(tempLatRad));
// Calculate min longitude
tempLatRad = asin(sin(centerLatRad) * cos(angDist) +
cos(centerLatRad) * sin(angDist) * cos(kBEARING_WEST));
double minLngRad = centerLngRad + atan2(sin(kBEARING_WEST) * sin(angDist) * cos(centerLatRad),
cos(angDist) - sin(centerLatRad) * sin(tempLatRad));
CLLocationDegrees latitudeDelta = (maxLatRad-minLatRad) * 180 / M_PI;
CLLocationDegrees longitudeDelta = (maxLngRad-minLngRad) * 180 / M_PI;
MKCoordinateSpan span = MKCoordinateSpanMake(latitudeDelta, longitudeDelta);
MKCoordinateRegion region = MKCoordinateRegionMake(center, span);
[self.mapView setRegion: region animated: YES];