Мне нужно иметь возможность рассчитать ограничивающую рамку или окружность для заданной широты WGS84 и долготы WGS84, а также расстояния, но я не знаю, с чего начать!
Расстояние от начала широты / долготы будет 10 км или меньше.
Может ли кто-нибудь дать мне несколько советов / Пример того, как это сделать?
Ответы:
WGS-что? WGS-84? В зависимости от того, какая точность вам нужна, вам, возможно, потребуется знать гораздо больше информации - я думаю, именно поэтому за вас проголосовали, хотя никто не удосужился оставить комментарий, объясняющий почему.
Вот два способа:
Неточно, но, вероятно, «достаточно хорошо»
Один градус широты составляет приблизительно 10001,965729 / 90 километров (расстояние от экватора до полюса, деленное на девяносто градусов) или 111,113 километра с использованием данных WGS-84. Это приблизительное значение из-за формы земли и потому, что расстояния меняются при приближении к полюсам (одна из причин использовать широту, а не долготу - в конечном итоге расстояние в один градус долготы равно нулю!) Земля также не идеальна сфера. Обе эти причины являются причиной использования более сложного подхода на основе проекций и основанных на данных, в моем втором ответе.
Это использует десятичные градусы, а не градусы / минуты / секунды.
Таким образом, ваша ограничительная рамка будет вашей точкой, плюс и минус 0,08999 градусов. В качестве альтернативы вы можете использовать это число в качестве радиуса, давая вам ограничивающий круг .
Любой ГИС, читающий это, будет содрогаться. Это будет в основном точно, хотя, в зависимости от того, где вы находитесь в мире. Для радиуса 10 км это должно быть хорошо.
Гораздо точнее, но больше кода
Используйте библиотеку проекций и укажите свои данные и т. Д. Я рекомендую Proj4; он широко используется, поэтому Google возвращает кучу результатов по вопросам об этом, и есть обертки Delphi . Если у вас возникли проблемы с его использованием, опубликуйте еще один вопрос на SO - он выходит за рамки этого. На веб-сайте Proj4 есть примеры использования базовых API, и хотя они написаны на языке C, их должно быть довольно легко перевести. Их ссылка на API - лучшее место для начала, за которым следует FAQ .
Я бы использовал WGS-84 в качестве базового элемента (представление Земли), если вы не знаете конкретный объект, который вы хотите использовать, или который использовался для создания ваших координат. Это обычно используется и довольно точно.
Если ваша позиция основана на Google Картах (например), укажите проекцию Меркатора. Вы можете использовать другую проекцию или, скажем, координаты UTMвместо широты и долготы, в зависимости от источника ваших данных и от того, хотите ли вы высокую точность для небольшого локального района. (У UTM есть несколько зон, каждая из которых изменяет искажение, так что в пределах этой зоны это очень точно; если вы используете зону для координат вне ее, искажение будет значительно увеличиваться при удалении. Если вы просматриваете всю Землю, спроецированную из одной зона может быть неузнаваемой. Но в пределах зоны UTM переводы будут примерно такими же хорошими, как вы можете получить. Координаты обычно указываются в метрах, а не в градусах, поэтому это может быть более полезным для вас, если вам требуется 10 км. радиус. 10 км легко в пределах одной зоны, вам просто нужно выбрать соответствующую зону на основе вашей центральной координаты. Единственный сложный момент, когда вы приближаетесь к границе: это обычная ситуация, и это хорошо, простов соответствии с тем, как вы выбираете, какой вы используете . Proj4 также позволит вам переводить проекции, чтобы вы могли перейти от своего Mercator WGS-84 lat / long к UTM-зоне n , например, или в и из двух UTM-зон.)
источник
Предполагая, что вы хотите сделать запрос в базе данных, вы, вероятно, захотите сделать быстрый (неточный) поиск, а затем точно рассчитать расстояние для получаемых мест. Это твой сценарий?
Следующая функция (в PHP, извините) примерно рассчитает разницу по широте и долготе. Эти различия зависят от широты вашей поисковой точки. Используйте их (с небольшим допуском) для быстрого поиска в базе данных. Поле можно вычислить просто с помощью широты + -deltaLatitude и долготы + -deltaLongitude.
С помощью формулы haversine вы можете рассчитать расстояния на сфере. Используйте его для каждого найденного места, чтобы получить «точное» расстояние. Таким образом, вы можете проверить, находятся ли два места в пределах определенного радиуса (круг вместо прямоугольника).
источник
Для тестирования является ли широта / долгота в пределах или за пределами ограничивающей круг, вам нужно вычислить расстояние от ссылки широта / долгота в широта / долгота момент вы хотите проверить. Поскольку ваше расстояние составляет 10 км или меньше, я бы попытался использовать эквираугольное приближение, чтобы получить расстояние, а не Haversine из-за простоты. Чтобы узнать расстояние в км:
Важное примечание: широта / долгота в этих формулах указаны в радианах, а не в градусах. Типичное значение EarthRadius составляет 6371 км, что будет возвращать расстояние в единицах км. Теперь это простой тест, если ваше расстояние находится внутри или за пределами круга. Если работает ограничивающий круг, я бы пошел с этим.
Для ограничивающего прямоугольника я бы предположил, что вы хотите, чтобы прямоугольник был определен параллельным экватору. Затем я бы вычислял углы ограничительной рамки, используя расчеты дальности / подшипника (для подшипников 45 градусов, 135 градусов, 225 градусов и 315 градусов). Оттуда я бы предположил, что вы не вокруг полюсов, и используйте точку в тесте полигонов.
источник
Ниже приведен код T-SQL, который я использую для построения ограничительной рамки в SQL-Server 2012. В моем случае я получаю десятичные значения для Lat, Long. Я использую это для быстрого ограничения количества строк, прежде чем использовать
STDistance
функцию SQL, чтобы убедиться, что результаты на самом деле находятся в пределах определенного расстояния. Географические функции очень дороги в SQL Server, поэтому, создав ограничивающий прямоугольник, я могу значительно сократить количество раз его выполнения.источник