高さが整数である輪郭を選択しますか?


18

間隔が0.2メートルのContours Featureclassがあります。1 m間隔の輪郭のみを選択したいですか?

[属性で選択]ダイアログ(ArcMap)で次の構文を使用しようとしましたが、すべてのコンターが選択されます。

Mod("ELEVATION", 1)=0

どのクエリを実行する必要がありますか?


本当に時間を節約してくれました、本当にありがとう!「Flor」、「Elevation」、「Mod」などのこのクエリコードを見たことがない。

回答:


22

整数値のみを選択する簡単なトリックは、次の構文を使用することです。

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

この10の乗算により、すべての値が整数になり、10の倍数の値のみが選択されます。

他の数の倍数を選択する場合は、間隔に10を掛けます。

  • 5 m間隔で輪郭を取得するには、次を使用します。

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

  • 100 m間隔で等高線を取得するには、次を使用します。

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

更新
以下のコメントに記載されているWhuberのアドバイスに従って、クエリ式に丸め関数を追加しました。


6
私はこれらのソリューションを信頼するとは思わない。問題は、0.2の非整数間隔では、データベースがフロートとしてそれらを格納する可能性が高いことです。その結果MOD、浮動小数点の丸め誤差が発生します。これはここで重要です:最下位桁でも低い場合MOD、間違った値を返すことがあります(実装方法によって異なります)。これらの微妙な(および陰湿な)エラーを防ぐ方法として、適用する前に値を丸めることをお勧めしますMOD
whuber

10倍した後、MODを見つける前に丸める必要があります。
smithkm

1
5m間隔で等高線を選択する場合、上記のように実装された式は、5で均等に割り切れる数に丸める非整数を選択します。たとえば、14.5mおよび19.5mが選択されましたが、これは望ましくありません。関数の「ラウンド」部分をドロップした場合、これらは選択されませんでした。
delongtime 14年

1
@delongtime非積分レベルを持つことになっている等高線がある場合、単純に2番目の引数を変更ROUNDして、丸めの精度を高めます。
whuber

9

別のクエリオプションを次に示します。上記の回答とほぼ同じですが、(私の意見では)さまざまなシナリオに合わせてカスタマイズするのが少し簡単です。

10で割り切れる輪郭を表示するには

Floor(Elevation/10)=Elevation/10

50で割り切れる輪郭を表示するには

Floor(Elevation/50)=Elevation/50

半メートルの等高線を表示するには

Floor(Elevation/0.5)=Elevation/0.5

任意のオフセット(10.2、20.2、30.2など)で10メートルの等高線を表示するには

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

結局のところ、これは考慮すべきもう1つのオプションです。


2

これは上記の答えに対するコメントであることを意味しました- すみません

構文は、Contourが保存されているDBのタイプによって異なりますが、特定のソリューションでは、値を丸めた後に等高線が選択されるようです。たとえば、私のテストでは、これにより.3 mと.4 mを含む選択されたセットが達成されました。実際、どの値も除外していません。

この方程式

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

質問者が尋ねていたものと一致するように思われる結果を私に与えました。


1

インデックスコンターを取得するには、Field Calculatorでこれを使用します。

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」(引用符なし)と入力し、[OK]をクリックします。

QGISで

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

"" level ""等高線フィールドに設定 "200"インデックス等高線の間隔に設定

次に、「1」はインデックスコンターであり、「0」はインデックスコンターではありません


0

輪郭に10を掛け、次にモジュラスに10を掛けて、余りがあるかどうかを判断します。整数以外の剰余がない場合は、floatです。

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.