--- langs: es tags: QGIS title: Análisis espacial en QGIS - Parte 1 SQL y calculadora de expresiones description: Análisis espacial en QGIS - Parte 1 SQL y calculadora de expresiones --- # Análisis espacial en QGIS - Parte 1 SQL y calculadora de expresiones --- **Por:** Samuel Mesa **Fecha:** 11 de noviembre de 2023 **Objetivo**: Conocer las herramientas disponibles de QGIS Deskop para llevar a cabo el análisis espacial. **Datos**: Para el desarrollo de los ejercios se utiliza los datos correspondientes a los datos de accidentalidad vial del [SIMUR](http://sig.simur.gov.co/arcgis/rest/services/Accidentalidad/WSAcidentalidad_Publico/FeatureServer) Secretaría Distrital de Movilidad de Bogotá. --- Se tiene los siguientes datos correspondientes a la accidentalidad vial de la Localidad de Teusaquillo, desde el 2002 hasta el mes de junio de 2021. ![](https://i.imgur.com/YW81K2t.png =550x) El modelo ER establecido para los datos de acuerdo a los datos entregados del [SIMUR](http://sig.simur.gov.co/arcgis/rest/services/Accidentalidad/WSAcidentalidad_Publico/FeatureServer/relationships): ```mermaid erDiagram ACCIDENTE { string formulario int codigo_accidente datetime fecha_ocurrencia string gravedad string clase_acc double longitud double latitud string localidad } VEHICULO { string formulario int codigo_vehiculo string clase string servicio string modalidad string enfuga string codigo } ACTOR_VIAL { string formulario int codigo_accidente int codigo_accidentado int codigo_vehiculo int codigo_victima string genero string estado string condicion string muerte_posterior date fecha_posterior_muerte int edad } CAUSA { string formulario int codigo_accidente int codigo_vehiculo int codigo_causa string nombre string tipo string tipo_causa string codigo } VIA { string formulario int codigo_accidente string estado string material string condiciones string iluminacion string codigo } ACCIDENTE ||--|{ VEHICULO : contiene VEHICULO ||--|{ ACTOR_VIAL : involucrado ACCIDENTE ||--o{ CAUSA : contiene ACCIDENTE ||--o{ VIA : contiene VEHICULO ||--o{ CAUSA : contiene ``` ## 1. Extraer los datos correspondientes a la localidad Debido a que los datos entregados de las tablas *actor_vial*, *vehiculo*, *via* y *causa* contiene todos los registros de Bogotá, es necesario usar algunas herramientas adicionales a QGIS Desktop para realizar este proceso. En QGIS el complemento *DB Manager* es poco eficiente para un gran número de registros en las tablas. Se recomienda la descarga del Software de ***Spatialite GUI*** desde el siguiente enlace Web: http://www.gaia-gis.it/gaia-sins/windows-bin-amd64-prev/, a la fecha correspode a *spatialite_gui-NG-5.0.0-win-amd64.7z*. Esta herramienta permite realizar otras tareas adicionales a las ofrecidas por QGIS Desktop. Una vez se descomprime el achivo ejecutar *spatialite_gui.exe* para eecutar el programa, la interfaz es sencilla y comprende: ![](https://i.imgur.com/06bD7LW.png) (1) Panel de exploración y gestión de la base de datos: capas, tablas, vistas (2) Instrucciones SQL (3) Resultado de la instrucción SQL (4) Ejecutar la instrucción SQL ### 1.1. Conectar la base de datos GeoPackage Desde *Menu --> Connecting an existing SQLite DB* realizar la conexión a la base *SIMUR_ACCIDENTALIDAD.gpkg* ![](https://i.imgur.com/xSzwQiV.png) ### 1.2. Cargar tablas CSV Desde *Menu -> Advances -> Virtual CSV/TXT* se realiza la carga de forma temporal cada tabla CSV par el cual se requiera hacer selección en el contexto de la zona de estudio. Para el ejemplo se antecede el carácter *v* para especificar que se trata de una tabla virtual. ![](https://i.imgur.com/HvP70v6.png) Recuerde escoger los parámetros correctos para los archivos CSV entregados: ![](https://i.imgur.com/oCy8ca6.png =550x) Explore los datos entregados haciendo clic derecho sobre la tabla cargada *vvehiculo* y luego en la opción *Query table* o simplemente ingresando la instrucción SQL de **SELECT** ![](https://i.imgur.com/IsgeDkQ.png) ### 1.3. Realizar la selección de los datos de la zona de estudio. Para seleccionar los dats correspondientes de vehículo en la localidad de Teusaquillo, simplemente realice un *INNER JOIN* entre la tabla accidente y vvehiculo, como sigue: ```sql= CREATE VIEW vvvehiculo AS SELECT a.* FROM vvehiculo a INNER JOIN accidente b ON a.formulario = b.formulario; ``` Refrescar las tablas y luego sobre la vista creada *vvvehiculo*, hacer clic derecho y guardar como *xlsx*: ![](https://i.imgur.com/ytYS6nw.png) Luego realice el cargue desde QGIS a la base de datos, usando las herramientas correspondiente de *Rehacer campos* con los tipos de datos correctos en la base de datos. Realizar el mismo proceso para las tablas de *actor vial*, *causa* y *via*. > **Nota**: Una vez se exporten las vistas en formatos *xlsx* es necesrio borrar las tablas virtuales y vistas, antes de importar la tabla en la base de datos. ## 2. Consultas de análisis espacial #### Predicados espaciales Modelo matriz DE-9IM (*Dimensionally Extended 9 intersection Matrix*). * Documentación predicados espaciales: [ESRI](https://desktop.arcgis.com/es/arcmap/latest/manage-data/using-sql-with-gdbs/relational-functions-for-st-geometry.htm) * Documentación predicados espaciales [PostGIS](http://postgis.net/workshops/postgis-intro/spatial_relationships.html) * Lista de referencia Spatialite [Referencia](http://www.gaia-gis.it/gaia-sins/spatialite-sql-latest.html) ![](https://programapa.files.wordpress.com/2020/11/matriz-de-9im-.png) ### 2.1. Conocer el rango de los datos Para el despliegue y análisis se recomienda los siguientes complementos: * Data Plotly * D3 Data Visualization * Proveedor de R Algunas de las consultas de selección: * Crear y cargar la consulta de agrupación de gravedad de accidentes por año ```sql= SELECT ano_ocurrencia_acc, gravedad, count(*) As conteo FROM accidente WHERE ano_ocurrencia_acc > 2006 GROUP BY ano_ocurrencia_acc, gravedad ``` ![](https://i.imgur.com/K4YVhwJ.png) * Realizar el análisis de todos los accidentes con gravedad con muertes ```sql= SELECT * FROM actor_vial a LEFT JOIN accidente b ON a.formulario = b.formulario LEFT JOIN vehiculo c ON a.formulario = c.formulario AND a.codigo_vehiculo = c.codigo_vehiculo WHERE a.estado LIKE '%muerto%' OR a.muerte_posterior LIKE 's' AND b.ano_ocurrencia_acc > 2006 ``` ![](https://i.imgur.com/kTWwDU2.png) En total se reportaron *207* accidentes con gravedad de muertes muertes, 2 no coincidentes Podemos apoyarnos con algunos complementos para extraer algo de información a partir de las capas por ejemplo *D3 Data Visualization* para despliegues de reloj de tiempo ![](https://i.imgur.com/Xi97HbC.png) *DataPlotly* para el despliegue y análisis de los datos y gráficos Total por año por gravedad de acciente con muertes ![](https://i.imgur.com/IicqQXE.png) Total por condición de actor y clase vehículo ![](https://i.imgur.com/2EPcI97.png) * Analisis por género Para agregar una vista y sea reconocida en QGIS debe agregar las siguientes sentencias de SQL: ```sql= INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id) VALUES ( 'my_view', 'my_view', 'features', 4326) INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m) values ('my_view', 'my_geom', 'GEOMETRY', 4326, 0, 0) ``` Donde *features* tambien puede reemplazarse por *attributes*. ## Referencias * [Cheatsheet 1](https://pbs.twimg.com/media/E_uirTGWEAIU2Gr?format=jpg&name=large) * [SQL Joins](https://pbs.twimg.com/media/EXF28CgWkAABpiU?format=jpg&name=900x900)