2011-07-21 19 views
8

Tôi đã thử như sau, đầu vào: dữ liệu lat/lon sau đó tôi sẽ tính toán một hộp xung quanh bằng cách, giả sử 50 m, vì vậy +/- 50 m về hướng đông/giá trị hướng bắc.lat/lon để utm để lat/lon là vô cùng thiếu sót, làm thế nào đến?

Bây giờ tôi reconvert nó để lat/lon và với một kịch bản:

http://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py tôi nhận được một kết quả là không thể được, lon trước là khoảng 7, sau đó xung quanh 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) 

Là lỗi trong mã của tôi, hoặc có thể là kịch bản thiếu sót?

Vì vậy, tôi đã cố gắng sử dụng pyproj, chỉ lat/lon để UTM để lat/lon để xem những gì sẽ xảy ra

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

Và đây nó không phải là rất xa như với kịch bản từ trên cao, nhưng nó vẫn đủ mạnh để không thể sử dụng nó. Làm thế nào mà? Tôi có thể làm gì để có được kết quả chính xác hơn?

EDIT:

Tôi chạy kiểm tra() và tất cả các thử nghiệm đều được chuyển.

trong tệp epsg không có nội dung nào như vậy. Gần nhất tôi đã tìm thấy là:

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

no tmerc. Ngoài ra những gì tôi sẽ cần phải vượt qua towgs84 như các thông số? Những cái ở trên?

Trả lời

2

vấn đề của bạn với pyProj âm thanh giống như được mô tả ở đây:

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

đó đã được giải quyết:

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!

Kiểm tra xem bạn có muốn tiếp tục sử dụng pyproj không.

Ngoài ra, chức năng test() của mô-đun có hoạt động không? Bạn đã thử bất kỳ tập lệnh nào đi kèm với nó trong thư mục test chưa?

+0

Những hy vọng rằng Ubuntu 13,04 háo hức sẽ bao gồm một PyProj up-to-date sẽ thấy mình sai lầm. Cài đặt từ nguồn! – Richard

23

tôi đã tạo ra một thư viện chuyển đổi UTM nhỏ cho Python vào tuần trước và tải lên nó vào Python Package Index: http://pypi.python.org/pypi/utm

tôi đã so sánh nó với việc sử dụng pyproj và nó là nhanh hơn và chính xác hơn. Với dữ liệu mẫu của bạn, đây là kết quả:

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

UPDATE: Richards answer dưới đây mô tả các giải pháp thực tế cho vấn đề này.

+0

Cảm ơn bạn! Chỉ hoạt động hoàn hảo –

+0

Cảm ơn bạn đã hét lên, @TBieniek! – Richard

+0

Cảm ơn rất nhiều về việc triển khai này, hoàn toàn có giá trị! – Blackbrook

17

Lỗi trong mã của bạn.

Trước hết, vấn đề PyProj được liệt kê trong một trong các câu trả lời khác là có thật. Bạn nên kiểm tra tệp epsg của mình và đảm bảo tệp bao gồm dòng

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

Lưu ý tham số towgs84.

Sự cố của bạn với PyProj bắt nguồn từ việc sử dụng sai lệnh chiếu.

Nếu chúng tôi mất 47.9941214N, 7.8509671E và convert to UTM chúng tôi nhận được Zone 32, 414278 Easting, 5316286 Northing.

Bạn thực hiện các hoạt động PyProj sau:

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) 

Nhưng, nếu chúng ta tham khảo PyProj documentation, chúng ta thấy như sau:

Gọi một cá thể của lớp Proj với các đối số lon, ý chí lat chuyển đổi lon/lat (theo độ) thành toạ độ chiếu bản đồ gốc x/y (trong mét).

Hãy thử chạy hoạt động PyProj của OP lần nữa, nhưng chuyển đổi thứ tự của các lon/lập luận 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) 

Các hoạt động sẽ đảo ngược chính nó (khá nhiều) một cách hoàn hảo!

Để trả lời phần đầu của câu hỏi của bạn, nếu bạn nhìn vào http://robotics.ai.uiuc.edu/~hyoon24/LatLongUTMconversion.py vào định nghĩa của UTMtoLL, bạn tìm thấy những điều sau đây:

UTMtoLL(ReferenceEllipsoid, northing, easting, zone) 

Tuy nhiên, bạn sử dụng UTMtoLL(23, leftUTM, topUTM, zone) nơi leftUTM là một hướng đông và topUTM là một Hướng về phía bắc .

Vì vậy, trong trường hợp cả tập lệnh đầu tiên và PyProj, bạn đã sử dụng thứ tự các đối số sai.

Đó là một lời nhắc nhở tốt để luôn luôn tăng gấp đôi (hoặc gấp ba lần) kiểm tra công việc của bạn trước khi cho thấy rằng người khác là sai. Điều đó nói rằng, tài liệu của Python là not the greatest và tài liệu của PyProj trong trường hợp này là khó hiểu nhất. Một lời giải thích dựa trên web tốt đẹp của lệnh này và kèm theo các ví dụ về cách sử dụng của nó có lẽ sẽ ngăn chặn sự giận dữ của bạn.

1

Tôi không có vấn đề với pyproj, hãy thử đoạn mã sau

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 
Các vấn đề liên quan