Hangi yüksekliklerin tamsayı olduğu konturları seçmek?


18

0.2 metrelik bir aralığa sahip Kontür Özelliği var. Sadece 1 m aralığındaki Konturları seçmek ister miyim?

'Özniteliğe Göre Seç' iletişim kutusunda (ArcMap'te) aşağıdaki sözdizimini kullanmayı denedim, ancak tüm konturları seçiyor:

Mod("ELEVATION", 1)=0

Hangi sorguyu çalıştırmalıyım?


Benim için çok zaman kazandım, gerçekten teşekkürler! "Flor", "Yükseklik" ve "Mod" gibi sorgu kodlarını hiç görmedim.

Yanıtlar:


23

Yalnızca Tamsayı değerlerini seçmenin basit hilesi, aşağıdaki sözdizimini kullanmaktır:

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

Bu 10 ile Çarpma, tüm değerleri Tamsayı yapar ve daha sonra sadece 10'un katları olanları seçeriz.

Başka bir sayının Katlarını seçmek istiyorsanız, aralıkla 10'u çarpmanız yeterlidir.

  • 5 m aralıklarla kontur elde etmek için şunu kullanın:

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

  • 100 m aralıklarla kontur elde etmek için şunu kullanın:

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

Güncelleme
Aşağıdaki yorumda verilen Whuber'ın tavsiyelerine göre, sorgu ifadesinde yuvarlama işlevini ekledim.


6
Bu çözümlere güveneceğimi sanmıyorum. Sorun, integral olmayan 0,2 aralıklarla, veritabanının bunları kayan noktalı olarak depolamasıdır. Sonuç MODolarak kayan nokta yuvarlama hatasına maruz kalacaktır - ve bu kritiktir: en küçük anlamlı basamakta bile düşükseniz, MODyanlış değeri döndürebilir (nasıl uygulandığına bağlı olarak). Bu ince (ve sinsi) hataları önlemenin bir yolu olarak uygulamadan önce değerlerin yuvarlanmasını öneririm MOD.
whuber

10 ile çarptıktan sonra, modu bulmadan önce yuvarlamanız gerekir.
smithkm

1
5 metrelik aralıklarla konturları seçmek istersem, yukarıda yazıldığı gibi uygulanan formül, 5 ile eşit olarak bölünebilen bir sayıya yuvarlanan tamsayıları seçmez. Örneğin , 14.5m ve 19.5m seçildi, ancak bu istenmiyor. Fonksiyonun 'Yuvarlak' kısmını düşürdüysem bunlar seçilmedi.
delongtime

1
@delongtime İntegral olmayan seviyelere sahip olması gereken konturlarınız varsa ROUND, yuvarlamada daha fazla hassasiyet elde etmek için ikinci argümanını değiştirmeniz yeterlidir .
whuber

9

İşte başka bir sorgu seçeneği. Büyük ölçüde yukarıda listelenen cevaplarla aynı şeyi yapar, ancak (bence) farklı senaryolar için özelleştirilmesi biraz daha kolaydır.

10'a bölünebilir herhangi bir kontur görüntülemek için

Floor(Elevation/10)=Elevation/10

50'ye bölünebilir herhangi bir kontur görüntülemek için

Floor(Elevation/50)=Elevation/50

Yarım metre konturları görüntülemek için

Floor(Elevation/0.5)=Elevation/0.5

10 metrelik konturları arbiter ofsetle görüntülemek için (örn. 10.2, 20.2, 30.2)

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

Günün sonunda, bu sadece dikkate alınması gereken başka bir seçenektir.


2

Bu yukarıdaki cevaba bir yorum olması gerekiyordu - üzgünüm .

Sözdizimi, Konturlarınızın depolandığı DB türüne bağlı olarak değişecektir, ancak verilen çözüm, değerlerini yuvarladıktan sonra konturları seçiyor gibi görünmektedir. Örneğin, testimde bu, 0,3 m ve .4 m içeren seçilmiş bir set elde etti. Aslında, hiçbir değeri hariç tutmadı.

Bu denklem

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

Bana, soru soranın sorduğu sonuçla örtüşen sonuçlar verdi.


1

Dizin hatlarını almak için bunu Alan Hesaplayıcıda kullanıyorum:

ARCMAP'ta

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

'İletişim kutusunun altındaki metin giriş alanına "c" (tırnak işaretleri olmadan) yazın ve Tamam'ı tıklayın.

QGIS'te

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

"" seviye "" Kontur yükseklik alanına ayarla "200" Dizin konturları aralığına ayarla

Sonra: "1" bir dizin konturudur ve "0" bir dizin konturu değildir


0

Kalan olup olmadığını belirlemek için konturu 10 ile çarpın ve sonra modülü 10 ile çarpın. Eğer tamsayıdan başka bir şey kalmadıysa, o zaman kayar.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.