8 votos

¿Creación de una vista SpatiaLite (para su uso en QGIS) a partir de una base de datos SQLite no espacial?

Tengo una base de datos SQLite simple que contiene coordenadas X, Y en una tabla. Los datos se editan a través de un front-end de MS Access utilizando el controlador ODBC, por lo que quiero evitar almacenarlos en un blob de geometría que sólo se puede editar utilizando Spatialite.

Sé que QGIS puede trazar tablas de archivos .csv especificando una columna X e Y y que Arc puede hacer algo similar con tablas SQLite simples.

¿Cómo puedo crear una vista que convierta mis columnas X, Y en objetos de geometría Spatialite para que los datos resultantes puedan visualizarse en un mapa en QGIS?

Ejemplo de estructura de tabla

-- Location table (non-spatial)
CREATE TABLE location (
  id INTEGER PRIMARY KEY,
  name TEXT,
  x INT,
  y INT,
  epsg_code INT
);

INSERT INTO location VALUES
  (1, 'North', -3, 55, 4326),
  (2, 'South', 0, 52, 4326);

-- Sample data to be plotted on map
CREATE TABLE sample (
  sample_id INTEGER PRIMARY KEY,
  description TEXT,
  location INT
);

INSERT INTO sample VALUES
  (1, 'big', 1),
  (2, 'bigger', 2),
  (3, 'biggest', 2);

Vista de ejemplo

Me gustaría crear una vista que me permita trazar los siguientes atributos en un mapa:

SELECT 
  s.sample_id,
  s.description,
  loc.name
FROM
  sample AS s LEFT JOIN location as loc
  ON s.location = loc.id;

Preguntas similares

Publico esta pregunta para responderla yo mismo. Encontré partes de la respuesta en las siguientes preguntas, pero quería que estuviera documentada en un solo lugar.

9voto

Los siguientes comandos pueden utilizarse para añadir una vista Spatialite a tablas no espaciales de una base de datos SQLite.

  1. Añadir capacidades Spatialite a la base de datos.

    SELECT load_extension('mod_spatialite');
    SELECT initspatialmetadata(1);

Es necesario tener Spatialite instalado en el sistema donde se ejecutan estos comandos ( sudo apt install libsqlite3-mod-spatialite spatialite-bin en Ubuntu). La extensión ya está cargada si utiliza Spatialite-GUI o QGIS DB Manager.

  1. Crear geometría de referencia para utilizar con la vista

    CREATE TABLE _point_4326 (
      id integer primary key
      );
    SELECT AddGeometryColumn('_point_4326', 'geom', 4326, 'POINT', 2);

Spatialite añade columnas de geometría a las tablas después de haberlas creado. No es posible hacerlo con una vista. Así que creamos una tabla ficticia con el mismo tipo de geometría que utilizará nuestra vista. Este ingenioso truco proviene de esta respuesta .

  1. Crear la vista

    CREATE VIEW sample_locations AS
      SELECT 
        1e6 * loc.ROWID + s.sample_id as fid,
        s.sample_id,
        s.description,
        loc.name,
        MakePoint(
          CAST(loc.x AS REAL),
          CAST(loc.y AS REAL),
          CAST(loc.epsg_code AS INT)) as geom 
      FROM
        sample AS s LEFT JOIN location as loc
        ON s.location = loc.id;

En MakePoint() se utiliza para crear el objeto geométrico a partir de las coordenadas X e Y. Para que la vista funcione en QGIS, es necesario que tenga una columna ID única. En los casos en que la vista no la tenga, es posible crear una utilizando valores de clave primaria o ROWID de tablas unidas, combinándolos si es necesario. La dirección MakePoint falla silenciosamente si recibe argumentos del tipo incorrecto, así que CAST para asegurarse de que son correctos.

  1. Registrar la geometría de la vista

    INSERT INTO views_geometry_columns
      (view_name, view_geometry, view_rowid, f_table_name, f_geometry_column, read_only)
    VALUES ('sample_locations', 'geom', 'fid', '_point_4326', 'geom', 1);

Este último paso indica a Spatialite que nuestra vista contiene una columna de geometría. Utiliza el ID único y la geometría de nuestra tabla ficticia. Establecer el read_only a 1 asegura que los datos no pueden ser editados.

Ahora es posible editar el sample y location en máquinas donde Spatialite no está instalado/accesible y trazar los datos en QGIS a través de la vista Spatialite.

>>> SELECT * FROM sample_locations;
1000001.000000  1   big North   BLOB sz=60 GEOMETRY
2000002.000000  2   bigger  South   BLOB sz=60 GEOMETRY
2000003.000000  3   biggest South   BLOB sz=60 GEOMETRY

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