Selecionando contornos que alturas são números inteiros?

18

Eu tenho uma classe Featureclass, com um intervalo de 0,2 metros. Desejo selecionar apenas os contornos, que estão no intervalo de 1 m?

Tentei usar a seguinte sintaxe na caixa de diálogo 'Selecionar por atributo' (no ArcMap), mas ela seleciona todos os contornos:

Mod("ELEVATION", 1)=0

Que consulta devo executar?

Devdatta Tengshe
fonte
Economizou muito tempo para mim, muito obrigado! Nunca vi esses códigos de consulta como "Flor", "Elevação" e "Mod".

Respostas:

22

O truque simples para selecionar apenas valores inteiros é usar a seguinte sintaxe:

Mod(Round("ELEVATION", 0)*10, 10)=0

Essa multiplicação por 10 torna todos os valores Inteiros e, em seguida, selecionamos apenas aqueles que são múltiplos de 10.

Caso deseje selecionar Múltiplos de algum outro número, basta multiplicar 10 pelo intervalo.

  • Para obter contornos em intervalos de 5 m, use:

    Mod(Round("ELEVATION",0) * 10, 50)=0

  • Para obter contornos em um intervalo de 100 m, use:

    Mod(Round("ELEVATION", 0) * 10, 1000)=0

Atualização
Conforme o conselho de Whuber fornecido no comentário abaixo, eu adicionei a função de arredondamento na expressão de consulta.

Devdatta Tengshe
fonte
6
Eu não acho que confiaria nessas soluções. O problema é que, com intervalos não integrais de 0,2, o banco de dados provavelmente os armazena como flutuadores. Conseqüentemente MOD, estará sujeito a um erro de arredondamento de ponto flutuante - e isso é fundamental aqui: se você estiver com um valor muito baixo, mesmo pelo dígito menos significativo, MODpoderá retornar o valor errado (dependendo de como ele é implementado). Gostaria de sugerir o arredondamento dos valores antes de aplicar MODcomo forma de impedir esses erros sutis (e insidiosos).
whuber
Você precisa arredondar depois de multiplicar por 10, mas antes de encontrar o mod.
precisa
1
Se eu quiser selecionar contornos em intervalos de 5m, a fórmula implementada conforme descrito acima seleciona não-números inteiros que arredondam para um número que é igualmente divisível por 5. Por exemplo , 14,5m e 19,5m foram selecionados, mas isso não é desejado. Eles não foram selecionados se eu largar a parte 'Round' da função.
Delongtime
1
@delongtime Se você tiver contornos que deveriam ter níveis não integrais, basta modificar o segundo argumento ROUNDpara obter mais precisão no arredondamento.
whuber
9

Aqui está outra opção de consulta. Em grande parte, faz o mesmo que as respostas listadas acima, mas é (na minha opinião) um pouco mais fácil de personalizar para diferentes cenários.

Para exibir qualquer contorno divisível por 10

Floor(Elevation/10)=Elevation/10

Para exibir qualquer contorno divisível por 50

Floor(Elevation/50)=Elevation/50

Para exibir contornos de meio metro

Floor(Elevation/0.5)=Elevation/0.5

Para exibir contornos de 10 metros com um deslocamento arbitrário (por exemplo, 10.2, 20.2, 30.2)

Floor((Elevation-0.2)/10)=(Elevation-0.2)/10

No final do dia, essa é apenas outra opção a considerar.

TGS71
fonte
2

Isso deveria ser um comentário sobre a resposta acima - desculpe .

A sintaxe varia de acordo com o tipo de banco de dados em que seus contornos estão armazenados, mas a solução fornecida parece escolher contornos após arredondar seus valores. Por exemplo, no meu teste, isso alcançou um conjunto selecionado que incluía 0,3 m e 0,4 m. De fato, não excluiu nenhum dos valores.

Esta equação

Mod(Round("ELEVATION" * 10, 0), 2)=0

Deu-me resultados que pareciam coincidir com o que o questionador estava perguntando.

user23715
fonte
1

Para obter contornos de índice, eu uso isso na calculadora de campo:

No ARCMAP

dim dIndexInterval
dim dCont
dim i
dim j
dim k
dim c

dIndexInterval = 200 ' set to interval of index contours
dCont = [level] ' Set to contour height field

i = ROUND(dCont, 0) * 10
j = dIndexInterval * 10
k = i MOD j

if k = 0 then
 c = 1 ' is an index contour
else
 c = 0 ' is not an index contour
end if

'Digite "c" (sem aspas) no campo de entrada de texto na parte inferior da caixa de diálogo e clique em OK.

No QGIS

if(((round("level", 0) * 10) % (200 * 10)) = 0, 1, 0)

"" level "" Defina para o campo de altura do contorno "200" Defina para o intervalo dos contornos do índice

Então: "1" é um contorno de índice e "0" não é um contorno de índice

carfog81
fonte
0

Multiplique o contorno por 10 e, em seguida, o módulo por 10 para determinar se há um restante. Se não houver resto, é um número inteiro; caso contrário, é flutuante.

def contour_class(contour):
    if ((contour * 10) % 10) == 0:
        return "Integer"
    else:
        return "Float"

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
fonte