การแปลงพิกัด X, Y เป็น lat / long โดยใช้ pyproj และ Proj.4 จะคืนค่าพิกัดที่ไม่ถูกต้อง


10

ฉันกำลังเขียนสคริปต์หลามที่อ่านไฟล์ XML หลายไฟล์ที่มีพิกัด x และ y และรวมพวกมันทั้งหมดไว้ในไฟล์ csv ไฟล์เดียว ละติจูดและลองจิจูดเป็นฟิลด์บังคับใน csv แต่ฉันมีปัญหาในการแปลงพิกัด x, y ใน Ohio North State Plane 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)

ทั้งสองวิธีข้างต้นคืนผลลัพธ์เหมือนกันอย่างไรก็ตาม lat นี้มีความยาวอยู่ที่ไหนสักแห่งใน Hudson Bay เมื่อฉันพล็อตพิกัดใน ArcMap ละติจูดที่ถูกต้องคือ: -81.142311,41.688205

* โปรดสังเกตว่า lat longs ทั้งหมดจะมีความยาว, 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 พิกัดการฉายแผนที่ดั้งเดิม (เป็นเมตร)

หากคำหลักเพิ่มเติม 'อนุรักษ์ _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)

ปัญหาที่คล้ายกันสามารถพบได้ที่นี่


ขอบคุณมาก. อาร์กิวเมนต์ stor_units ทำเคล็ดลับได้อย่างแน่นอน แต่พิกัดยังคงไม่ถูกต้อง @MerseyViking คำตอบนี้ให้พิกัดที่ถูกต้องกับฉัน ฉันหวังว่าฉันสามารถทำเครื่องหมายคำตอบทั้งสองเป็นคำตอบเพราะพวกเขาทั้งสองช่วย
ไบรอัน

ถ้าผู้คนตอบคำถามของฉันมากกว่าคำตอบ @ geographika มันจะออกมาทุกอย่าง :) ยินดีด้วยทุกอย่างที่ทำไป
MerseyViking

เนื่องจากลิงก์ใช้งานไม่ได้อาจเป็นประโยชน์หากคุณแสดงว่าคุณสามารถเขียนได้:p1 = Proj( init="epsg:3734", preserve_units=True )
BenjaminGolder

4

ที่จริงฉันกำลังพยายามทำสิ่งเดียวกันยกเว้นด้วยตารางระนาบของรัฐโอไฮโอใต้และฉันก็ได้พบคำถามของคุณ ฉันได้รับผลลัพธ์ที่ผิดพลาดด้วย 3735 ตอนนี้ฉันได้รับผลลัพธ์ที่ถูกต้องด้วย 3729 ฉันคาดว่าถ้าคุณเปลี่ยนจาก 3734 เป็น 3728 คุณจะได้ผลลัพธ์ที่ถูกต้อง

EPSG: 3728: NAD83 (NSRS2007) / Ohio North (ftUS) EPSG: 3729: NAD83 (NSRS2007) / Ohio South (ftUS) EPSG: 3734: NAD83 / Ohio North (ftUS) EPSG: 3735: NAD83 / Ohio South (ftUS)

ฉันใช้ lat ที่คุณให้มายาวและปิดโดยน้อยกว่าหนึ่งฟุต

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

P2 (-81.142311,41.688205)

(2339326.6558868014, 739401.4226131936)

vs 2339327.3, 739400.91

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.