引用 Z 以外的字母表…即 AA、AB

问题描述 投票:0回答:3

我不知道我在用 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 等

我不介意它是否有限制或每个参考文献都需要输入。

python ascii qgis
3个回答
0
投票

这里有一个快速代码,用于生成字母标识符池(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'}

0
投票

我想出了这个并且它有效......我只需要在每次循环 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)’

0
投票

将字母转换为数字,对于操作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"))
© www.soinside.com 2019 - 2024. All rights reserved.