Memilih kontur yang ketinggiannya bilangan bulat?

18

Saya memiliki kelas kontur Contour, dengan interval 0,2 meter. Saya hanya ingin memilih Kontur tersebut, yang berada pada interval 1 m?

Saya telah mencoba menggunakan sintaks berikut dalam dialog 'Pilih berdasarkan Atribut' (dalam ArcMap), tetapi memilih semua kontur:

Mod("ELEVATION", 1)=0

Kueri apa yang harus saya jalankan?

Devdatta Tengshe
sumber
Menghemat BANYAK waktu untuk saya, terima kasih banyak! Belum pernah melihat kode kueri ini seperti "Flor", "Elevation" dan "Mod".

Jawaban:

22

Trik sederhana untuk memilih hanya nilai Integer, adalah dengan menggunakan sintaks berikut:

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

Penggandaan ini dengan 10, membuat semua nilai Integer, dan kemudian kami memilih hanya yang merupakan kelipatan dari 10.

Jika Anda ingin memilih Kelipatan dari beberapa nomor lain, kalikan saja 10 dengan intervalnya.

  • Untuk mendapatkan kontur pada interval 5 m, gunakan:

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

  • Untuk mendapatkan kontur pada interval 100 m, gunakan:

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

Pembaruan
Sesuai saran Whuber yang diberikan dalam komentar di bawah, saya telah menambahkan fungsi pembulatan dalam ekspresi kueri.

Devdatta Tengshe
sumber
6
Saya tidak berpikir saya akan mempercayai solusi ini. Masalahnya adalah bahwa dengan interval non-integral 0,2, database kemungkinan menyimpannya sebagai float. Akibatnya MODakan dikenakan kesalahan pembulatan titik-mengambang - dan itu penting di sini: jika Anda rendah bahkan dengan angka paling tidak signifikan, MODdapat mengembalikan nilai yang salah (tergantung bagaimana penerapannya). Saya ingin menyarankan pembulatan nilai-nilai sebelum menerapkan MODsebagai cara untuk mencegah kesalahan-kesalahan halus (dan berbahaya) ini.
whuber
Anda perlu membulatkan setelah dikalikan dengan 10, tetapi sebelum menemukan mod.
smithkm
1
Jika saya ingin memilih kontur pada interval 5m, rumus yang diimplementasikan seperti yang ditulis di atas memilih non-integer yang dibulatkan ke angka yang dapat habis dibagi 5. Misalnya , 14.5m dan 19.5m dipilih tetapi ini tidak diinginkan. Ini tidak dipilih jika saya menjatuhkan bagian 'Round' dari fungsi.
delongtime
1
@delongtime Jika Anda memiliki kontur yang seharusnya memiliki level non-integral, cukup modifikasi argumen kedua ROUNDuntuk mencapai ketepatan yang lebih dalam dalam pembulatan.
whuber
9

Berikut ini opsi permintaan lain. Sebagian besar melakukan hal yang sama dengan jawaban yang tercantum di atas tetapi (menurut saya) sedikit lebih mudah untuk menyesuaikan skenario yang berbeda.

Untuk menampilkan kontur yang dapat dibagi 10

Floor(Elevation/10)=Elevation/10

Untuk menampilkan kontur yang dapat dibagi 50

Floor(Elevation/50)=Elevation/50

Untuk menampilkan kontur setengah meter

Floor(Elevation/0.5)=Elevation/0.5

Untuk menampilkan kontur 10 meter dengan offset arbiter (mis. 10.2, 20.2, 30.2)

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

Pada akhirnya, ini hanyalah pilihan lain untuk dipertimbangkan.

TGS71
sumber
2

Ini dimaksudkan sebagai komentar atas jawaban di atas - maaf .

Sintaks akan bervariasi tergantung pada jenis DB tempat Kontur Anda disimpan tetapi solusi yang diberikan tampaknya memilih kontur setelah membulatkan nilainya. Jadi misalnya dalam pengujian saya ini mencapai set yang dipilih yang termasuk 0,3 m dan 0,4 m. Bahkan, itu tidak termasuk nilai-nilai.

Persamaan ini

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

Memberi saya hasil yang tampaknya cocok dengan apa yang ditanyakan si penanya.

pengguna23715
sumber
1

Untuk mendapatkan kontur Indeks, saya menggunakan ini di Kalkulator Bidang:

Di 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

'Ketik "c" (tanpa tanda kutip) di bidang input teks di bagian bawah kotak dialog dan klik OK.

Di QGIS

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

"" level "" Setel ke bidang ketinggian kontur "200" Setel ke interval kontur indeks

Lalu: "1" adalah kontur indeks dan "0" bukan kontur indeks

carfog81
sumber
0

Lipat gandakan kontur dengan 10 dan kemudian modulus dengan 10 untuk menentukan apakah ada sisanya. Jika tidak ada yang tersisa dari itu adalah bilangan bulat, selain itu itu mengambang.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
sumber