Selezione di contorni quali altezze sono numeri interi?


18

Ho una Contour Featureclass, con un intervallo di 0,2 metri. Vorrei selezionare solo quei contorni, che sono ad intervalli di 1 m?

Ho provato a utilizzare la seguente sintassi nella finestra di dialogo "Seleziona per attributo" (in ArcMap), ma seleziona tutti i contorni:

Mod("ELEVATION", 1)=0

Quale query devo eseguire?


Ho risparmiato MOLTO tempo per me, davvero grazie! Non ho mai visto questi codici di query come "Flor", "Elevation" e "Mod".

Risposte:


22

Il semplice trucco per selezionare solo i valori interi è utilizzare la sintassi seguente:

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

Questa moltiplicazione per 10 rende tutti i valori Integer e quindi selezioniamo solo quelli multipli di 10.

Nel caso in cui desideri selezionare Multipli di un altro numero, basta moltiplicare 10 per l'intervallo.

  • Per ottenere contorni a intervalli di 5 m, utilizzare:

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

  • Per ottenere contorni a intervalli di 100 m utilizzare:

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

Aggiornamento
Secondo i consigli di Whuber forniti nel commento seguente, ho aggiunto la funzione di arrotondamento nell'espressione della query.


6
Non credo che mi fiderei di queste soluzioni. Il problema è che con intervalli non integrali di 0,2, è probabile che il database li memorizzi come float. Di conseguenza MODsarà soggetto a un errore di arrotondamento in virgola mobile - e questo è fondamentale qui: se sei basso anche dalla cifra meno significativa, MODpotrebbe restituire un valore errato (a seconda di come è implementato). Vorrei suggerire di arrotondare i valori prima di applicare MODcome modo per prevenire questi errori sottili (e insidiosi).
whuber

Devi arrotondare dopo aver moltiplicato per 10, ma prima di trovare la mod.
smithkm,

1
Se voglio selezionare i contorni a intervalli di 5 m, la formula implementata come scritto sopra seleziona i non interi che si arrotondano a un numero che è uniformemente divisibile per 5. Ad esempio , sono stati selezionati 14,5 me 19,5 m, ma ciò non è desiderato. Questi non sarebbero stati selezionati se avessi lasciato cadere la parte 'Round' della funzione.
delongtime

1
@delongtime Se hai contorni che dovrebbero avere livelli non integrali, modifica semplicemente il secondo argomento ROUNDper ottenere una maggiore precisione nell'arrotondamento.
whuber

9

Ecco un'altra opzione di query. In gran parte fa lo stesso delle risposte sopra elencate ma (a mio avviso) è un po 'più facile da personalizzare per diversi scenari.

Per visualizzare qualsiasi profilo divisibile per 10

Floor(Elevation/10)=Elevation/10

Per visualizzare qualsiasi contorno divisibile per 50

Floor(Elevation/50)=Elevation/50

Per visualizzare contorni di mezzo metro

Floor(Elevation/0.5)=Elevation/0.5

Per visualizzare contorni di 10 metri con un offset arbitrario (ad es. 10.2, 20.2, 30.2)

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

Alla fine, questa è solo un'altra opzione da considerare.


2

Questo doveva essere un commento sulla risposta sopra - scusate .

La sintassi potrebbe variare a seconda del tipo di DB in cui sono memorizzati i contorni, ma la soluzione data sembra selezionare i contorni dopo aver arrotondato i loro valori. Quindi, ad esempio, nel mio test questo ha ottenuto un set selezionato che includeva .3 m e .4 m. In realtà, non ha escluso nessuno dei valori.

Questa equazione

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

Mi ha dato risultati che sembravano corrispondere a ciò che l'interrogante stava chiedendo.


1

Per ottenere i contorni dell'indice, lo uso su Field Calculator:

In 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

Digita "c" (senza virgolette) nel campo di immissione testo nella parte inferiore della finestra di dialogo e fai clic su OK.

In QGIS

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

"" livello "" Imposta il campo di altezza del profilo "200" Imposta l'intervallo dei contorni dell'indice

Quindi: "1" è un contorno indice e "0" non è un contorno indice


0

Moltiplica il contorno per 10 e quindi il modulo per 10 per determinare se c'è un resto. Se non c'è resto di quanto sia un numero intero, altrimenti è float.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.