Существует функция MKCoordinateRegionForMapRect
, которая возвращает MKCoordinateRegion. Не пытаясь это сделать, кажется, что все, что вам нужно сделать, это точно указать прямоугольник как область, ограниченную одной диагональю одним выводом, а другую диагональю другим выводом. Вы можете использовать CGRectUnion дважды, указав в качестве начала координат исходное положение булавки и сколь угодно малую ширину и высоту.
Тогда расстояние между выводами будет квадратным корнем из расстояний, представленных значениями широты и долготы, возвращенными в квадрате и добавленными. (т. е. теорема Пифагора, две стороны длины являются горизонтальной и вертикальной сторонами треугольника, а диагональ - это прямая линия между вашими точками.)
Найти широтуДельта в метрах легко, каждый градус широты 111 км.
Чтобы найти счетчики для longitudeDelta, вам нужно немного больше кода.
#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 lengthOfDegreeLongitude(double degrees) {
double tanDegrees = tanf(degreesToRadians(degrees));
double beta = tanDegrees * WGS84_CONSTANT;
double lengthOfDegree = cos(atan(beta)) * EARTH_EQUATORIAL_RADIUS * M_PI / 180.0;
return lengthOfDegree;
}
Дайте этой функции долготу интересующего вас местоположения и умножьте результат на longitudeDelta в градусах, чтобы получить расстояние в метрах. Тогда у вас есть горизонтальное расстояние и вертикаль, и вы можете найти диагональ, которую вы искали.
Неточность ухудшится, если вы ищете расстояние, которое очень велико в N-S, поскольку длина градуса долготы будет варьироваться в зависимости от расчета. И вы можете немного уточнить 111 км для градуса широты, это только из памяти.