5 votos

Cómo encontrar todos los puntos con cierta diferencia de elevación entre ellas en QGIS

Tengo una capa de puntos (xyz) y queremos encontrar todos los puntos que tienen diferencia de elevación de 200m o más. Me gustaría entonces trazar una línea entre cada par con la diferencia de elevación más grande.

El objetivo es identificar las áreas que tienen diferencia de elevación grande y (eventualmente) más cercano distancia entre ellos en QGIS. Gracias

8voto

JShoe Puntos 310

La forma más sencilla es la importación de sus puntos en un formato que puede ser consultado con SQL, como PostGIS, SQLite o Shapefile (utilizando OGR).

A continuación, puede consultar:

SELECT * 
FROM [table] a, [table] b 
WHERE a.[featureid] <> b.[featureid] 
    AND ST_Z(a.[geometry]) - ST_Z(b.[geometry]) >= 200;

O usted puede consultar y hacer líneas en un solo paso:

SELECT ST_MakeLine(a.[geometry], b.[geometry]) AS geom 
FROM [table] a, [table] b 
WHERE a.[featureid] <> b.[featureid] 
    AND ST_Z(a.[geometry]) - ST_Z(b.[geometry]) >= 200;

Podría ayudar a filtrar los puntos que no pueden ser >= 200m desde otro punto primero, porque no es una operación O(n^2) consulta -- si usted tiene un montón de puntos, que va a tomar un tiempo largo. También puede restringir el juego dentro de una cierta distancia para emplear el índice y la velocidad.

Nota: reemplazar el [nombres] aquí con su propia tabla/columna de nombres.

Editar:

No pude encontrar donde ejecutar una consulta SQL en QGIS, pero aquí está cómo hacerlo en ogr2ogr en la línea de comandos:

ogr2ogr \
    -f "ESRI Shapefile" \
    -dialect "SQLITE" \
    -sql "SELECT * FROM input a, input b WHERE ST_Z(a.GEOMETRY)-ST_Z(b.GEOMETRY) < 200 AND a.FID<>b.FID" \
    output.shp input.shp

El modificador-f le dice al programa qué tipo de archivo a generar. El dialecto interruptor dice a usar SQLite, SQL del motor de realizar la consulta. El -sql argumento es el de la consulta. La GEOMETRÍA y la FID están integradas en los nombres de campo que se puede utilizar en la consulta.

Ahora, esta consulta va a ser muy lento porque no hay ningún índice. Va a tratar de hacer coincidir cada punto a cualquier otro punto. Uso de la documentación aquí traté de hacer la consulta para utilizar un índice espacial, pero parece que no trabajo y no tengo tiempo para meterme con él en este momento.

Cargar el mismo conjunto de puntos en SpatiaLite va algo como esto:

spatialite> .loadshp input input UTF-8 2956
spatialite> select createspatialindex('input', 'geometry');
spatialite> create table output as select * from input a, input b where st_z(a.geometry)-st_z(b.geometry) < 200 and a.rowid<>b.rowid and a.rowid in (select rowid from spatialindex f_table_name='stations' and search_frame=b.geometry);
spatialite> .dumpshp output 'geometry' output UTF-8

La primera línea de carga el archivo shp, en el segundo se crea un índice espacial, la tercera se crea una nueva tabla a partir de la consulta y el cuarto se vuelca la nueva tabla a un archivo nuevo. (Docs aquí.)

Esto es mucho más rápido que el ogr2ogr solución (para mí).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X