我需要创建一个大约500米的 MKCoordinateSpan 。
如何计算传入 MKCoordinateSpan 构造函数的值?
任何编程(Obj-C,.Net)语言中的答案都可以。
答案 0 :(得分:94)
另一种方法是使用MapKit的MKCoordinateRegionMakeWithDistance
函数:
MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
MKCoordinateSpan
将在rgn.span
。
答案 1 :(得分:39)
除非你需要很高的准确度,否则你可以通过近似使其变得更容易。第一个问题是找到代表500米的纬度的分数。很容易,因为纬度在任何位置都是恒定的,大约111公里。所以500米是纬度.0045度。
然后它变得更难,因为经度的长度取决于你的位置。它可以用
近似
其中alpha是地球的赤道半径,6,378,137km,b / a是0.99664719(所有GPS设备使用的WGC84球体模型使用的常数)和,其中phi是纬度。< / p>
想象一下,你很幸运能够在墨尔本经度为37.783度。北方或南方在这里无关紧要。 beta测试结果是37.6899,其余部分解决了纵向度为88km的问题。所以500米是.0057度。
墨尔本的结果 - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);
您可以查看答案和代码with this online calculator
经度上的wiki article有更多关于此的详细信息(这里是图像的来源)
代码:
#define EARTH_EQUATORIAL_RADIUS (6378137.0)
#define WGS84_CONSTANT (0.99664719)
#define degreesToRadians(x) (M_PI * (x) / 180.0)
// accepts decimal degrees. Convert from HMS first if that's what you have
double spanOfMetersAtDegreeLongitude(double degrees, double meters) {
double tanDegrees = tanf(degreesToRadians(degrees));
double beta = tanDegrees * WGS84_CONSTANT;
double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;
double measuresInDegreeLength = lengthOfDegree / meters;
return 1.0 / measuresInDegreeLength;
}
答案 2 :(得分:-2)
在MonoTouch中,然后使用此解决方案,您可以使用此辅助方法:
public static void ZoomToCoordinateAndCenter (MKMapView mapView, CLLocationCoordinate2D coordinate, double meters, bool showUserLocationToo, bool animate)
{
if (!coordinate.IsValid ())
return;
mapView.SetCenterCoordinate (coordinate, animate);
mapView.SetRegion (MKCoordinateRegion.FromDistance (coordinate, meters, meters), animate);
}