широта от долготы до широты до широты, почему? - PullRequest
10 голосов
/ 21 июля 2011

Я попробовал следующее, введите: широта / долгота данных, затем я вычислю прямоугольник вокруг него, скажем, 50 м, так что +/- 50 м по значению восток / север.

Теперь я переконвертирую его в лат / долг и с помощью скрипта:

http://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py Я получаю результат, которого просто не может быть, раньше было около 7, потом около 2.

zone, easting, northing = LLtoUTM(23, location.get_lat(), location.get_lon()) 

topUTM = northing + error
bottomUTM = northing - error
leftUTM = easting - error
rightUTM = easting + error
left, top = UTMtoLL(23, leftUTM, topUTM, zone)

Ошибка в моем коде, или, может быть, скрипт содержит ошибки?

Итак, я попытался использовать pyproj, просто lat / lon для utm к lat / lon, чтобы увидеть, что происходит

>>> p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> p
<pyproj.Proj object at 0x7ff9b8487dd0>
>>> x,y = p(47.9941214, 7.8509671)
>>> print x,y
5159550.36822 1114087.43925
>>> print p(x,y,inverse=True)
(47.971558538495991, 7.8546573140162605)

И здесь это не так уж далеко, как со сценарием, приведенным выше, но все равно кажется достаточно сильным, чтобы не использовать его.Как так?Что я могу сделать, чтобы получить более точные результаты?

РЕДАКТИРОВАТЬ:

Я запустил test (), и все тесты пройдены.

в файле epsg такой вещи нет.Самое близкое, что я нашел, было это:

<32632> +proj=utm +zone=32 +ellps=WGS84 +datum=WGS84 +units=m +no_defs <>

no tmerc.Кроме того, что мне нужно передать towgs84 в качестве параметров?Те, что выше?

Ответы [ 4 ]

33 голосов
/ 06 января 2013

На прошлой неделе я создал небольшую библиотеку UTM-преобразования для Python и загрузил ее в индекс пакетов Python: http://pypi.python.org/pypi/utm

Я сравнил это с использованием pyproj, и это быстрее и точнее. Учитывая ваши данные выборки, это результат:

>>> import utm

>>> u = utm.from_latlon(47.9941214, 7.8509671)
>>> print u
(414278, 5316285, 32, 'T')

>>> print utm.to_latlon(*u)
(47.994157948891505, 7.850963967574302)

ОБНОВЛЕНИЕ: Ричардс ответ ниже описывает реальное решение этой проблемы.

22 голосов
/ 04 сентября 2013

Ошибка в вашем коде.

Во-первых, проблема PyProj, указанная в одном из других ответов, является реальной.Вам следует проверить файл epsg и убедиться, что он содержит строку

<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <>

Обратите внимание на параметр towgs84.

Ваша проблема с PyProj связана с неправильным использованием команды проецирования.

Если мы возьмем 47.9941214N, 7.8509671E и преобразовать в UTM , мы получим Зону 32, 414278 Восток, 5316286 Север.

Вы выполняете следующие операции PyProj:

p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> x,y = p(47.9941214, 7.8509671)
>>> print x,y
5159550.36822 1114087.43925
>>> print p(x,y,inverse=True)
(47.971558538495991, 7.8546573140162605)

Но, если мы обратимся к документации PyProj , мы увидим следующее:

Вызов экземпляра класса Proj с аргументами lon, lat преобразует lon / lat(в градусах) в x / y координаты проекции собственной карты (в метрах).

Попробуем снова запустить операции PyProj OP, но переключим порядок аргументов lon / lat:

p = pyproj.Proj(proj='utm', zone=32, ellps='WGS84')
>>> x,y = p(7.8509671, 47.9941214)
>>> print x,y
414278.16731 5316285.59492
>>> print p(x,y,inverse=True)
(7.850967099999812, 47.994121399999784)

Эта операция отлично (в значительной степени) переворачивается!

Чтобы ответить на первую часть вашего вопроса, если вы посмотрите в http://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py определение UTMtoLL, вы обнаружите следующее:

UTMtoLL(ReferenceEllipsoid, northing, easting, zone)

Пока вы используете UTMtoLL(23, leftUTM, topUTM, zone) где leftUTM - это Easting, а topUTM - это Northing.

Таким образом, в случае вашего первого скрипта и PyProj вы использовали неправильный порядок аргументов.

Этохорошее напоминание всегда проверять свою работу дважды (или трижды), прежде чем предположить, что кто-то другой ошибается.Тем не менее, документация Python не самая лучшая , и документация PyProj в этом случае в лучшем случае загадочна.Хорошее сетевое объяснение этой команды и сопровождаемые примерами ее использования, вероятно, предотвратили бы беспокойство с вашей стороны.

2 голосов
/ 21 июля 2011

Ваша проблема с pyProj звучит так же, как описанная здесь:

http://code.google.com/p/pyproj/issues/detail?id=3

, которая решена:

solved! in epsg file there must be

<2392> +proj=tmerc +lat_0=0 +lon_0=24 +k=1.000000 +x_0=2500000 +y_0=0 +ellps=intl +towgs84=-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37 +units=m +no_defs no_defs <>

note the towgs84 parameter!

Проверьте этот поток, если хотите продолжать использовать pyproj.

Также, работает ли функция test() модуля?Вы пробовали какой-либо из сценариев, которые идут с ним в каталоге test?

1 голос
/ 15 мая 2017

У меня нет проблем с pyproj, попробуйте следующий код

from pyproj import Proj

Lat = 52.063098675
Lon = -114.132980348 #Calgary

ZoneNo = "11" #Manually input, or calcuated from Lat Lon
myProj = Proj("+proj=utm +zone="+ZoneNo+",\
+north +ellps=WGS84 +datum=WGS84 +units=m +no_defs") #north for north hemisphere
UTMx, UTMy = myProj(Lon, Lat)

########################################

#UTM ==> Lat Lon:
ZoneNo = "11" #Manually input or from other sources
myProj = Proj("+proj=utm +zone="+\
ZoneNo+", +north +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
Lon2, Lat2 = myProj(UTMx, UTMy,inverse=True)

print Lat2
print Lon2
...