使用 QGIS 的场景下景,如果图层里已有点要素,几何是经纬度(十进制度 dd),想在属性表里生成一列 dms 字符串,用来做标注或导出给别人看,可以参考下面的操作步骤。

总体思路

直接在 字段计算器 里,用表达式把 $x / $y 这两个几何字段转成 度° 分' 秒" 这种形式的文本字段。

操作步骤

  1. 打开图层属性表 → 点击 字段计算器
  2. 新建字段

    • 字段名:如 lon_dms / lat_dms
    • 字段类型:文本(string)
  3. 在表达式框里:

    • 经度用 $x 那个公式
    • 纬度用 $y 那个公式
  4. 点“确定”,字段生成完就可以用来标注或导出。

经纬度转 dms 的表达式

经度($x)示例:

(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
   )
|| '"'

纬度($y)示例:

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

表达式快速拆解

  • CASE WHEN $x < 0 THEN '-':保留正负号
  • floor(abs($x)):度(整数部分)
  • ((abs($x)) - floor(abs($x))) * 60:分(小数部分 × 60)
  • 再取小数部分 × 60:秒
  • substr(..., 1, 5):秒保留几位小数(这里是大约 2 ~ 3 位)

想改精度的时候,只要调整 substr 的长度即可。

备注

  • 如果坐标不是经纬度(比如投影坐标),记得先在 项目 CRS / 图层 CRS 里确认是 WGS84(EPSG:4326)或其他地理坐标系;
  • 想加上 E / W、N / S 这种字母,可以在 CASE 里多拼一点字符串。