Publicador de contenidos

Capa con consulta SQL como fuente de datos


 

Capa con consulta SQL como fuente de datos

En la última versión de Cartodruid se ha introducido como novedad la posibilidad de tener una capa cuya fuente de datos sea una consulta SQL. A continuación explicamos como configurar dicha capa, así como una serie de restricciones a tener en cuenta.

Configuración

La capa se configura como cualquier otra capa vectorial como se indica en los puntos  5.2 Configuración de capa Vectorial y 5.4 Configuración de orígenes de datos del Manual de referencia de CartoDruid con las siguientes modificaciones:

  • En la etiqueta attributesClassName hay que poner QuerySqlite como clase encargada de acceder a los datos

<attributesClassName>QuerySqlite</attributesClassName>

  • Como descriptor de la fuente de datos vamos a utilizar SpatiaLiteQueryServiceDescriptor

<sources>               

< SpatiaLiteQueryServiceDescriptor>

...

   </ SpatiaLiteQueryServiceDescriptor>

   </sources>

Para configurar la consulta dentro de SpatiaLiteQueryServiceDescriptor tenemos los siguientes campos:

fields

Campos que va a devolver la consulta. Podemos poner * si queremos que se devuelvan todos los campos.

from

Tabla o tablas que intervienen. La tabla que contenga las geometrías de origen tendrá asociado el alias "g". También se pueden añadir subconsultas SQL anidadas.

where (opcional)

Condición de filtrado de la consulta.

groupBy (opcional)

Campo por el que vamos a agrupar los datos.

orderBy (opcional)

Campo o campos por los que vamos a ordenar el resultado de la consulta.

primaryKey

Campo que va a actuar como identificador en el resultado de la consulta (debe estar dentro de la lista de campos de fields).

indexTable

Identificador del índice espacial de la tabla con contiene las geometrías.

dbURL

Nombre del fichero sqlite que contiene los datos.

Hay que tener en cuenta que al estar la configuración dentro de un fichero XML no podemos utilizar "<" y ">" en las condiciones del where o en las subconsultas puesto que son caracteres reservados. Debemos sustituirlos por "&lt;" y "&gt;" respectivamente.

Restricciones

  • Cualquier tipo de edición, tanto de geometrías como de valores alfanuméricos, estará deshabilitada. Sí que se podrán seleccionar features e identificarlas para ver sus valores.
  • Las geometrías que se muestren solo pueden provenir de una tabla. Se podrán hacer operaciones sobre esas geometrías de la misma tabla, por ejemplo, que la geometría sea el resultado de la unión de geometrías agrupadas por el valor de otro campo de la tabla.
  • Las operaciones sobre las geometrías permitidas serán las permitidas por Spatialite, que están recogidas en el siguiente enlace: Spatialite SQL functions reference list

Ejemplos de Configuración
Hemos preparado tres ejemplos de configuración los cuales están disponibles en el siguiente proyecto que puedes importar en Cartodruid:

ExampleQueryLayer.crtd

Consulta con 2 tablas

En esta consulta tenemos la tabla principal subparcelas y otra tabla llamada uso_sigpac que cruzamos por los campos uso_sigpac de subparcelas y c_uso_sigpac de uso_sigpac. Y como resultado se muestran todos los campos de subparcelas y el campo d_uso_sigpac de uso_sigpac.

<SpatiaLiteQueryServiceDescriptor>

<fields>g.*, u.d_uso_sigpac</fields>

<from>subparcelas g, uso_sigpac u</from>

              <where>g.uso_sigpac = u.c_uso_sigpac</where>           

             <dbURL>exampleQueryLayer.sqlite</dbURL>

             <primaryKey>codigo_subparcela</primaryKey>

             <indexTable>idx_subparcelas_Geometry</indexTable>

       </SpatiaLiteQueryServiceDescriptor>

Consulta resultante:

SELECT g.*, u.d_uso_sigpac FROM subparcelas g, uso_sigpac u WHERE g.uso_sigpac = u.c_uso_sigpac;

Consulta con operación geográfica

En este caso tenemos la tabla subparcelas, en la cual tenemos entidades con el mismo codigo_parcela. En la consulta hacemos el agrupamiento por dicho campo y las geometrías serían el resultado son la unión de las geometrías con el mismo codigo_parcela. Además se añade un campo ¿subparcelas¿ con el listado de las subparcelas que se han agrupado

<SpatiaLiteQueryServiceDescriptor>

<fields>codigo_parcela, group_concat("codigo_subparcela") as subparcelas, casttomulti( st_union(st_buffer(geometry,0.1))) as geometry

</fields>

<from>subparcelas g</from>

<groupBy>codigo_parcela</groupBy>

            <dbURL>exampleQueryLayer.sqlite</dbURL>

            <primaryKey>codigo_parcela</primaryKey>

            <indexTable>idx_subparcelas_Geometry</indexTable>

       </SpatiaLiteQueryServiceDescriptor>

Consulta resultante:

SELECT codigo_parcela, group_concat("codigo_subparcela") as subparcelas, casttomulti( st_union(st_buffer(geometry,0.1))) as geometry u.d_uso_sigpac FROM subparcelas g

GROUP BY codigo_parcela;

Consulta con una subconsulta

Aquí tenemos una subconsulta dentro del from con la cual filtramos las subparcelas cuya geometría tiene un área mayor de 10 Has para luego hacer un quedarnos con las entidades de la capa inspeccion que intersecten con las obtenidas en la subconsulta anterior.

<SpatiaLiteQueryServiceDescriptor>

<fields>g.*</fields>

<from>inspeccion g, (SELECT geometry FROM subparcelas WHERE st_area(geometry)/10000 &gt; 10) a

</from>

             <where>st_intersects(g.geometry,a.geometry) = 1</where>

<dbURL>exampleQueryLayer.sqlite</dbURL>

<primaryKey>c_uuid</primaryKey>

<indexTable>idx_inspeccion_Geometry</indexTable>

</SpatiaLiteQueryServiceDescriptor>

Consulta resultante:

SELECT g.*

FROM inspeccion g, (

SELECT geometry

FROM subparcelas

WHERE st_area(geometry)/10000 &gt; 10

) a

WHERE st_intersects(g.geometry,a.geometry) = 1;