Простые расчеты для работы с широтой/долготой и км расстояния?

Есть ли простой расчет, который я могу сделать, который преобразует km в значение, которое я могу добавить к плану lat или lon, чтобы вычислить ограничивающий прямоугольник для поиска? Он не обязательно должен быть полностью точным.

Например: если мне дали лат/лон для Лондона, Англии (51.5001524, -0.1262362), и я хотел рассчитать, что будет лат на 25 км к востоку/западу от этой точки, а что будет в 25 км к северу/к югу от этой точки, что мне нужно сделать, чтобы преобразовать 25 км в десятичную цифру, чтобы добавить к значениям выше?

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

Edit:

Мой первоначальный поиск "lat lon" не вернул этот результат:

Как вычислить ограничительную рамку для заданного местоположения lat/lng?

Принятый ответ кажется адекватным для моих требований.

Ответ 1

Примерные преобразования:

  • Широта: 1 град = 110,574 км
  • Долгота: 1 град = 111.320 * cos (широта) km

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

Источник: http://en.wikipedia.org/wiki/Latitude

Внимание. Помните, что координаты latlong выражены в градусах, а функция cos на большинстве (всех?) языков обычно принимает радианы, поэтому степень конверсии радианов.

Ответ 3

Если вы используете Java, Javascript или PHP, то есть библиотека, которая точно выполнит эти вычисления, используя забавно сложную (но все же быструю) тригонометрию:

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

Ответ 4

http://www.jstott.me.uk/jcoord/ - используйте эту библиотеку

            LatLng lld1 = new LatLng(40.718119, -73.995667);
            LatLng lld2 = new LatLng(51.499981, -0.125313);
            Double distance = lld1.distance(lld2);
            Log.d(TAG, "Distance in kilometers " + distance);

Ответ 6

Спасибо Джиму Льюису за его великолепный ответ, и я хотел бы проиллюстрировать это решение своей функцией в 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))