我不知道我在用Python做什么。我唯一的经验是在QGIS中,我也是一个新手。我试图寻找适合我正在寻找的东西,但它没有意义,也许是因为它是如何坐在QGIS
我正在使用QGIS制图来创建Atlas风格的网格。这导致我发现以下代码应用于虚拟层…
select *, char(r+64) || 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)
从https://gis.stackexchange.com/questions/344161/how-to-create-a-grid-with-customized-labels-in-qgis
我的问题是,char(r+64)位继续进入ASCII符号,然后在到达"Z"后小写
是否有办法修改这段代码,使其继续超越Z在excel列的风格?如AA、AB等
我不介意它是否有限制,或者每个引用都需要输入。
下面是生成字母标识符池(a ->Z, AA->ZZ)的快速代码。有702个标识符,如果你需要更多的标识符,你可以很容易地按照同样的原则添加更多的级别。
from string import ascii_uppercase
from itertools import product
pool = list(map(''.join, product(['']+list(ascii_uppercase), list(ascii_uppercase))))
>>> pool
['A', 'B', 'C', ..., 'ZY', 'ZZ']
如果你想将数字映射到那些,你可以使用:dict_pool = dict(enumerate(pool))
{0: 'A',
1: 'B',
2: 'C',
3: 'D',
...
699: 'ZX',
700: 'ZY',
701: 'ZZ'}
我想出了这个,它的工作....我只需要在每次循环到26时添加额外的行。
‘select *,
Case
when r<=26 then char(r+64) || ROW_NUMBER() OVER(PARTITION BY r)
when r between 27 and 52 then 'A' || char(r+38) || ROW_NUMBER() OVER(PARTITION BY r)
else 'B' || char(r+12) || ROW_NUMBER() OVER(PARTITION BY r)
end as newID
from
(SELECT *,DENSE_RANK() OVER (ORDER BY round( st_minx(geometry)/0.02) asc) as r
FROM Grid
ORDER BY round(ST_minY(geometry)/0.02) DESC,
round( ST_minX(geometry)/0.02) ASC)’