Chuyển đổi từ DMS sang DD bằng Python trong Máy tính trường?


12

Tôi cần chuyển đổi lat / long được biểu thị bằng độ, phút và giây trong dữ liệu thành độ thập phân. Ví dụ: trong dữ liệu, chúng được liệt kê là N335042,06 trong cột Latitude và W86031.04 trong cột Kinh độ. Tôi đã thực hiện vấn đề này trước khi tôi tạo một tập lệnh chuyển đổi DMS thành DD và ngược lại, vì vậy tôi đoán tôi có thể sử dụng các bit từ đó. Nhưng vấn đề tôi gặp phải là làm thế nào để bỏ qua (vì không có từ nào tốt hơn) 'N' và 'W' trong dữ liệu? Tôi có thể bỏ qua chúng? Và DMS được liệt kê tất cả cùng nhau mà không có bất kỳ biểu tượng hoặc không gian.

Tôi có thể sử dụng len(), range(), split()để xác định phần nào để đọc từ giá trị? Ví dụ, có thể làm như sau?

N335042,06 ở đâu, 33 = độ 50 = phút 42,06 = giây ...?

Tôi đã xem qua này bài viết ESRI, nhưng đó là trong VB. Có thể sẽ sử dụng nó làm tài liệu tham khảo nhưng một số thuật ngữ / cú pháp khác với Python.

Mã cuối cùng hoạt động!

# Pre-logic
def latDD(x):
  D = int(x[1:3])
  M = int(x[3:5])
  S = float(x[5:])
  DD = D + float(M)/60 + float(S)/3600
  return DD

# Expression
latDD(!Latitude!)

4
7 tháng sau tôi phải tìm ra cách để làm điều này một lần nữa và kết thúc ở đây, cảm ơn vì đã đăng mã của bạn! :)
blah238

Câu trả lời:


8
  • Hãy xem phần cắt lát trong hướng dẫn Python . Bạn có thể lấy một loạt các ký tự từ một chuỗi bằng cách sử dụng cú pháp cắt, ví dụ D = int(x[1:2]).

    Trong vài giây, hãy thử S = float(x[5:]). Điều này sẽ lấy tất cả các ký tự bắt đầu từ chỉ mục 5 đến cuối chuỗi, trong trường hợp bạn có các giá trị độ dài thay đổi trong vài giây.

  • Các !FieldName!cú pháp chỉ có giá trị trong hộp biểu. Bạn phải xác định một hàm trong phần "tiền logic" lấy các giá trị của các trường bạn muốn và trả về giá trị mong muốn. Sau đó, trong hộp biểu thức, gọi hàm và truyền vào các giá trị trường bằng !FieldName!cú pháp. Xem tính toán ví dụ trường trong trợ giúp.

Sau đây là những gì tôi có dưới dạng mã của mình trong Máy tính trường, nhưng nó chỉ ra rằng dòng đầu tiên có lỗi. Có ý kiến ​​gì không? x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600Và trong khối mã tôi có!Latitude! = DD
kaoscify

Cập nhật câu trả lời với nhiều thông tin hơn, hãy thử và cho chúng tôi biết nếu bạn vẫn gặp sự cố.
blah238

Cảm ơn! Đến đó, nhưng tôi đã gặp một lỗi mới. Tôi đã chỉnh sửa bài viết đầu tiên của mình với mã mới. Suy nghĩ? Xin lỗi, tôi chưa quen với Python, nhưng tôi thực sự đánh giá cao sự giúp đỡ của bạn!
kaoscify

Hãy thử return DDthay vì return latDD.
blah238

1
Tôi đã gỡ bỏ print DDvà thay đổi return latDDđể return DDgiống như bạn đề nghị, và nó làm việc! Cảm ơn!
kaoscify

-1

Chỉ sử dụng Máy tính trường mà không có logic trước, tôi có thể làm việc này cho tôi. Chuỗi tôi có một định dạng hơi khác với một số khoảng trắng.

Giá trị LAT như "dd mm ss.ss" và tôi đã sử dụng giá trị này trong máy tính.

float (! LAT! [0: 2]) + float (! LAT! [3: 5]) / 60+ float (! LAT! [6:]) / 3600

giá trị dài như "-dd mm ss.ss" và giá trị này dài

float (! LONG_! [0: 3]) + float (! LONG_! [4: 6]) / 60+ float (! LONG_! [7:]) / 3600


2
Trên thực tế, giá trị dài của bạn là sai vì bạn có thể có độ âm và phút và giây tích cực. Sử dụng tốt hơn một biểu thức chính quy import retrong tiền logic
Mike T
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.