Al seleccionar contornos, ¿qué alturas son enteros?

18

Tengo una clase de características de contornos, con un intervalo de 0.2 metros. ¿Deseo seleccionar solo esos contornos, que están en un intervalo de 1 m?

Intenté usar la siguiente sintaxis en el cuadro de diálogo 'Seleccionar por atributo' (en ArcMap), pero selecciona todos los contornos:

Mod("ELEVATION", 1)=0

¿Qué consulta debo ejecutar?

Devdatta Tengshe
fuente
Me ahorró MUCHO tiempo, ¡realmente gracias! Nunca he visto estos códigos de consulta como "Flor", "Elevación" y "Mod".

Respuestas:

22

El truco simple para seleccionar solo valores enteros es utilizar la siguiente sintaxis:

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

Esta multiplicación por 10 hace que todos los valores sean enteros, y luego seleccionamos solo aquellos que son múltiplos de 10.

En caso de que desee seleccionar Múltiplos de algún otro número, simplemente multiplique 10 por el intervalo.

  • Para obtener contornos a intervalos de 5 m, use:

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

  • Para obtener contornos a intervalos de 100 m use:

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

Actualización
Según el consejo de Whuber dado en el comentario a continuación, he agregado la función de redondeo en la expresión de consulta.

Devdatta Tengshe
fuente
66
No creo que confiaría en estas soluciones. El problema es que con intervalos no integrales de 0.2, es probable que la base de datos los almacene como flotantes. En consecuencia MOD, estará sujeto a un error de redondeo de punto flotante, y eso es crítico aquí: si está bajo incluso por el dígito menos significativo, MODpuede devolver el valor incorrecto (dependiendo de cómo se implemente). Me gustaría sugerir redondear los valores antes de aplicar MODpara evitar estos errores sutiles (e insidiosos).
whuber
Debes redondear después de multiplicar por 10, pero antes de encontrar el mod.
smithkm
1
Si quiero seleccionar contornos a intervalos de 5m, la fórmula implementada como está escrita arriba selecciona no enteros que se redondean a un número que es divisible por 5. Por ejemplo , se seleccionaron 14.5m y 19.5m, pero esto no es deseable. No se seleccionaron si eliminé la parte 'Redonda' de la función.
delongtime
1
@delongtime Si tiene contornos que se supone que tienen niveles no integrales, simplemente modifique el segundo argumento de ROUNDpara lograr más precisión en el redondeo.
whuber
9

Aquí hay otra opción de consulta. En gran medida hace lo mismo que las respuestas enumeradas anteriormente, pero (en mi opinión) es un poco más fácil de personalizar para diferentes escenarios.

Para mostrar cualquier contorno divisible por 10

Floor(Elevation/10)=Elevation/10

Para mostrar cualquier contorno divisible por 50

Floor(Elevation/50)=Elevation/50

Para mostrar contornos de medio metro

Floor(Elevation/0.5)=Elevation/0.5

Para mostrar contornos de 10 metros con un desplazamiento arbitrario (por ejemplo, 10.2, 20.2, 30.2)

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

Al final del día, esta es solo otra opción a considerar.

TGS71
fuente
2

Esto estaba destinado a ser un comentario sobre la respuesta anterior, lo siento .

La sintaxis varía según el tipo de base de datos en la que se almacenan sus contornos, pero la solución dada parece elegir contornos después de redondear sus valores. Entonces, por ejemplo, en mi prueba, esto logró un conjunto seleccionado que incluía 0,3 m y 0,4 m. De hecho, no excluyó ninguno de los valores.

Esta ecuación

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

Me dio resultados que parecían coincidir con lo que preguntaba el interrogador.

usuario23715
fuente
1

Para obtener contornos de índice, uso esto en la Calculadora de campo:

En 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

'Escriba "c" (sin comillas) en el campo de entrada de texto en la parte inferior del cuadro de diálogo y haga clic en Aceptar.

En QGIS

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

"" nivel "" Establecer en campo de altura de contorno "200" Establecer en intervalo de contornos de índice

Entonces: "1" es un contorno de índice y "0" no es un contorno de índice

carfog81
fuente
0

Multiplique el contorno por 10 y luego el módulo por 10 para determinar si hay un resto. Si no queda más que un número entero, de lo contrario es flotante.

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

__esri_field_calculator_splitter__
contour_class(!Contour!)
Sam
fuente