Перетворення координат X, Y в лат / довге за допомогою pyproj і Proj.4 повертає неправильні координати


10

Я пишу сценарій python, який читає кілька XML-файлів, що містять координати x і y, і об'єднує їх у один файл csv. Широта та Довгота - обов'язкові поля в csv, але у мене виникають труднощі при перетворенні координат x, y в штаті Огайо, штат Північна Держава usFt, до WGS84.

>>> p = Proj(r'+proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs') #Nad83 State Plane Ohio North US Feet Proj object using parameters
>>> p(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)
>>> p1 = Proj(init="epsg:3734") #Nad83 State Plane Ohio North US Feet Proj object using EPSG code
>>> p1(739400.91,2339327.3,inverse=True)
(-80.138057868777224, 60.278230707978487)

Обидва вищезазначені методи дають однаковий результат, однак ця давній час знаходиться десь у Гудзоновій бухті. Коли я будувати координати в ArcMap, правильна довжина ширини: -81.142311,41.688205.

* Зверніть увагу на те, що всі тривалість Lat надається довга, lat, оскільки такий порядок використовує Proj

Хтось знає, чому я отримав би неправильні координати від Proj.4 та pyproj?

Відповіді:


8

Я отримую ті ж результати, що і @geographika, коли запускаю gdaltransformі інструмент proj.4 cs2cs:

$ gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
739400.9 2339327.3             
-87.3195485720169 45.9860670658218 0

cs2cs +proj=lcc +lat_1=41.7 +lat_2=40.43333333333333 +lat_0=39.66666666666666 +lon_0=-82.5 +x_0=600000 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=us-ft +no_defs +to +proj=lonlat +datum=WGS84
739400.9 2339327.3
87d19'10.375"W 45d59'9.841"N 0.000

Повернення координат x і y точки, однак, дає результат, який ви бачите в ArcMap:

gdaltransform -s_srs EPSG:3734 -t_srs EPSG:4326
2339327.3 739400.9
-81.1423086719059 41.6882035384526 0

Тож вам потрібно буде зробити візуальну перевірку, щоб переконатися, що у вас координати x і y є правильними. Це проблема, яку я мав у минулому, коли ви отримуєте два подібні результати, ви ставите її до помилки округлення або чогось іншого.


19

PyProj передбачає, що ваші координати знаходяться в метрах. Я б здогадувався, що причиною цього є щось, що стосується ніг / метрів.

Викликаючи екземпляр класу Proj з аргументами lon, lat перетворить lon / lat (у градусах) у x / y координати проекції натурної карти (у метрах)

Якщо необов'язкове ключове слово'serve_units 'є True, одиниці в координатах проектування карти не змушують бути метрами.

http://pyproj.googlecode.com/svn/trunk/docs/pyproj.Proj-class.html

Ваші початкові координати в футах? Коли ви завантажуєте дані в ArcMap, які одиниці використовує карта?

Це зближує координати трохи ближче:

p1 = Proj(init="epsg:3734")
#1 foot = 0.3048 meters
conv = 0.3048
print p1(739400.91 * conv,2339327.3 * conv,inverse=True)
(-87.3195533069909, 45.98605408134072)

Подібне питання можна знайти тут .


Дуже дякую. Аргумент save_units, безумовно, зробив трюк, але координати все ще неправильні. @MerseyViking Ця відповідь дала мені правильні координати. Я б хотів, щоб я міг позначити обидві відповіді як відповідь, тому що вони обоє допомагали.
Брайан

Добре, якщо люди підтримають відповідь @ geographika більше, ніж мої, це все вийде :) Рада, що все працювало тхо.
MerseyViking

оскільки посилання розірвано, можливо, буде корисно показати, що ви можете написати:p1 = Proj( init="epsg:3734", preserve_units=True )
BenjaminGolder

4

Я насправді намагався зробити те ж саме, за винятком сітки літакової площі штату ОГ, і я натрапив на ваше запитання. Я отримував неправильні результати з 3735, тепер я отримую правильні результати з 3729. Я очікую, що якщо ви зміните з 3734 на 3728, ви отримаєте правильні результати.

EPSG: 3728: NAD83 (NSRS2007) / Північний штат Огайо (ftUS) EPSG: 3729: NAD83 (NSRS2007) / Південний штат Огайо (ftUS) EPSG: 3734: NAD83 / Північний штат Огайо (ftUS) EPSG: 3735: NAD83 / Південний штат Огайо (ftUS)

Я використав ваш наданий лат, довгий і я вийшов менш ніж на одну ногу.

p2 = pyproj.Proj (init = "epsg: 3728" ,serve_units = True)

p2 (-81.142311,41.688205)

(2339326.6558868014, 739401.4226131936)

проти 2339327.3, 739400.91

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.