我不知道我在用 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”后变为小写
有没有办法修改这段代码,使其以excel列的样式继续超出Z? 即 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)’
将字母转换为数字,对于操作excel等很有用
def letter_to_number(letra):
i = 0
letra = letra.upper()
# Letras de A a Z
for primeiro in string.ascii_uppercase:
# print(primeiro, " = ", i)
if primeiro == letra:
return i
i = i + 1
for primeiro in string.ascii_uppercase:
# Letras de A a Z
for segundo in string.ascii_uppercase:
# Letras de AA a ZZ
# print(primeiro + segundo, " = ", i)
if (primeiro + segundo) == letra:
return i
i = i + 1
print(letter_to_number("A"))
print(letter_to_number("Z"))
print(letter_to_number("AA"))
print(letter_to_number("AB"))
print(letter_to_number("BA"))
print(letter_to_number("BZ"))
print(letter_to_number("ZA"))
print(letter_to_number("ZZ"))