Konturen auswählen Welche Höhen sind ganze Zahlen?

18

Ich habe eine Contours-Feature-Class mit einem Intervall von 0,2 Metern. Ich möchte nur die Konturen auswählen, die im Abstand von 1 m liegen.

Ich habe versucht, im Dialogfeld "Nach Attributen auswählen" (in ArcMap) die folgende Syntax zu verwenden, aber es werden alle Konturen ausgewählt:

Mod("ELEVATION", 1)=0

Welche Abfrage soll ich ausführen?

Devdatta Tengshe
quelle
Viel Zeit für mich gespart, wirklich danke! Nie gesehene Abfragecodes wie "Flor", "Elevation" und "Mod".

Antworten:

22

Der einfache Trick, um nur Ganzzahlwerte auszuwählen, besteht darin, die folgende Syntax zu verwenden:

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

Diese Multiplikation mit 10 ergibt alle Werte als Ganzzahl, und dann wählen wir nur diejenigen aus, die Vielfache von 10 sind.

Wenn Sie ein Vielfaches einer anderen Zahl auswählen möchten, multiplizieren Sie einfach 10 mit dem Intervall.

  • Um Konturen in Abständen von 5 m zu erhalten, verwenden Sie:

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

  • Um Konturen im Abstand von 100 m zu erhalten, verwenden Sie:

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

Aktualisieren
Gemäß dem Ratschlag von Whuber im Kommentar unten habe ich die Rundungsfunktion im Abfrageausdruck hinzugefügt.

Devdatta Tengshe
quelle
6
Ich glaube nicht, dass ich diesen Lösungen vertrauen würde. Das Problem ist, dass die Datenbank bei nicht ganzzahligen Intervallen von 0,2 diese wahrscheinlich als Floats speichert. Infolgedessen MODkann es zu Gleitkomma-Rundungsfehlern kommen - und das ist hier entscheidend: Wenn Sie um die niedrigste Stelle niedriger sind, wird MODmöglicherweise der falsche Wert zurückgegeben (abhängig von der Implementierung). Ich möchte vorschlagen, die Werte vor dem Anwenden zu rundenMOD , um diese subtilen (und heimtückischen) Fehler zu verhindern.
whuber
Sie müssen nach dem Multiplizieren mit 10 runden, aber bevor Sie den Mod finden.
Smithkm
1
Wenn ich Konturen in 5-Meter-Intervallen auswählen möchte, wählt die oben implementierte Formel Nicht-Ganzzahlen aus, die auf eine Zahl gerundet sind, die gleichmäßig durch 5 teilbar ist. Beispielsweise wurden 14,5 m und 19,5 m ausgewählt, dies ist jedoch nicht erwünscht. Diese wurden nicht ausgewählt, wenn ich den 'Runden'-Teil der Funktion fallen ließ.
Verspätung
1
@delongtime Wenn Sie Konturen haben, die nicht ganzzahlige Ebenen haben sollen, ändern Sie einfach das zweite Argument von ROUND, um eine genauere Rundung zu erzielen.
Whuber
9

Hier ist eine weitere Abfrageoption. Es funktioniert im Wesentlichen genauso wie die oben aufgeführten Antworten, ist jedoch (meiner Meinung nach) ein bisschen einfacher für verschiedene Szenarien anzupassen.

Anzeige einer durch 10 teilbaren Kontur

Floor(Elevation/10)=Elevation/10

Anzeige einer durch 50 teilbaren Kontur

Floor(Elevation/50)=Elevation/50

Anzeige von halben Meter Konturen

Floor(Elevation/0.5)=Elevation/0.5

Anzeige von 10 Meter Konturen mit beliebigem Versatz (zB 10.2, 20.2, 30.2)

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

Letztendlich ist dies nur eine weitere Option, die Sie in Betracht ziehen sollten.

TGS71
quelle
2

Dies sollte ein Kommentar zu der obigen Antwort sein - sorry .

Die Syntax variiert je nach Art der DB, in der Ihre Konturen gespeichert sind. Die angegebene Lösung scheint jedoch Konturen auszuwählen, nachdem ihre Werte gerundet wurden. So wurde zum Beispiel in meinem Test ein ausgewähltes Set mit 0,3 m und 0,4 m erreicht. Tatsächlich wurde keiner der Werte ausgeschlossen.

Diese Gleichung

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

Hat mir Ergebnisse geliefert, die mit denen des Fragestellers übereinstimmen.

user23715
quelle
1

Um Indexkonturen zu erhalten, verwende ich diese im Feldrechner:

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

'Geben Sie "c" (ohne Anführungszeichen) in das Texteingabefeld am unteren Rand des Dialogfelds ein und klicken Sie auf OK.

In QGIS

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

"" level "" Auf Konturhöhe einstellen field "200" Auf Intervall der Indexkonturen einstellen

Dann: "1" ist eine Indexkontur und "0" ist keine Indexkontur

carfog81
quelle
0

Multiplizieren Sie die Kontur mit 10 und den Modul mit 10, um festzustellen, ob ein Rest vorhanden ist. Wenn es keinen Rest gibt als eine ganze Zahl, dann ist es float.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
quelle