文章目录
提示:
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.name
和 v.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
字段。
完整操作步骤
-
打开虚拟图层编辑器:
- 在QGIS菜单栏点击 图层 -> 添加图层 -> 添加/编辑虚拟图层...。
-
编写查询:
- 在"查询"标签页中,将您修改完善后的SQL语句粘贴进去。
- 确保在"来自图层的表"中,
南屏社区01
和顶点
这两个图层已经被列出并勾选。如果没有,点击"导入"按钮手动添加。
-
命名和添加:
- 在"虚拟图层名称"中为您的新图层起一个名字(例如"南屏社区_连接排序后")。
- 点击"添加"按钮,新的虚拟图层就会加载到您的地图中。这个图层的属性表将完全按照您的SQL语句来生成,包含了您添加的所有新字段,并且数据已排序。
-
(可选)永久导出:
- 虚拟图层是"虚拟"的,存储在内存中。要永久保存这个结果,可以右键点击 生成的虚拟图层,选择 导出 -> 要素另存为...,然后选择如GeoPackage、Shapefile等格式保存即可。
总而言之,在QGIS虚拟图层中添加新字段的核心就在于灵活运用 SELECT
语句,你可以:
- 直接选择 现有字段(
p.field1, v.field2
) - 连接 其他表来添加字段(
JOIN ... ON ...
) - 计算 生成新字段(使用
||
,+
,-
,/
,*
等运算符) - 条件判断 生成新字段(使用
CASE ... WHEN ... THEN ... END
)
希望这些详细的解释和示例能帮助您更好地使用QGIS虚拟图层这个强大工具!
总结
