преобразовать широту и долготу в систему координат x и y с помощью python

У меня есть файл со значениями широты и долготы, которые я хочу преобразовать в x и y в км. Я хочу измерить расстояние от каждой точки.

например, я делаю первые точки широты и долготы (которые равны 51,58, -124,6 соответственно)

to (0,0) в моей системе x и y, поэтому в основном я хочу узнать, что это за другие точки и их местоположение из начала координат, поэтому я хочу найти, что 51,56 (широта) -123,64 (длинное) находится в (x , y) в км и так далее для остальной части файла.

Я хочу сделать все это на Python, есть ли какой-нибудь код сортировки?

Я нашел сайты в Интернете, например

http://www.whoi.edu/marine/ndsf/cgi-bin/NDSFutility.cgi?form=0&from=LatLon&to=XY

я точно хочу, я хочу сделать, я просто не знаю, как они это делают.


person learner    schedule 07.07.2014    source источник
comment
Вы понимаете, что Земля - ​​это сфера, поэтому нет общего решения вашей проблемы (другими словами, мир не может быть отображен на 2D-поверхность без некоторых приближений / искажений). Вы можете найти нужные формулы на странице movable-type.co.uk/scripts/ latlong.html   -  person Floris    schedule 07.07.2014
comment
Если вы хотите попытаться решить проблему самостоятельно, вам следует начать писать код и возвращаться, когда у вас возникнет конкретный узкий вопрос. Если вам просто нужен готовый ответ, вероятно, это не тот сайт, на котором стоит искать.   -  person Mark Reed    schedule 07.07.2014
comment
@ Флорис технически сплюснутый сфероид, но ваша точка зрения остается в силе :)   -  person dabhaid    schedule 07.07.2014
comment
Связанный сайт сделан на HTML, и вы можете перевести его на js питон?   -  person Noelkd    schedule 07.07.2014
comment
@Floris в этом случае я предполагаю, что это определенное место, которое соответствует моим данным, является плоским, только для этого преобразования lat, long в x и y   -  person learner    schedule 08.07.2014


Ответы (5)


Следующее позволяет вам приблизиться (ответ в км). Если вам нужно быть лучше этого, вам нужно усерднее работать над математикой - например, следуя некоторым из приведенных ссылок.

import math
dx = (lon1-lon2)*40000*math.cos((lat1+lat2)*math.pi/360)/360
dy = (lat1-lat2)*40000/360

Имена переменных должны быть довольно очевидными. Это дает вам

dx = 66.299 km (your link gives 66.577)
dy = 2.222 km (link gives 2.225)

После того, как вы выберете координаты (например, lon1, lat1) в качестве источника, должно быть легко увидеть, как вычислить все остальные координаты XY.

Примечание. Фактор 40 000 - это длина окружности Земли в км (измеренная по полюсам). Это приближает вас. Если вы посмотрите на источник предоставленной вами ссылки (вам придется немного покопаться, чтобы найти javascript, который находится в отдельном файле), вы обнаружите, что они используют более сложное уравнение:

function METERS_DEGLON(x)
{  
   with (Math)
   {
      var d2r=DEG_TO_RADIANS(x);
      return((111415.13 * cos(d2r))- (94.55 * cos(3.0*d2r)) + (0.12 * cos(5.0*d2r)));
   }
}

function METERS_DEGLAT(x)
{
   with (Math)
   {
      var d2r=DEG_TO_RADIANS(x);
      return(111132.09 - (566.05 * cos(2.0*d2r))+ (1.20 * cos(4.0*d2r)) - (0.002 * cos(6.0*d2r)));
   }
}

Мне кажется, что они на самом деле принимают во внимание тот факт, что Земля не совсем сфера ... ошибки. Уверен, с их формулами погрешности меньше ...

