Wybierając kontury, które wysokości są liczbami całkowitymi?

18

Mam klasę Contours Featureclass z odstępem 0,2 metra. Chcę wybrać tylko te kontury, które są w odstępie 1 m?

Próbowałem użyć następującej składni w oknie dialogowym „Wybierz według atrybutu” (w ArcMap), ale zaznacza wszystkie kontury:

Mod("ELEVATION", 1)=0

Jakie zapytanie mam uruchomić?

Devdatta Tengshe
źródło
Zaoszczędziłam MNIE dużo czasu, naprawdę dzięki! Nigdy nie widziałem kodów zapytań takich jak „Flor”, „Wysokość” i „Mod”.

Odpowiedzi:

22

Prostą sztuczką, aby wybrać tylko wartości całkowite, jest użycie następującej składni:

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

To mnożenie przez 10 powoduje, że wszystkie wartości są całkowite, a następnie wybieramy tylko te, które są wielokrotnościami 10.

Jeśli chcesz wybrać wielokrotność innej liczby, po prostu pomnóż 10 przez przedział.

  • Aby uzyskać kontury w odstępach co 5 m, użyj:

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

  • Aby uzyskać kontury w odstępach co 100 m, użyj:

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

Aktualizacja
Zgodnie z radą Whubera podaną w komentarzu poniżej dodałem funkcję zaokrąglania w wyrażeniu zapytania.

Devdatta Tengshe
źródło
6
Nie sądzę, żebym ufał tym rozwiązaniom. Problem polega na tym, że przy niezintegrowanych przedziałach wynoszących 0,2 baza danych prawdopodobnie przechowuje je jako zmiennoprzecinkowe. W konsekwencji MODwystąpi błąd zaokrąglania zmiennoprzecinkowego - i to jest tutaj krytyczne: jeśli jesteś niski nawet o najmniej znaczącej cyfrze, MODmoże zwrócić niepoprawną wartość (w zależności od tego, jak jest zaimplementowany). Chciałbym zasugerować zaokrąglenie wartości przed zastosowaniem MODjako sposobu zapobiegania tym subtelnym (i podstępnym) błędom.
whuber
Musisz zaokrąglić po pomnożeniu przez 10, ale zanim znajdziesz mod.
smithkm
1
Jeśli chcę wybierać kontury w odstępach 5 m, wzór zaimplementowany jak napisano powyżej wybiera liczby całkowite, które zaokrąglają do liczby, która jest równomiernie podzielna przez 5. Np. Wybrano 14,5 mi 19,5 m, ale nie jest to pożądane. Nie zostały one wybrane, jeśli upuściłem „okrągłą” część funkcji.
opóźnienie
1
@delongtime Jeśli masz kontury, które mają mieć poziomy niezintegrowane, po prostu zmodyfikuj drugi argument, ROUNDaby uzyskać większą precyzję w zaokrąglaniu.
whuber
9

Oto kolejna opcja zapytania. W dużej mierze robi to samo, co odpowiedzi wymienione powyżej, ale jest (moim zdaniem) nieco łatwiejszy do dostosowania do różnych scenariuszy.

Aby wyświetlić dowolny kontur podzielny przez 10

Floor(Elevation/10)=Elevation/10

Aby wyświetlić dowolny kontur podzielny przez 50

Floor(Elevation/50)=Elevation/50

Aby wyświetlić kontury półmetrowe

Floor(Elevation/0.5)=Elevation/0.5

Aby wyświetlić 10-metrowe kontury z dowolnym przesunięciem (np. 10,2, 20,2, 30,2)

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

Pod koniec dnia jest to kolejna opcja do rozważenia.

TGS71
źródło
2

To miał być komentarz do powyższej odpowiedzi - przepraszam .

Składnia będzie się różnić w zależności od typu DB, w którym przechowywane są kontury, ale dane rozwiązanie wydaje się wybierać kontury po zaokrągleniu ich wartości. Na przykład w moim teście uzyskałem wybrany zestaw, który obejmował 0,3 m oraz 0,4 m. W rzeczywistości nie wykluczył żadnej wartości.

To równanie

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

Dał mi wyniki, które wydawały się pasować do tego, o co pytał pytający.

użytkownik23715
źródło
1

Aby uzyskać kontury indeksu, używam tego w kalkulatorze pola:

W 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

Wpisz „c” (bez cudzysłowów) w polu wprowadzania tekstu u dołu okna dialogowego i kliknij OK.

W QGIS

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

„„ poziom ”„ Ustaw na pole wysokości konturu ”200” Ustaw na odstępy konturów indeksu

Zatem: „1” jest konturem indeksu, a „0” nie jest konturem indeksu

carfog81
źródło
0

Pomnóż kontur przez 10, a następnie moduł przez 10, aby ustalić, czy jest reszta. Jeśli nie ma nic innego niż liczba całkowita, w przeciwnym razie jest to liczba zmiennoprzecinkowa.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
źródło