Unirse por atributo / spaceialite con SQL / combinación externa izquierda en QGIS

8

Tengo una capa con polígonos (llamémosla "bosque") que está intersectada por "n" objetos de línea ("caminos"). Cada camino tiene un atributo único roadid.

Necesito agregar TODOS los roadid (no solo los primeros hallazgos de QGis) a la capa de polígonos de bosque que se cruzan para su uso posterior. Preferiblemente, todos los roadid deben estar en una nueva columna de atributos del "bosque", dividida por ejemplo, ",".

Si solo hubiera un camino en cada bosque, podría usar la herramienta "unir atributo por posición" para obtener los roadid en los polígonos. El atributo deseado es una cadena única, por lo que no ayuda a sumar / promediar / min / max los campos, y no hay ninguna opción para unirlos como cadenas divididas por ",".

Editar: no hay solución sin la ayuda de complementos o programas externos por ahora (ver comentario de Matthias Kuhn a continuación).

(QGIS 2.10.1-Pisa)

Papierwolf
fuente
Por favor, aclare qué necesita al final del proceso. ¿Un campo que contiene múltiples valores separados o solo un valor? Y si se necesita un único valor, ¿qué valor debe mantenerse cuando tiene coincidencia múltiple? (por ejemplo: mantener el camino más largo, el más superpuesto, la identificación más pequeña, etc.)
MarHoff
Necesito todos los valores, pregunta actualizada, gracias por la pista.
Papierwolf
1
Este es típicamente el tipo de tarea que realizaría dentro de PostGIS usando una IZQUIERDA EXTERIOR IZQUIERDA ... si por casualidad usa PostGis, puedo proporcionar una respuesta rápida, pero usar solo QGIS podría necesitar muchos más pasos.
MarHoff
1
Esto es algo que (todavía) no es posible con QGIS. En general, esto se discute bajo el término "funciones agregadas" y estoy seguro de que veremos esto en una versión no muy lejana en el futuro. Mientras tanto, recomendaría usar una solución de base de datos (por ejemplo, postgres) o puede haber una herramienta en el procesamiento que no conozco en este momento.
Matthias Kuhn
2
Puede intersecar la capa de polígono con la capa de polilínea. De esta manera, obtiene los polígonos y los identificadores de polilínea que se intersecan. Puede escribir un script / plugin de Python para recopilar identificadores de polilínea a identificadores de polígono, pero no es la mejor solución desde un punto de vista relacional.
Zoltan

Respuestas:

6

Utilice la base de datos Spatialite!

Es una base de datos espacial basada en archivos livianos compatible con QGIS.

  1. Primero configure una base de datos espacial siguiendo estas instrucciones

  2. Empuje sus dos tablas a esta base de datos espacial usando el administrador QGIS DB

  3. Suponiendo que sus tablas se llaman "polígono" y "línea", ejecute el siguiente comando SQL en la interfaz de consulta del administrador de base de datos.

SELECT polygon.id,
polygon.lib, -- Place here any field releveant for you (they must also be in grouping clauses, see below)
group_concat(line.id,',') as list_id_line -- this function concatenate the id of every line that touch you polygon
FROM polygon LEFT OUTER JOIN line
ON Intersects(polygon.geom,line.geom) -- Spatial Dabatabase Rule !
GROUP BY polygon.id, polygon.lib -- theses are the grouping clauses
  1. ¡Disfrutar!

Más explicaciones y diversión leyendo sobre las funciones agregadas de SQLite aquí y las funciones de spaceialite aquí

MarHoff
fuente
Gracias MarHoff, ¡esto parece prometedor! Examinaré más de cerca su solución mañana y le daré su merecida "aceptar respuesta" y votar.
Papierwolf
De hecho, compruebe si funciona antes;) Realmente me sorprendió bastante el potencial de Spatialite como opción sin servidor. ¡Porque trabajo en PostGis me diste una buena ocasión para probarlo!
MarHoff
Su solución funciona bien. Gracias de nuevo por proporcionar las fuentes y el guión. Realmente ayudan a un principiante a comprender cómo funciona esto. Intentaré actualizar la pregunta y las etiquetas nuevamente para ayudar a otros a encontrar esta pregunta y su respuesta.
Papierwolf
¡De nada! Y me encanta el nuevo título. En mi humilde opinión, podría ser justo también reemplazar la etiqueta "expresión" con "espacial". Bye;)
MarHoff
1
Aprenda de mis errores: tenga en cuenta que debe marcar "Crear índice espacial" al importar datos a SpatiaLite (o hágalo más tarde haciendo clic con el botón derecho en las tablas). Sus consultas SQL, incluidas las operaciones geométricas, llevarán años si se olvida de hacerlo.
Papierwolf