Широта от долготы до широты долгота / долгота, почему?

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

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

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 <>

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

4 ответа

На прошлой неделе я создал небольшую библиотеку преобразования 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)

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

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

Прежде всего, проблема 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 - восток, а topUTM - север.

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

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

У меня нет никаких проблем с 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

Ваша проблема с 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 каталог?

Другие вопросы по тегам