如何修改QGIS虚拟层代码让网格标签超出Z后按Excel列规则显示为AA、AB等
适配Excel列名规则的QGIS虚拟层网格编号代码
以下代码适配QGIS虚拟层默认的SpatiaLite语法,最多支持到ZZ编号(对应最多702行网格),足够绝大多数场景使用:
SELECT *, -- 生成Excel风格的行字母编号 CASE WHEN r <= 26 THEN char(r + 64) ELSE char((r - 1) / 26 + 64) || char((r - 1) % 26 + 65) END || ROW_NUMBER() OVER(PARTITION BY r) as newID FROM ( SELECT *, DENSE_RANK() OVER (ORDER BY round( ST_minY(geometry)/0.02) desc) as r FROM Grid ORDER BY round(ST_minY(geometry)/0.02) DESC, round(ST_minX(geometry)/0.02) ASC )
逻辑说明
- 完全兼容原代码的网格排序规则,不需要调整原有空间计算参数
- 行号
r≤26时和原逻辑一致输出A-Z - 行号
r>26时,先计算高位字母(对应第几个26行大组),再计算低位字母(对应组内第几个),拼接后得到AA、AB…AZ、BA…ZZ的编号
扩展方案(可选)
如果需要支持3位编号(最多18278行,覆盖AAA到ZZZ的编号区间),可以把CASE分支扩展为以下写法:
CASE WHEN r <= 26 THEN char(r + 64) WHEN r <= 702 THEN char((r - 1) / 26 + 64) || char((r - 1) % 26 + 65) ELSE char((r - 1) / 676 + 64) || char(((r - 1) % 676) / 26 + 65) || char((r - 1) % 26 + 65) END
使用注意
- 代码中的
Grid请替换为你自己的网格图层名称 - 代码中的
0.02是网格步长匹配参数,如果你创建的网格单位不是度、或者步长有修改,同步调整这个值即可
内容的提问来源于stack exchange,提问作者Tom Hussey
相关产品推荐
相关产品推荐

