Как мне найти широту / длину, которая равна х км восток / запад от заданной широты / длины? - PullRequest
0 голосов
/ 06 октября 2009

У меня есть две заданные точки широты и долготы. Например, предположим, что у меня есть две позиции (point_1 и point_2) в координатах (lat1, lon1) и (lat2, lon2). Я хотел бы рассчитать третью точку, которая находится на той же широте, что и точка point_2, но на расстоянии x км к востоку или западу от точки point_2. Таким образом, третья точка будет иметь ту же широту, что и точка_2, но другую долготу в зависимости от расстояния х (в километрах), другими словами, точка_3 будет (широта 2, долг?) Я пишу это в IDL, но любой другой язык или формулы будут очень приветствоваться.

Спасибо

Ответы [ 2 ]

1 голос
/ 06 октября 2009

Вы нигде не используете пункт 1, не так ли? Скажем, наша точка P = (широта, долгота)

Первое правило таких проблем: нарисуй картинку! Из поперечного сечения Земли вы можете видеть, что радиус окружности с центром на оси Земли, проходящей через ваши две точки, равен R*cos(lat). (R - радиус Земли. Надеюсь, вам не нужно считать Землю эллипсоидом здесь.) Следовательно, длина x занимает угол (в градусах) 360*x/(2*pi*R*cos(lat)). Тогда вы хотите новую точку:

P' = ( lat, lon +- 180*x/(2Rcos(lat)) )

Я предполагаю, что вы используете -180 до 0 для западной долготы, поэтому у вас есть +/- для востока / запада. Вы должны проверить, если вам нужно обернуть вокруг. Псевдо-код:

if (lon < -180)
   lon += 360
else if (long > 180)
   lon -= 360

Просто для удовольствия: если вы заботитесь о том, чтобы земля была эллипсоидальной, радиус круга (вместо R * cos (lat)):

1/sqrt(tan^2 lat / Rp^2 + 1 / Re^2)

где Rp - полярный радиус, а Re - экваториальный радиус. Если Rp = Re, это сводится к исходной формуле, поскольку 1 + tan^2 lat = sec^2 lat

0 голосов
/ 31 июля 2017
import math

R = 6378.1 #Radius of the Earth
brng = 1.57 #Bearing is 90 degrees converted to radians.
d = 15 #Distance in km

#lat2  52.20444 - the lat result I'm hoping for
#lon2  0.36056 - the long result I'm hoping for.

lat1 = math.radians(52.20472) #Current lat point converted to radians
lon1 = math.radians(0.14056) #Current long point converted to radians

lat2 = math.asin( math.sin(lat1)*math.cos(d/R) +
     math.cos(lat1)*math.sin(d/R)*math.cos(brng))

lon2 = lon1 + math.atan2(math.sin(brng)*math.sin(d/R)*math.cos(lat1),
             math.cos(d/R)-math.sin(lat1)*math.sin(lat2))

lat2 = math.degrees(lat2)
lon2 = math.degrees(lon2)

print(lat2)
print(lon2)
...