Как преобразовать расстояние из градусов в метры?

Я использую OpenLayers с обычной картой меркатора, и я пытаюсь создать образец ограничивающего прямоугольника, найдя сетку точек в широте. Bbox выражается в latlon, например

48.1388,-15.3616,55.2057,-3.9359

Я могу определить расстояние в градусах (например, x: 2,5, y: 2,4) и вычислить точки оттуда. Но я хотел бы выразить это расстояние в метрах (например, 50000), чтобы связать его с мышлением пользователя (люди понимают метры, а не градусы). Как я могу преобразовать это расстояние? Я знаю, как спроецировать точку, но не расстояние.

Спасибо за любые подсказки! Mulone


person Mulone    schedule 05.11.2010    source источник


Ответы (3)


Используйте формулу гаверсинуса, чтобы получить расстояние между двумя точками широты / долготы. Это предполагает, что Земля является сферой (что в большинстве случаев «достаточно хорошо»).

Его реализация в Javascript (беззастенчиво украденная с здесь) выглядит так:

var R = 6371; // km
var dLat = (lat2-lat1).toRad();
var dLon = (lon2-lon1).toRad(); 
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
        Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
var d = R * c;
person blindauer    schedule 05.11.2010
comment
Haversine работает для разных широт, но это противоположно тому, что запрашивает OP. OP хочет отобразить линейное (метровое) расстояние в градусы широты и долготы. - person winwaed; 05.11.2010

Не учитывая слегка несферическую форму земли,

Одна минута широты с севера на юг = 1 морская миля = 6075 футов Итак, один градус = 60 минут = 60 * 6075 футов. В метре 3,28 фута, поэтому один градус = 60 * 6075 / 3,28 метра = 111,128 метра.

В качестве альтернативы, одна минута широты = 1852 метра, поэтому один градус = 60 * 1852 метра = 111120 метров.

Я не уверен, что точнее ...

Для одного градуса долготы сделайте то же самое, но умножьте на косинус (широту), поскольку линии долготы сближаются по мере вашего движения на север.

person Charles Bretana    schedule 05.11.2010

Преобразование между градусами и метрами варьируется по поверхности Земли.

Предполагая, что Земля сферическая, градусы широты = расстояние * 360 / (2 * PI * 6400000)

Обратите внимание, что долгота зависит от широты:

Долгота в градусах = расстояние * 360 * / (2 * PI * cos (широта))

Вышесказанное относится к поверхности Земли и не использует проекцию Меркатора. Если вы хотите работать с прогнозируемым линейным расстоянием, вам нужно будет использовать проекцию Меркатора.

person winwaed    schedule 05.11.2010
comment
А для более общего случая при работе с разными проекциями карт в javascript используйте библиотеку Proj4js с открытым исходным кодом. - который также используется OpenLayers. - person winwaed; 02.01.2011