Використання геодезичних вимірювань для радіусів кола?


15

На даний момент я розробляю карту OpenLayers. Вимірювання можна проводити за допомогою лінійного інструменту та інструменту області. Наразі обидва ці програми встановлені для обчислення геодезичних вимірювань, як зазначено в API OpenLayers .

Я використовую геодезичні вимірювання, а не площинні вимірювання, оскільки під час тестування користувачі ставили під сумнів вимірювання інструменту на відстані, які вони вже знали (наприклад, проїзд між містами).

Нова функція сайту полягає в тому, щоб користувач міг намалювати коло на карті заданого радіуса. OpenLayers дозволяє лише малювати кола за допомогою плоских відстаней, тому коли користувач вимірює коло за допомогою геодезичного інструменту вимірювання, значення не збігаються. На зображенні нижче площини радіус кола - 10 км, але вимірювання геодезичної лінії для діаметра - 12 км.

Зрозуміло, це дозволить користувачеві (і я) замислитися, що це правильно.

alt текст

Дивлячись на цю відповідь , здається, більшість настільних ГІС-систем «ігнорують» це питання і повертають планарні вимірювання та відстані. То яка найкраща практика з точки зору користувальницького інтерфейсу та точності для виконання планових та геодезичних вимірювань?

Оновлення

Я знайшов цей приклад 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


1
тут щось повинно бути не так. різниця не може бути 20% на такому короткому відстані між прямою та лінією, що йде за сфероїдом. ще щось треба задіяти.
Nicklas Avén

4
Проекція є дуже ймовірною Меркатором, який має справжній масштаб лише на екваторі (загалом, реально можливі прогнози Меркатора з істинним масштабом в іншому місці (на одній широті), але більшість глобальних параметрів параметри використовують екватор). І помилки шкали для Меркатора дійсно дуже великі (нескінченна, насправді, на полюсах), збільшуючись, коли ви прямуєте на північ / південь від справжньої широти масштабу.
Пол Рамзі

Вимірювання проводилися на північчі 52 градуси і дійсно знаходяться в прогнозі Меркатора. Так це означає, що будь-які функції клієнта, намальовані в Меркатора, повертатимуть дуже неточні ділянки та довжини, якщо не поблизу екватора?
geographika

1
Так, це майже так, проектуйте дані в локальну сітку в метрах і футах, і все буде добре.
Ян Тертон

2
@Paul Добрий дзвінок. Але ці дані свідчать лише про те, що проекція є циліндричною, з яких Меркатор - одна. У справжніх циліндричних проекціях горизонтальне спотворення дорівнює sec (широті). За цією формулою викривлення 20 / 12,13 виходить на широту 52,66 градусів; це точно широта Лімерик.
whuber

Відповіді:


8

Якщо ви запускаєте домашню пивоварку в браузері, ви можете отримати «коло» (воно не буде круглим на екрані завдяки вашій проекції; скоріше наближене до багатокутника з такою кількістю точок, скільки ви хочете намалювати), використовуйте a пряма форма геодезичних обчислень: задана точка, напрямок (азимут) і відстань, що дає вам отриману точку. Деталі про Горі: http://en.wikipedia.org/wiki/Vincenty%27s_formulae#Direct_Method

Схоже, хтось уже зробив переклад на javascript: http://www.movable-type.co.uk/scripts/latlong-vincenty-direct.html . Щасливчик!

Щоб закінчити речі:

  • Вирішіть, наскільки чіткий (# вершин, назвіть це n), ви готові мати кінцевий результат.
  • Розділіть 360 градусів на n частин.
  • Побудуйте багатокутник за (для i в діапазоні (n): polygon.add (vincenty_direct (start_point, i * 360 / n, відстань)))
  • Після факту, можливо, усуньте деякі роздратування проекції та планаризації:
    • Якщо ви використовуєте типову проекцію веб-карти, якою ви майже напевно є, отриманий багатокутник буде сильно розтягнутий вертикально, якщо він наближається до полюса.
    • Аналогічно, якщо полігон результатів перетне міжнародну лінію дати, він буде дійсно непрацюючим.

Ура!


1
Метод Вінсенті вже був доданий до OpenLayers у просторі імен утиліт - dev.openlayers.org/apidocs/files/OpenLayers/… цим і вашим поясненням, зокрема параметром несучої, це очистити. Спасибі!
geographika

:) Дайте мені знати, як дратують "роздратування". В ідеалі, виправлення вже було б частиною OpenLayers, і це буде просто працювати, але я не впевнений.
Дан С.

3

OpenLayers дозволяє лише малювати кола за допомогою плоских відстаней

Щоб отримати геодезичне коло, ви можете використовувати операцію буфера в службі геометрії ESRI.

... якщо одиниця лінійна, наприклад фути або метри, виконується геодезична буферизація

Вільнодоступний доступний тут .


Дякую за корисне посилання - я побачу, чи можу я зателефонувати в службу та оновити функцію в JavaScript. Моє єдине занепокоєння буде покладатися на веб-сервіс, який можна вимкнути в будь-який час. Я припускаю, що точка забудови геодезичним буде точним / реальним колом 10 км?
geographika

Коло має бути точним, проте я перевірив би це за допомогою інструменту вимірювання. Я думаю, що послуга з геометрії є частиною стандартної установки сервера arcgis, тож якщо ця людина вийде на пенсію, в Інтернеті має бути ще багато. google.com/…
Кірк Куйкендалл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.