qgis虚拟图层中添加新的字段

文章目录


提示:

1.虚拟图层中添加新的字段

例子:

例子:

sql 复制代码
SELECT p.*, v.cmnnum
FROM 你的图层 AS p
JOIN 顶点 AS v 
ON ST_Distance(p.geometry, v.geometry) < 0.000001
ORDER BY v.cmnnum
  • SELECT p.*, v.cmnnum: 这是关键部分。它表示从"南屏社区01"图层(别名为 p)中选择所有字段p.*),同时从"顶点"图层(别名为 v)中选择 cmnnum 字段。这样,结果中就会包含"南屏社区01"的全部原始属性,并额外添加了一个新字段 cmnnum
  • JOIN ... ON ...: 这是一个基于空间距离的连接。它将"南屏社区01"的每个点(假设是点要素)与距离它极近(< 0.000001度)的"顶点"图层中的点匹配起来。
  • ORDER BY v.cmnnum: 最后,整个结果集按照从"顶点"图层连接过来的 cmnnum 字段进行排序。

小提示 :使用 ST_Distance 进行精确距离匹配有时可能不可靠(比如因精度问题没匹配上)。对于这种"寻找最近点"的操作,使用 ST_ClosestPoint 或空间连接(ST_Intersects, 如果有点落在面内)通常是更稳健的做法。但您的逻辑是正确的。


如何添加其他类型的新字段

在虚拟图层的SQL中,除了通过JOIN从其他表添加字段,您还可以直接在SELECT语句中创建新的计算字段

场景一:从另一个图层连接多个新字段

假设您不仅需要 v.cmnnum,还需要"顶点"图层中的其他字段,比如 v.namev.type

修改后的SQL:

sql 复制代码
SELECT
    p.*,           -- 保留南屏社区01的所有字段
    v.cmnnum,      -- 从顶点图层连接过来的字段1
    v.name,        -- 从顶点图层连接过来的字段2
    v.type         -- 从顶点图层连接过来的字段3
FROM
    南屏社区01 AS p
JOIN
    顶点 AS v ON ST_Distance(p.geometry, v.geometry) < 0.000001
ORDER BY
    v.cmnnum;

方法: 只需在 SELECT 子句中用逗号分隔,逐个列出您想要的字段名即可。

场景二:创建全新的计算字段(例如:给数值字段加单位)

假设"南屏社区01"图层中有一个字段叫 area,您想在结果中创建一个新字段,显示为"XXX 平方米"。

修改后的SQL:

sql 复制代码
SELECT
    p.*,
    v.cmnnum,
    (p.area || ' 平方米') AS area_with_unit, -- 创建一个新计算字段
    (p.population / p.area) AS density      -- 再创建一个计算人口密度的新字段
FROM
    南屏社区01 AS p
JOIN
    顶点 AS v ON ST_Distance(p.geometry, v.geometry) < 0.000001
ORDER BY
    v.cmnnum;

说明:

  • (p.area || ' 平方米') AS area_with_unit:
    • p.area: 获取原始面积值。
    • ||: SQL中的字符串连接运算符,相当于Excel中的 &
    • ' 平方米': 要添加的单位字符串。
    • AS area_with_unit: 将计算结果的列命名为 area_with_unit这是您的新字段名
  • (p.population / p.area) AS density:
    • 这是一个数值计算,用人口除以面积得到人口密度。
    • AS density 将结果列命名为 density
场景三:使用CASE语句创建条件分组字段

假设您想根据"顶点"图层连接过来的 v.cmnnum 值,创建一个新的分类标签。

修改后的SQL:

sql 复制代码
SELECT
    p.*,
    v.cmnnum,
    CASE
        WHEN v.cmnnum BETWEEN 1 AND 100 THEN 'A组'
        WHEN v.cmnnum BETWEEN 101 AND 200 THEN 'B组'
        ELSE '其他组'
    END AS custom_group -- 根据cmnnum的值创建一个新的分组字段
FROM
    南屏社区01 AS p
JOIN
    顶点 AS v ON ST_Distance(p.geometry, v.geometry) < 0.000001
ORDER BY
    v.cmnnum;

说明:

  • CASE...END AS custom_group: 这是一个条件判断语句,会根据 v.cmnnum 的值生成一个新的字符串('A组', 'B组' 或 '其他组')。
  • AS custom_group 将这个条件计算的结果命名为 custom_group 字段。

完整操作步骤

  1. 打开虚拟图层编辑器

    • 在QGIS菜单栏点击 图层 -> 添加图层 -> 添加/编辑虚拟图层...
  2. 编写查询

    • 在"查询"标签页中,将您修改完善后的SQL语句粘贴进去。
    • 确保在"来自图层的表"中,南屏社区01顶点 这两个图层已经被列出并勾选。如果没有,点击"导入"按钮手动添加。
  3. 命名和添加

    • 在"虚拟图层名称"中为您的新图层起一个名字(例如"南屏社区_连接排序后")。
    • 点击"添加"按钮,新的虚拟图层就会加载到您的地图中。这个图层的属性表将完全按照您的SQL语句来生成,包含了您添加的所有新字段,并且数据已排序。
  4. (可选)永久导出

    • 虚拟图层是"虚拟"的,存储在内存中。要永久保存这个结果,可以右键点击 生成的虚拟图层,选择 导出 -> 要素另存为...,然后选择如GeoPackage、Shapefile等格式保存即可。

总而言之,在QGIS虚拟图层中添加新字段的核心就在于灵活运用 SELECT 语句,你可以:

  • 直接选择 现有字段(p.field1, v.field2
  • 连接 其他表来添加字段(JOIN ... ON ...
  • 计算 生成新字段(使用 ||, +, -, /, * 等运算符)
  • 条件判断 生成新字段(使用 CASE ... WHEN ... THEN ... END

希望这些详细的解释和示例能帮助您更好地使用QGIS虚拟图层这个强大工具!


总结