如何使用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.