person Floris    schedule 07.07.2014
comment
зачем нужно умножать на 40000 - person learner; 08.07.2014
comment
@learner, вероятно, потому что окружность Земли составляет 40075,017 км (экваториальная) и 40007,86 км (меридиональная) - person Virgiliu; 28.09.2015
comment
@yoshi, действительно, я говорю об этом в своем ответе. Мне кажется, я припоминаю, что в какой-то момент размер метра составлял 1/40000000 длины окружности Земли, измеренной по полюсам. - person Floris; 28.09.2015
comment
Мне пришлось изменить lon2-lon1 на lon1-lon2, чтобы получить правильный результат. Опускают ли американцы отрицательное значение своей долготы? - person R2-D2; 11.04.2019
comment
@ R2-D2 похоже на мою опечатку ... очевидно, порядок должен быть одинаковым для dx и dy! - person Floris; 11.04.2019

Проекции UTM указаны в метрах. Таким образом, вы можете использовать что-то вроде библиотеки utm по этой ссылке:

https://pypi.python.org/pypi/utm

Погуглите python lat lon до UTM, и вы увидите несколько вариантов.

Зоны UTM имеют ширину 6 градусов долготы и начинаются с 0 в нулевом меридиане. Начало каждой зоны UTM находится на экваторе (ось x) с осью y на самом западном градусе долготы. Это делает сетку положительной на север и восток. Вы можете рассчитать свое расстояние по этим результатам. Значения наиболее точны в середине зоны UTM.

Вы также должны знать, на каких базах данных основаны ваши исходные значения широты, и использовать те же данные при преобразовании.

person ScottO    schedule 07.07.2014

Расстояние между точками GPS можно определить с помощью формулы расстояния по большому кругу. Широта и долгота находятся в геодектической системе координат, поэтому вы не можете просто преобразовать в плоскую 2D-сетку и использовать евклидовы расстояния. Вы можете преобразовать достаточно близкие точки в приблизительную сетку, взяв произвольную точку, такую ​​как ваша (X, Y), установив ее в начало координат (как вы это сделали), а затем используя расстояние большого круга вместе с пеленг для построения точек относительно друг друга на плоскости, но это приближение.

person dabhaid    schedule 07.07.2014

если бы вы использовали 3D-систему, эти функции подойдут:

def arc_to_deg(arc):
    """convert spherical arc length [m] to great circle distance [deg]"""
    return float(arc)/6371/1000 * 180/math.pi

def deg_to_arc(deg):
    """convert great circle distance [deg] to spherical arc length [m]"""
    return float(deg)*6371*1000 * math.pi/180

def latlon_to_xyz(lat,lon):
    """Convert angluar to cartesian coordiantes

    latitude is the 90deg - zenith angle in range [-90;90]
    lonitude is the azimuthal angle in range [-180;180] 
    """
    r = 6371 # https://en.wikipedia.org/wiki/Earth_radius
    theta = math.pi/2 - math.radians(lat) 
    phi = math.radians(lon)
    x = r * math.sin(theta) * math.cos(phi) # bronstein (3.381a)
    y = r * math.sin(theta) * math.sin(phi)
    z = r * math.cos(theta)
    return [x,y,z]

def xyz_to_latlon (x,y,z):
    """Convert cartesian to angular lat/lon coordiantes"""
    r = math.sqrt(x**2 + y**2 + z**2)
    theta = math.asin(z/r) # https://stackoverflow.com/a/1185413/4933053
    phi = math.atan2(y,x)
    lat = math.degrees(theta)
    lon = math.degrees(phi)
    return [lat,lon]
person qrtLs    schedule 27.05.2019

Вы можете использовать UTM:

pip install utm

Вот пример:

>>> import utm
>>> utm.from_latlon(51.2, 7.5)
(395201.3103811303, 5673135.241182375, 32, 'U')

Возврат имеет вид (EASTING, NORTHING, ZONE_NUMBER, ZONE_LETTER).

Примечания

Он также работает с массивами NumPy:

>>> utm.from_latlon(np.array([51.2, 49.0]), np.array([7.5, 8.4]))
(array([395201.31038113, 456114.59586214]),
 array([5673135.24118237, 5427629.20426126]),
 32,
 'U')

И наоборот:

>>> utm.to_latlon(340000, 5710000, 32, 'U')
(51.51852098408468, 6.693872395145327)
person Peque    schedule 17.02.2021