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.