Мне нужно создать MKCoordinateSpan, что составляет около 500 метров.
Как мне рассчитать значения, которые нужно передать в конструктор MKCoordinateSpan?
Ответы на любом языке программирования (Obj-C,.Net) в порядке.
Мне нужно создать MKCoordinateSpan, что составляет около 500 метров.
Как мне рассчитать значения, которые нужно передать в конструктор MKCoordinateSpan?
Ответы на любом языке программирования (Obj-C,.Net) в порядке.
Другой альтернативой является использование функции MapKit MKCoordinateRegionMakeWithDistance
:
MKCoordinateRegion rgn = MKCoordinateRegionMakeWithDistance(
CLLocationCoordinate2DMake(someLatitude, someLongitude), 500, 500);
MKCoordinateSpan
будет находиться в rgn.span
.
Если вам не нужна большая точность, вы можете сделать это намного проще с приближением. Первая проблема заключается в том, чтобы найти долю степени широты, составляющую 500 метров. Легко, так как степень широты постоянна в любом месте, примерно 111 км. Таким образом, 500 метров составляет .0045 градусов.
Тогда это становится сложнее, потому что длина градуса долготы изменяется в зависимости от того, где вы находитесь. Его можно аппроксимировать с помощью
где альфа - экваториальный радиус Земли, 6,378,137 км, b/a - 0,99664719 (постоянная, используемая для сфероидной модели WGC84, используемой всеми устройствами GPS) и , где phi - степень широты.
Представьте себе, что вам посчастливилось оказаться в Мельбурне с долготой 37.783 градуса S. Север или Юг здесь неважно. бета составляет 37,6899, а остальная часть решает увеличить длину в 88 км. Так что 500 метров - 0,0057 градуса.
Результат для Мельбурна - MKCoordinateSpan melbourne500MeterSpan = MKCoordinateSpanMake(.0045, .0057);
Вы можете проверить свои ответы и свой код с помощью этого онлайн-калькулятора
статья wiki о долготе имеет намного больше информации об этом (и это источник изображений здесь)
код:
#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 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;
}
В 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);
}