Использование геодезических измерений для кругового радиуса?


15

В настоящее время я занимаюсь разработкой картографического сайта 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


1
здесь должно быть что-то не так. разница не может быть 20% на таком коротком расстоянии между прямой и линией, следующей за сфероидом. кое-что еще должно быть вовлечено.
Никлас Авен

4
Очень вероятно, что проекция Меркатора имеет истинный масштаб на экваторе (как правило, проекции Меркатора могут иметь истинный масштаб в другом месте (на одной широте), но большинство глобальных параметризаций используют экватор). И ошибки масштаба Меркатора действительно очень велики (фактически, бесконечны на полюсах), увеличиваясь по мере того, как вы направляетесь на север / юг от истинной шкалы масштаба.
Пол Рэмси

Измерения были сделаны при 52 градусах северной широты и действительно находятся в проекции Меркатора. Значит ли это, что какие-либо объекты на стороне клиента, нарисованные в Mercator, будут возвращать очень неточные области и длины, если они не находятся рядом с экватором?
география

1
Да, это так, проецируйте данные в локальную сетку в метрах или футах, и все будет хорошо.
Ян Тертон

2
@ Пол Хороший звонок. Но эти данные только указывают на то, что проекция является цилиндрической, из которой Меркатором является один. В истинных цилиндрических проекциях горизонтальное искажение равно секунде (широте). По этой формуле искажение 20 / 12,13 получается на широте 52,66 градусов; это именно широта лимерика.
whuber

Ответы:


8

Если вы завариваете дома в браузере, вы можете получить «круг» (он не будет круглым на экране из-за вашей проекции; скорее аппроксимируется многоугольником с таким количеством точек, сколько вы хотите нарисовать), используйте прямая форма геодезических расчетов: заданная точка, направление (азимут) и расстояние, которое она дает вам полученную точку. Детали Гори: 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 (начальная точка, i * 360 / n, расстояние)))
  • После этого, возможно, устраните некоторые раздражения проекции и планаризации:
    • Если вы используете типичную проекцию веб-карты, которой вы почти наверняка являетесь, результирующий многоугольник будет сильно растянут по вертикали, если он приближается к полюсу.
    • Точно так же, если результирующий многоугольник пересекает международную линию дат, он будет действительно потерян.

Ура!


1
Метод Vincenty уже добавлен в OpenLayers в пространстве имен utils - dev.openlayers.org/apidocs/files/OpenLayers/… с этим и вашим объяснением, в частности с параметром подшипника, проясните это. Благодарность!
география

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

3

OpenLayers позволяет только рисовать круги, используя плоские расстояния

Чтобы получить геодезический круг, вы можете использовать буферную операцию в сервисе геометрии ESRI.

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

Свободно доступный доступен здесь .


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

Круг должен быть точным, однако я бы проверил его с помощью инструмента измерения. Я думаю, что сервис геометрии является частью стандартной установки ArcGIS Server, поэтому, если он выйдет на пенсию, в Интернете будет еще много возможностей для выбора. google.com/…
Кирк Куйкендалл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.