Прості розрахунки для роботи з lat / lon та км відстані?


119

Чи є простий розрахунок, який я можу зробити, який перетворить км у значення, яке я можу додати до плавника lat або lon, щоб обчислити обмежувальне поле для пошуку? Це не потрібно бути абсолютно точним.

Наприклад: якби мені дали лат / лон для Лондона, Англія (51.5001524, -0.1262362), і я хотів би порахувати, який би Lat був у 25 км на схід / захід від цієї точки, і який лон був би в 25 км на північ / південь від цього пункт, що мені потрібно зробити, щоб перетворити 25 км у десятковий, щоб додати значення вище?

Я шукаю загальне правило, тобто: 1км == +/- 0.XXX

Редагувати:

Мій початковий пошук "lat lon" не повернув цей результат:

Як обчислити обмежувальне поле для заданого місця розташування лат / лінг?

Прийнята відповідь видається адекватною моїм вимогам.


Відповіді:


221

Орієнтовні конверсії:

  • Широта: 1 град = 110.574 км
  • Довгота: 1 град = 111,320 * cos (широта) км

Це не зовсім коректно для полярного сплющення Землі - для того, напевно, ви хочете отримати складнішу формулу, використовуючи довідковий еліпсоїд WGS84 (модель, що використовується для GPS). Але помилка, мабуть, незначна для ваших цілей.

Джерело: http://en.wikipedia.org/wiki/Latitude

Попередження : Майте на увазі, що довгасті координати виражаються в градусах, тоді як cosфункція в більшості (всіх?) Мов зазвичай приймає радіани, тому необхідна ступінь перетворення радіанів .


Ви маєте на увазі cos (довготу) у другій формулі?
Одіс

1
Як ви придумали це? Мені чогось не вистачає. Чи можете ви, будь ласка, детальніше розглянути обчислення довготи? Ty
Одіс

5
@Odys: Якщо ви порівнюєте дві точки, що лежать на одній лінії довготи (північ / південь), вони лежать на великому колі, а коефіцієнт перетворення - це просто полярна окружність Землі, поділена на 360 градусів. Але для вимірювань схід-захід різне, тому що (крім екватора) ви не вимірюєте «велике коло», тому «окружність» на заданій широті менша. І поправочним коефіцієнтом виявляється косинус широти.
Джим Льюїс

17
Моє пояснення: cos(0°) = 1=> Тому для розрахунку на екваторі не застосовується коригувальний коефіцієнт. Довжини там найширші. cos(90°) = 0=> На полюсах довготи зустрічаються в одній точці. Немає відстані для обчислення.
Jenny O'Reilly

4
@Stijn: Вам потрібно перетворити від градусів до радіанів, перш ніж викликати Math.cos ().
Джим Льюїс

5

Якщо ви використовуєте Java, Javascript або PHP, то існує бібліотека, яка точно зробить ці обчислення, використовуючи кумедно складну (але все ж швидку) тригонометрію:

http://www.jstott.me.uk/jcoord/


Зараз на сайті є бібліотека.
півзахист99

2
Посилання розірвано!
chatzich

Для PHP ви можете використовувати цю вилку: github.com/dvdoug/PHPCoord
dearsina


1

Цікаво, що я не бачив згадок про координати UTM.

https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system .

Принаймні, якщо ви хочете додати км до тієї ж зони, це повинно бути прямим (на Python: https://pypi.org/project/utm/ )

utm.from_latlon і utm.to_latlon.


Дякуємо за посилання на utm. Шокуюче, що, здається, взагалі немає документації.
Westworld

1

Дякую Джиму Льюїсу за його чудову відповідь, і я хотів би проілюструвати це рішення моєю функцією в Swift:

func getRandomLocation(forLocation location: CLLocation, withOffsetKM offset: Double) -> CLLocation {
        let latDistance = (Double(arc4random()) / Double(UInt32.max)) * offset * 2.0 - offset
        let longDistanceMax = sqrt(offset * offset - latDistance * latDistance)
        let longDistance = (Double(arc4random()) / Double(UInt32.max)) * longDistanceMax * 2.0 - longDistanceMax

        let lat: CLLocationDegrees = location.coordinate.latitude + latDistance / 110.574
        let lng: CLLocationDegrees = location.coordinate.longitude + longDistance / (111.320 * cos(lat / .pi / 180))
        return CLLocation(latitude: lat, longitude: lng)
    }

У цій функції для перетворення відстані я використовую такі формули:

latDistance / 110.574
longDistance / (111.320 * cos(lat / .pi / 180))

Я думаю, це має бути "lat * pi / 180"
magamig

1

Чому б не використати правильно сформульовані геопросторові запити ???

Ось довідкова сторінка SQL-сервера на геопросторовій функції STContains:

https://docs.microsoft.com/en-us/sql/t-sql/spatial-geography/stcontains-geography-data-type?view=sql-server-ver15

або якщо ви не хочете використовувати перетворення коробки та радіану, ви завжди можете використовувати функцію відстані, щоб знайти потрібні вам точки:

DECLARE @CurrentLocation geography; 
SET @CurrentLocation  = geography::Point(12.822222, 80.222222, 4326)

SELECT * , Round (GeoLocation.STDistance(@CurrentLocation ),0) AS Distance FROM [Landmark]
WHERE GeoLocation.STDistance(@CurrentLocation )<= 2000 -- 2 Km

Майже будь-яка база даних має бути подібною функціональністю.

Якщо ви правильно здійснили геопросторову індексацію, ваші пошукові запити були б набагато швидшими, ніж підхід, який ви використовуєте


1
Будь ласка, знайдіть хвилину, щоб прочитати допомогу з редагування у довідковому центрі . Форматування на переповнення стека відрізняється від інших сайтів.
Дхарман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.