En este blog, aprenderás cómo integrar QGIS y QField para gestionar predios en tiempo real. Usaremos Python para crear una capa vectorial en QGIS y configurarla para que pueda ser utilizada eficientemente en QField, permitiendo la captura y edición de datos en campo.

¿Por qué usar QGIS y QField para Gestión de Predios?

QField es una aplicación móvil que permite trabajar con datos SIG en dispositivos Android e iOS, sincronizándose con QGIS. Esto facilita la recolección de información geoespacial en campo, asegurando que los datos estén siempre actualizados y accesibles.

Configuración y Creación de la Capa en QGIS

# -*- coding: utf-8 -*-
from qgis.core import (
    QgsVectorLayer,
    QgsProject,
    QgsField,
    QgsFeature,
    QgsGeometry,
    QgsPointXY,
    QgsCoordinateReferenceSystem,
    QgsVectorFileWriter,
    QgsEditorWidgetSetup,
    QgsProperty
)
from PyQt5.QtCore import QVariant
import os

# 1. Configurar CRS (UTM zona sur - EPSG:32719)
crs = QgsCoordinateReferenceSystem("EPSG:32719")

# 2. Crear capa en memoria (GeoPackage recomendado)
layer = QgsVectorLayer("Polygon?crs={}".format(crs.authid()), "predios", "memory")
provider = layer.dataProvider()

# 3. Definir campos para el levantamiento de predios
fields = [
    QgsField("codigo", QVariant.String, "text", 15),
    QgsField("lote", QVariant.String, "text", 10),
    QgsField("nombre_prop", QVariant.String, "text", 50),
    QgsField("ci_prop", QVariant.String, "text", 15),
    QgsField("estado_lote", QVariant.String, "text", 20),
    QgsField("tipo_construc", QVariant.String, "text", 20),
    QgsField("area_m2", QVariant.Double, "double", 10, 2),
    QgsField("uso_suelo", QVariant.String, "text", 30),
    QgsField("fecha_reg", QVariant.Date),
    QgsField("responsable", QVariant.String, "text", 30),
    QgsField("observaciones", QVariant.String, "text", 255),
    QgsField("foto_principal", QVariant.String, "text", 100)
]
provider.addAttributes(fields)
layer.updateFields()

# 4. Configurar opciones predefinidas para QGIS y QField
# Estado del trámite
estado_idx = layer.fields().indexOf('estado_lote')
estado_widget = QgsEditorWidgetSetup(
    'ValueMap',
    {'map': {'Pendiente': 'Pendiente', 'Aprobado': 'Aprobado', 'Rechazado': 'Rechazado'}}
)
layer.setEditorWidgetSetup(estado_idx, estado_widget)

# Tipo de construcción
tipo_idx = layer.fields().indexOf('tipo_construc')
tipo_widget = QgsEditorWidgetSetup(
    'ValueMap',
    {'map': {'Sin fachada': 'Sin fachada', 'Ladrillo': 'Ladrillo', 'Adobe': 'Adobe', 'Mixta': 'Mixta'}}
)
layer.setEditorWidgetSetup(tipo_idx, tipo_widget)

# 5. Agregar un registro de prueba
feature = QgsFeature(layer.fields())
feature.setGeometry(QgsGeometry.fromPolygonXY([
    [QgsPointXY(500000, 6200000), QgsPointXY(500100, 6200000), 
     QgsPointXY(500100, 6200100), QgsPointXY(500000, 6200100)]
]))
feature.setAttributes([
    "PR-001", "L-01", "Juan Pérez", "1234567LP", "Pendiente",
    "Ladrillo", 150.75, "Residencial", "2023-10-15", "María Gómez",
    "Falta medir lindero norte", "/DCIM/Predios/PR-001.jpg"
])
provider.addFeature(feature)

# 6. Guardar en GeoPackage para su uso en QField
output_dir = r"D:\\DOCENCIA UNIVERSITARIA\\RENE MORENO\\coberturas\\imagen"
os.makedirs(output_dir, exist_ok=True)
output_path = os.path.join(output_dir, "predios.gpkg")

options = QgsVectorFileWriter.SaveVectorOptions()
options.driverName = "GPKG"
options.fileEncoding = "UTF-8"

writer = QgsVectorFileWriter.writeAsVectorFormatV3(
    layer, output_path, QgsCoordinateTransformContext(), options
)

if writer[0] == QgsVectorFileWriter.NoError:
    print(f"¡Capa creada en: {output_path}")
    new_layer = QgsVectorLayer(output_path, "predios", "ogr")
    QgsProject.instance().addMapLayer(new_layer)
else:
    print("Error al guardar la capa")

Integración con QField

Para sincronizar tu proyecto de QGIS con QField:

  1. Guarda el proyecto en el mismo directorio donde creaste el GeoPackage.
  2. Abre QField Sync en QGIS y agrega la capa predios.gpkg.
  3. Exporta el proyecto para QField y transfiérelo a tu dispositivo móvil.
  4. Abre QField en el móvil, carga el proyecto y empieza a editar en campo.
  5. Sincroniza los cambios con QGIS para actualizar la base de datos en tiempo real.

Conclusión

Esta guía proporciona un flujo de trabajo eficiente para la captura de datos en campo mediante QGIS y QField. La integración en tiempo real permite mejorar la toma de decisiones y la precisión en la gestión de predios. ¡Prueba esta solución y optimiza tu trabajo geoespacial!