Chọn đường đồng mức nào là số nguyên?


18

Tôi có một chiếc Contours Featureclass, với khoảng cách 0,2 mét. Tôi chỉ muốn chọn những Đường viền đó, cách nhau 1 m?

Tôi đã thử sử dụng cú pháp sau trong hộp thoại 'Chọn theo thuộc tính' (trong ArcMap), nhưng nó chọn tất cả các đường viền:

Mod("ELEVATION", 1)=0

Tôi nên chạy truy vấn nào?


Tiết kiệm rất nhiều thời gian cho tôi, thực sự cảm ơn! Chưa bao giờ thấy mã truy vấn này như "Flor", "Độ cao" và "Mod".

Câu trả lời:


22

Thủ thuật đơn giản để chỉ chọn các giá trị Integer, là sử dụng cú pháp sau:

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

Phép nhân này với 10, làm cho tất cả các giá trị Integer, và sau đó chúng tôi chỉ chọn những giá trị là bội số của 10.

Trong trường hợp bạn muốn chọn bội số của một số số khác, chỉ cần nhân 10 với khoảng.

  • Để có đường viền cách nhau 5 m, hãy sử dụng:

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

  • Để có được các đường viền ở khoảng cách 100 m, hãy sử dụng:

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

Cập nhật
Theo lời khuyên của Người đưa ra trong nhận xét bên dưới, tôi đã thêm chức năng làm tròn trong biểu thức truy vấn.


6
Tôi không nghĩ rằng tôi sẽ tin tưởng những giải pháp này. Vấn đề là với các khoảng không tích phân 0,2, cơ sở dữ liệu có khả năng lưu trữ chúng dưới dạng nổi. Do đó, MODsẽ phải chịu lỗi vòng tròn dấu phẩy động - và điều đó rất quan trọng ở đây: nếu bạn thấp ngay cả chữ số có ý nghĩa nhỏ nhất, MODcó thể trả về giá trị sai (tùy thuộc vào cách triển khai). Tôi muốn đề xuất làm tròn các giá trị trước khi áp dụng MODnhư một cách để ngăn chặn các lỗi tinh vi (và ngấm ngầm) này.
whuber

Bạn cần làm tròn sau khi nhân với 10, nhưng trước khi tìm mod.
smithkm

1
Nếu tôi muốn chọn các đường đồng mức cách nhau 5m, công thức được thực hiện như đã viết ở trên sẽ chọn các số nguyên không làm tròn thành một số chia hết cho 5. Ví dụ: 14,5m và 19,5m đã được chọn nhưng điều này không được mong muốn. Chúng không được chọn nếu tôi bỏ phần 'Vòng' của hàm.
delongtime

1
@delongtime Nếu bạn có các đường viền được cho là có các mức không tách rời, chỉ cần sửa đổi đối số thứ hai ROUNDđể đạt được độ chính xác cao hơn trong làm tròn.
whuber

9

Đây là một tùy chọn truy vấn khác. Nó phần lớn thực hiện giống như các câu trả lời được liệt kê ở trên nhưng (theo ý kiến ​​của tôi) dễ dàng hơn một chút để tùy chỉnh cho các kịch bản khác nhau.

Để hiển thị bất kỳ đường viền chia hết cho 10

Floor(Elevation/10)=Elevation/10

Để hiển thị bất kỳ đường viền chia hết cho 50

Floor(Elevation/50)=Elevation/50

Để hiển thị đường viền nửa mét

Floor(Elevation/0.5)=Elevation/0.5

Để hiển thị các đường viền 10 mét với phần bù tùy ý (ví dụ: 10.2, 20.2, 30.2)

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

Vào cuối ngày, đây chỉ là một lựa chọn khác để xem xét.


2

Điều này có nghĩa là một nhận xét về câu trả lời trên - xin lỗi .

Cú pháp sẽ thay đổi tùy thuộc vào loại DB mà Đường viền của bạn được lưu trữ nhưng giải pháp đã cho dường như chọn đường viền sau khi làm tròn các giá trị của chúng. Vì vậy, ví dụ trong thử nghiệm của tôi, điều này đã đạt được một tập hợp được chọn bao gồm .3 m cũng như .4 m. Trong thực tế, nó không loại trừ các giá trị.

Phương trình này

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

Đã cho tôi kết quả dường như phù hợp với những gì người hỏi đang hỏi.


1

Để có được các đường viền Index, tôi sử dụng điều này trên Máy tính trường:

Trong 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

'Nhập "c" (không có dấu ngoặc kép) vào trường nhập văn bản ở cuối hộp thoại và bấm OK.

Trong QGIS

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

"" level "" Đặt thành trường chiều cao đường viền "200" Đặt thành khoảng của các đường viền chỉ mục

Sau đó: "1" là một đường viền chỉ mục và "0" không phải là một đường viền chỉ mục


0

Nhân đường viền với 10 và sau đó mô đun với 10 để xác định xem có còn lại không. Nếu không có phần còn lại hơn số nguyên, thì nó sẽ nổi.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.