使用Field Calculator中的Python从DMS转换为DD?


12

我需要将表示为度,分和秒的纬度/经度转换十进制度。例如,在数据中,它们在“纬度”列中列为N335042.06,在“经度”列中列为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

Answers:


8
  • 看一下Python教程中有关切片的部分。您可以使用切片语法(例如)从字符串中获取一系列字符D = int(x[1:2])

    尝试几秒钟S = float(x[5:])。如果您具有可变的长度值(秒),则它将抓取从索引5开始到字符串末尾的所有字符。

  • !FieldName!语法仅在表达式框中有效。您必须在“逻辑前”部分中定义一个函数,该函数接受所需字段的值并返回所需的值。然后,在表达式框中,调用函数并使用!FieldName!语法传递字段值。请参阅帮助中的“ 计算字段”示例

以下是我在字段计算器中所拥有的代码,但这表明第一行有错误。有任何想法吗? 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
2011年

更新后的答案提供了更多信息,请尝试一下,如果仍有问题,请告诉我们。
blah238

谢谢!到达那里,但是遇到新的错误。我已经用新代码编辑了我的第一篇文章。有什么想法吗?抱歉,我是Python的新手,但非常感谢您的帮助!
kaoscify

尝试return DD代替return latDD
blah238

1
我删除print DD并更改return latDDreturn DD您的建议,并且成功了!谢谢!
kaoscify

-1

仅使用没有预逻辑的字段计算器,我就能为我完成这项工作。我使用的字符串格式有些不同,有些空格。

像“ dd mm ss.ss”这样的LAT值,我在计算器中使用过。

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

长值,例如“ -dd mm ss.ss”,并且此值长

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


2
实际上,您的long值是错误的,因为您可能具有负的度数和正的分钟和秒。最好import re在逻辑前使用正则表达式
Mike T
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.