Я работаю со стеком ESRI, храня свои слои в базе геоданных sql-пространственно-включенных-SDE (тип геометрии, Web Mercator-3857).
Я создаю веб-картографическое приложение, поэтому по умолчанию плитки также находятся в веб-меркаторе, 3857.
Через хранимые процедуры я использую STDistance для запроса расстояний от местоположения пользователя (координаты также в веб-меркаторе) до различных слоев.
Проблема в том, что из-за искажения web mercator мои дистанционные кальки все больше отключаются, чем дальше от экватора они сделаны.
Я думал о хранении своих слоев в типе sql-пространственно-географии (а не геометрии), но:
- Я предполагаю, что мои дистанционные запросы будут занимать гораздо больше времени (дистанционные вычисления на сферической поверхности)
- мне нужно будет импортировать много данных
- сервисы Arcgis не будут такими быстрыми, как им придется проецировать на лету
Если я захожу на карты Google и вычисляю расстояние, возвращаемое расстояние будет гораздо более точным, даже в Северном / Южном регионах, поэтому я предполагаю, что Google должен исправить искажение, вызванное проекцией веб-меркатора.
Мой вопрос: есть ли простое значение коэффициента, которое можно применить к расчетам расстояний в проекции веб-меркатора, чтобы получить «правильное» расстояние?
источник
cos((l1 + l2)/2)
которая даст вам расстояние по прямой линии / постоянному курсу, а не расстояние по большому кругу.Я бы рассмотрел ваш второй вариант сохранения ваших данных в
GEOGRAPHY
формате еще раз, если вы ищете точные результаты для глобальных данных.Ничто не мешает вам иметь два пространственных поля в таблице - одно в Mercator как
GEOMETRY
тип и одно в WGS84 какGEOGRAPHY
тип (по крайней мере, в SQL Server, я не уверен насчет ArcSDE).Вы должны быть в состоянии создать простой скрипт геообработки, который заполнит оба поля вашими исходными данными. Если есть редактирование и частые обновления, то это может быть не вариант.
Если у вас есть два поля, вы можете продолжить использовать Mercator для быстрого отображения и конвертировать введенные пользователем точки в широты и долготы для расстояний.
Это имеет два основных преимущества:
Скорость запросов будет более сложной, но она может быть незаметной для пользователя. Возможно, вы захотите проверить с одним классом объектов, прежде чем принять решение о решении. Вам также нужно будет конвертировать введенные пользователем точки из Mercator (что должно быть тривиально и может быть сделано в браузере).
Даже с типом географии, хотя все еще есть погрешность:
Из MSDN
источник
Альтернативное предложение от ESRI состоит в том, чтобы использовать «Сервис геометрии», который включает в себя отправку геометрий на ArcGIS Server и получение результата. Если вы не ожидаете проблем с узким местом при использовании веб-службы, это может быть очень эффективным подходом. Я использовал тот же подход в приложении Silverlight.
Вот оригинальная запись в блоге ESRI: http://blogs.esri.com/Dev/blogs/arcgisserver/archive/2010/03/05/Measuring-distances-and-areas-when-your-map-uses-the -Mercator-projection.aspx
В блоге есть упрощенный пример JavaScript, а также полное приложение здесь: http://serverapps.esri.com/javascript_examples/compare_measurements.htm
источник
Как и в Google Earth, вы можете преобразовать геометрию в локальную проекцию зоны WGS84 или в улучшенную проекцию WGS84, как SIRGAS в Южной Америке.
Вы можете найти в http://www.spatialreference.org координаты почти всех «зонированных» проекций, и вы можете составить таблицу и т. Д., Чтобы преобразовать их в зависимости от зоны.
Представляем таблицу зон
все значения minx, miny, maxx, maxy хранятся в Spherical Mercator (Web Mercator). поэтому я буду использовать Postgis в качестве примера.
Надеюсь, что это будет полезно, хорошего дня.
источник
У OpenLayers есть служебный метод для расчета расстояния между двумя точками EPSG: 4326 (WGS84) на эллипсоиде. Поскольку OpenLayers является открытым исходным кодом, вы можете увидеть, как это реализовано, здесь: https://github.com/openlayers/openlayers/blob/release-2.12/lib/OpenLayers/Util.js#L750
Для тех, кто использует OpenLayers и элемент управления Measure, просто включите геодезические в опциях, чтобы использовать этот расчет.
источник