แปลงจาก DMS เป็น DD โดยใช้ Python ใน Field Calculator หรือไม่


12

ฉันต้องการแปลง lat / long ที่แสดงเป็นองศานาทีและวินาทีในข้อมูลเป็นองศาทศนิยม ตัวอย่างเช่นในข้อมูลจะแสดงรายการเป็น N335042.06 ในคอลัมน์ Latitude และ W86031.04 ในคอลัมน์ลองจิจูด ฉันทำปัญหานี้มาแล้วก่อนที่ฉันจะสร้างสคริปต์ที่แปลง DMS เป็น DD และในทางกลับกันดังนั้นฉันเดาว่าฉันสามารถใช้บิตจากสิ่งนั้นได้ แต่ปัญหาที่ฉันมีก็คือวิธีที่จะเพิกเฉย (สำหรับคำที่ดีกว่า) 'N' และ 'W' ในข้อมูล? ฉันข้ามได้ไหม และ DMS จะแสดงรายการทั้งหมดเข้าด้วยกันโดยไม่มีสัญลักษณ์หรือช่องว่าง

ฉันสามารถใช้len(), range(), split()สามารถระบุสิ่งที่เป็นส่วนหนึ่งที่จะอ่านจากค่าที่? ตัวอย่างเช่นสามารถทำสิ่งต่อไปนี้?

N335042.06 โดยที่ 33 = องศา 50 = นาที 42.06 = วินาที ... ?

ฉันมาข้ามนี้บทความ ESRI แต่ก็ใน VB อาจจะใช้เป็นข้อมูลอ้างอิง แต่คำศัพท์ / ไวยากรณ์บางอย่างแตกต่างจาก Python

รหัสสุดท้ายที่ใช้งานได้!

# 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 เดือนต่อมาฉันต้องหาวิธีที่จะทำอีกครั้งและลงเอยที่นี่ขอบคุณที่โพสต์โค้ดของคุณ! :)
blah238

คำตอบ:


8
  • ลองดูที่ส่วนที่เกี่ยวกับการแบ่งในส่วนงูหลามกวดวิชา D = int(x[1:2])คุณสามารถคว้าช่วงของตัวละครจากสตริงโดยใช้ไวยากรณ์หั่นเช่น

    S = float(x[5:])วินาทีลอง นี้จะคว้าตัวละครทั้งหมดที่เริ่มต้นที่ดัชนี 5 ถึงจุดสิ้นสุดของสตริงในกรณีที่คุณมีค่าความยาวตัวแปรสำหรับวินาที

  • !FieldName!ไวยากรณ์จะใช้ได้เฉพาะในกล่องแสดงออก คุณต้องกำหนดฟังก์ชั่นในส่วน "พรีตรรกะ" ที่ใช้ในค่าของเขตข้อมูลที่คุณต้องการและส่งกลับค่าที่ต้องการ จากนั้นในกล่องนิพจน์เรียกใช้ฟังก์ชันและส่งผ่านค่าฟิลด์โดยใช้!FieldName!ไวยากรณ์ ดูการคำนวณตัวอย่างฟิลด์ในความช่วยเหลือ

ต่อไปนี้เป็นสิ่งที่ฉันมีเหมือนโค้ดของฉันใน Field Calculator แต่มันบ่งบอกว่าบรรทัดแรกมีข้อผิดพลาด ความคิดใด ๆ x = (!Latitude!) D = int(x[1:3]) M = int(x[3:5]) S = float(x[5:10]) DD = D + float(M)/60 + float(S)/3600และในบล็อกรหัสฉันมี!Latitude! = DD
kaoscify

อัปเดตคำตอบพร้อมข้อมูลเพิ่มเติมลองทำและแจ้งให้เราทราบหากคุณยังมีปัญหา
blah238

ขอบคุณ! การเดินทาง แต่ฉันพบข้อผิดพลาดใหม่ ฉันแก้ไขโพสต์แรกด้วยรหัสใหม่ คิด? ขออภัยฉันยังใหม่กับ Python แต่ฉันซาบซึ้งในความช่วยเหลือของคุณจริงๆ!
kaoscify

ลองแทนreturn DD return latDD
blah238

1
ฉันลบprint DDและเปลี่ยนreturn latDDไปreturn DDเหมือนที่คุณแนะนำและมันใช้งานได้! ขอบคุณ!
kaoscify

-1

การใช้เครื่องคิดเลขภาคสนามโดยไม่มีตรรกะมาก่อนฉันก็สามารถทำงานนี้ให้ฉันได้ สตริงที่ฉันมีแตกต่างกันเล็กน้อยกับบางช่องว่าง

ค่า LAT เช่น "dd mm ss.ss" และฉันใช้สิ่งนี้ในเครื่องคิดเลข

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

ค่าแบบยาวเช่น "-dd mm ss.ss" และนี่ยาว

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


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