如何使用QGIS字段计算器以度分秒(DMS)为单位获取纬度/经度?


9

我想出了以下表达式,可将5.1234转换为5°7`24.24“

toint($ x)|| '°'|| toint(((($ x)-toint($ x))* 60)||'`'|| substr((tostring(((((($ x))-toint($ x))* 60)-toint(((($ x)-toint($ x))* 60))* 60),1,5)|| “”

问题是:对于5.1234之类的某些点,它可以工作。但是对于其他人却不是。我怀疑问题在于整数转换会舍入小数位数而不是将其截断。

还有其他选择吗?谢谢。


我可以建议一种解决方法。不是最佳选择,但是如果您现在陷入困境,则可以完成工作。右键单击并另存为CSV。在Excel或Google文档中打开CSV,然后输入您的公式(应该更简洁)。删除除唯一标识符和转换后的DMS字符串以外的所有字段。保存。将表与现有图层连接起来就可以了。
spacethoughts

1
负输入时要小心。
ub

只是为了补充spacespacethought的答案:向下舍入到最接近的程度将在Excel中使用FLOOR()函数工作。
Micha 2012年

Answers:


3

我喜欢表达你放在一起-可能没有办法在QGIS 1.8,但在QGIS 1.9开发有一个floor()四舍五入函数这轮下跌。对于D°M'S'':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || floor(((abs($x)) - floor (abs($x))) * 60) ||'\'' || substr( (tostring((((abs($x)) - floor (abs($x))) * 60) - floor(((abs($x)) - floor (abs($x))) * 60)) * 60),1,5) || '"'

请注意转义的撇号(\')。

对于D°M.MMM':

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' || ((abs($x) - floor(abs($x))) * 60) ||'\''

要限制显示的小数分钟数,请在下面的表达式中用数字位数替换#:

(CASE WHEN $x < 0 THEN '-' ELSE '' END) || floor (abs($x)) || '° ' ||  format_number( (abs($x) - floor(abs($x))) * 60, #) ||'\'

只是出于好奇,度,分的公式看起来如何?
钉头锤,2015年

增加了一个例子;这可以在QGIS 2.6(可能还有2.0和更高版本)中使用,但是现在可能会有更优雅的格式化功能。
Simbamangu 2015年

1
只是一个陷阱:您的公式仅适用于Easting和Northing的正值。负数太小。我不知道如何区分0.5°E和0.5°W。floor(+/- 0.5)将始终为0,而​​不是-0。
AndreJ 2015年

啊啊 测试不足的陷阱...这也是我在南半球工作的情况。即将更新。
Simbamangu 2015年

1

模运算符可以用来进行截断,但是结果表达式将非常难看。使用字符串替换是更漂亮的方法,但是不幸的是,QGIS没有公开任何strpos或类似的函数。使用regexp_replace($x, '\\..*', '')得到整体的一部分,并regexp_replace($x, '^[0-9]*\\.', '')得到小数部分。使用toreal而不是toint第二个表达式进行计算,以确保不会进行舍入。


2
没有strpos函数,但现在有它;)github.com/qgis/Quantum-GIS/commit/…–
Nathan W,

tsk tsk tsk,那么多空白噪声。
lynxlynxlynx 2012年

是的,请忽略那一点,只是与新功能无关的清理工作。
内森·W

丑陋的...将尝试解决它。
Obsidianz
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.