На даний момент я розробляю карту OpenLayers. Вимірювання можна проводити за допомогою лінійного інструменту та інструменту області. Наразі обидва ці програми встановлені для обчислення геодезичних вимірювань, як зазначено в API OpenLayers .
Я використовую геодезичні вимірювання, а не площинні вимірювання, оскільки під час тестування користувачі ставили під сумнів вимірювання інструменту на відстані, які вони вже знали (наприклад, проїзд між містами).
Нова функція сайту полягає в тому, щоб користувач міг намалювати коло на карті заданого радіуса. OpenLayers дозволяє лише малювати кола за допомогою плоских відстаней, тому коли користувач вимірює коло за допомогою геодезичного інструменту вимірювання, значення не збігаються. На зображенні нижче площини радіус кола - 10 км, але вимірювання геодезичної лінії для діаметра - 12 км.
Зрозуміло, це дозволить користувачеві (і я) замислитися, що це правильно.
Дивлячись на цю відповідь , здається, більшість настільних ГІС-систем «ігнорують» це питання і повертають планарні вимірювання та відстані. То яка найкраща практика з точки зору користувальницького інтерфейсу та точності для виконання планових та геодезичних вимірювань?
Оновлення
Я знайшов цей приклад Google, який ілюструє проблему радіусів та проекцію Меркатора:
http://maps.forum.nu/gm_sensitive_circle2.html
Код JavaScript для малювання кола такий:
var lat1 = (PI/180)* center.lat(); // radians
var lng1 = (PI/180)* center.lng(); // radians
for (var a = 0 ; a < 361 ; a++ ) {
var tc = (PI/180)*a;
var y = asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc));
var dlng = atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(y));
var x = ((lng1-dlng+PI) % (2*PI)) - PI ; // MOD function
var point = new GLatLng(parseFloat(y*(180/PI)),parseFloat(x*(180/PI)));
circlePoints.push(point);
bounds.extend(point);
}
Чи враховує це коло викривлення землі?
Остаточне оновлення
Робочий код розміщено на http://geographika.co.uk/creating-a-geodesic-circle-in-openlayers