2010-11-05 4 views
12

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

48.1388,-15.3616,55.2057,-3.9359 

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

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

ответ

13

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

реализация Javascript его (бессовестно украден из here) выглядит следующим образом:

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; 
+1

Haversine работает для разных широт, но является противоположностью того, что запрашивает OP. OP хочет сопоставить линейное (метр) расстояние до градусов широты и долготы. – winwaed

5

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

в качестве альтернативы, одна минута от широты = 1852 метров Так один градус = 60 * 1852 м = 111,120 м

Я не уверен, что более точным ...

Fo r Одна степень долготы, сделайте то же самое, но умножьте на Косинус (Широта), так как линии долготы сближаются, когда вы двигаетесь на север.

0

Трансформация между градусами и метрами изменяется по поверхности Земли.

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

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

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

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

+0

И для более общего случая при работе с различными картографическими проекциями в JavaScript, пользоваться открытой исходным кодом Proj4js библиотеки. - который также используется OpenLayers. – winwaed

Смежные вопросы