정수가되는 등고선을 선택 하시겠습니까?


18

0.2 미터 간격의 윤곽 피쳐 클래스가 있습니다. 1m 간격의 컨투어 만 선택하고 싶습니다.

'속성 별 선택'대화 상자 (ArcMap의)에서 다음 구문을 사용해 보았지만 모든 윤곽선을 선택합니다.

Mod("ELEVATION", 1)=0

어떤 쿼리를 실행해야합니까?


많은 시간을 절약했습니다. 정말 감사합니다! "Flor", "Elevation"및 "Mod"와 같은이 쿼리 코드는 본 적이 없습니다.

답변:


22

정수 값만 선택하는 간단한 방법은 다음 구문을 사용하는 것입니다.

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

이 곱셈에 10을 곱하면 모든 값이 정수가되고 10의 배수 인 값만 선택합니다.

다른 숫자의 배수를 선택하려면 간격에 10을 곱하십시오.

  • 5m 간격으로 윤곽을 얻으려면 다음을 사용하십시오.

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

  • 100m 간격으로 윤곽을 얻으려면 다음을 사용하십시오.

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

업데이트
아래 주석에 주어진 Whuber의 조언에 따라 쿼리 표현식에 반올림 함수를 추가했습니다.


6
나는이 솔루션을 신뢰할 것이라고 생각하지 않습니다. 문제는 비 적분 간격이 0.2 인 경우 데이터베이스가 부동 소수점으로 저장할 가능성이 있다는 것입니다. 결과적 MOD으로 부동 소수점 반올림 오류가 발생하며 여기에서 매우 중요합니다. 최상위 자리까지도 낮은 경우 MOD구현 방법에 따라 잘못된 값을 반환 할 수 있습니다. 이러한 미묘한 (그리고 교활한) 오류를 방지하는 방법으로 적용하기 전에 값을 반올림 하는 것이 좋습니다 MOD.
whuber

10을 곱한 후 모드를 찾기 전에 반올림해야합니다.
smithkm 2016 년

1
I는 5m 간격 컨투어를 선택하고자하는 경우, 수식 선택하여 상기 비 - 정수 작성된 구현하는 (5)에 의해 균등하게 나누어 다수 라운드 , 14.5m와 19.5m 선택 되었으나 이는 바람직하지 않다. 함수의 '라운드'부분을 떨어 뜨린 경우 선택되지 않았습니다.
delongtime

1
@delongtime 적분이 아닌 레벨을 갖는 컨투어가있는 경우 두 번째 인수를 수정 ROUND하여 라운딩의 정밀도를 높이십시오.
whuber

9

다른 쿼리 옵션이 있습니다. 위의 답변과 거의 동일하지만 다른 시나리오에 맞게 사용자 정의하기가 조금 더 쉽습니다.

10으로 나눌 수있는 형상을 표시하려면

Floor(Elevation/10)=Elevation/10

50으로 나눌 수있는 형상을 표시하려면

Floor(Elevation/50)=Elevation/50

반 미터 윤곽선을 표시하려면

Floor(Elevation/0.5)=Elevation/0.5

임의의 오프셋으로 10 미터 형상을 표시하려면 (예 : 10.2, 20.2, 30.2)

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

하루가 끝나면 고려해야 할 또 다른 옵션입니다.


2

이것은 위의 답변에 대한 의견입니다 . 죄송합니다 .

구문은 컨투어가 저장된 DB 유형에 따라 달라 지지만 주어진 솔루션은 값을 반올림 한 후 컨투어를 선택하는 것으로 보입니다. 예를 들어 내 테스트에서 이것은 .3m 및 .4m을 포함하는 선택된 세트를 달성했습니다. 실제로 값을 제외하지 않았습니다.

이 방정식

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

질문자가 요구 한 것과 일치하는 것 같은 결과를 나에게주었습니다.


1

인덱스 윤곽선을 얻으려면 필드 계산기에서 이것을 사용하십시오.

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

대화 상자 하단의 텍스트 입력 필드에 "c"(따옴표없이)를 입력하고 확인을 클릭하십시오.

QGIS에서

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

""level ""등고선 높이 필드로 설정 "200"색인 등고선 간격으로 설정

그런 다음 "1"은 인덱스 윤곽이며 "0"은 인덱스 윤곽이 아닙니다.


0

형상에 10을 곱한 다음 모듈러스에 10을 곱하여 나머지가 있는지 확인하십시오. 정수보다 나머지가 없으면 부동 소수점입니다.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.