Mostrando entradas con la etiqueta longitud. Mostrar todas las entradas
Mostrando entradas con la etiqueta longitud. Mostrar todas las entradas

18 sept 2026

script de python para introducir una serie de puntos en bruto de gps en Qgis

La identificación y automatización de tareas es una de las misiones del arquitecto, ingeniero e informático, así como de cualquier actitud científica respecto a la mejora de los procesos que apuntan a la mejora de las condiciones de vida, liberando a la humanidad de tareas rutinarias o tediosas.

Si de algo aprenden rápido los "ordenadores" es sobre "ordenadores", y debo admitir que las capacidades para sintetizar el bagaje de conocimiento humano sobre, -pongamos un ejemplo claro- , cualquier lenguaje de programación es impresionante. El último oráculo del conocimiento que llaman inteligencia artificial es una herramienta del quince.

En nuestro caso disponemos de una lista de coordenadas gps en latitud y longitud, y queremos grafiarlas en 2D en el Qgis, colocándolas cada una en su lugar de forma automática. Necesitamos crear un archivo .csv con las tres columnas -número, latitud y longitud-, guardándolo con las opciones de separador en tabulador. Exportar desde LibreOffice Calc lo permite fácilmente:

Ahora disponemos de este código en el editor de la consola de Python de Qgis. Puedes copiar y pegar y guardarlo como importador.py , por ejemplo.

 ____________________________________

import csv
import os

from qgis.PyQt.QtWidgets import QFileDialog, QInputDialog, QMessageBox
from qgis.PyQt.QtCore import QMetaType

from qgis.core import (
    QgsVectorLayer,
    QgsFields,
    QgsField,
    QgsFeature,
    QgsGeometry,
    QgsPointXY,
    QgsCoordinateReferenceSystem,
    QgsVectorFileWriter,
    QgsProject,
    QgsWkbTypes
)

# Seleccionar archivo CSV/TSV
archivo_entrada, _ = QFileDialog.getOpenFileName(
    None,
    "Selecciona el archivo exportado desde Calc",
    "",
    "Archivos CSV o texto (*.csv *.txt);;Todos los archivos (*.*)"
)

if not archivo_entrada:
    raise Exception("No se seleccionó ningún archivo.")

# Introducir el EPSG de las coordenadas
epsg, ok = QInputDialog.getText(
    None,
    "Sistema de coordenadas",
    "Introduce el código EPSG de las coordenadas, por ejemplo 32730:"
)

if not ok or not epsg.strip():
    raise Exception("No se indicó ningún EPSG.")

crs = QgsCoordinateReferenceSystem(f"EPSG:{epsg.strip()}")

if not crs.isValid():
    raise Exception(f"El EPSG indicado no es válido: {epsg}")

# Elegir ubicación del shapefile de salida
archivo_salida, _ = QFileDialog.getSaveFileName(
    None,
    "Guardar shapefile de puntos",
    "",
    "Shapefile (*.shp)"
)

if not archivo_salida:
    raise Exception("No se indicó un archivo de salida.")

if not archivo_salida.lower().endswith(".shp"):
    archivo_salida += ".shp"

# Crear campos de la capa
campos = QgsFields()
campos.append(QgsField("id", QMetaType.Type.Int))
campos.append(QgsField("x", QMetaType.Type.Double))
campos.append(QgsField("y", QMetaType.Type.Double))

# Configuración del escritor
opciones = QgsVectorFileWriter.SaveVectorOptions()
opciones.driverName = "ESRI Shapefile"
opciones.fileEncoding = "UTF-8"

transform_contexto = QgsProject.instance().transformContext()

escritor = QgsVectorFileWriter.create(
    archivo_salida,
    campos,
    QgsWkbTypes.Point,
    crs,
    transform_contexto,
    opciones
)

if escritor.hasError() != QgsVectorFileWriter.NoError:
    raise Exception(
        "No se pudo crear el shapefile:\n" + escritor.errorMessage()
    )

# Leer el CSV separado por tabuladores
numero_puntos = 0

with open(archivo_entrada, "r", encoding="UTF-8-sig", newline="") as archivo:
    lector = csv.reader(archivo, delimiter="\t")

    for fila in lector:
        # Ignorar filas vacías
        if not fila:
            continue

        # Si existe una cabecera, ignorarla
        if fila[0].strip().lower() in ("id", "n", "numero", "num"):
            continue

        if len(fila) < 3:
            print("Fila ignorada por tener menos de 3 columnas:", fila)
            continue

        try:
            identificador = int(fila[0].strip())

            # Cambiar coma decimal por punto, por seguridad
            x = float(fila[1].strip().replace(",", "."))
            y = float(fila[2].strip().replace(",", "."))

        except ValueError:
            print("Fila ignorada por contener valores no numéricos:", fila)
            continue

        punto = QgsFeature()
        punto.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(x, y)))
        punto.setAttributes([identificador, x, y])

        escritor.addFeature(punto)
        numero_puntos += 1

# Cerrar el escritor para guardar correctamente los archivos
del escritor

# Cargar el shapefile en el proyecto
capa = QgsVectorLayer(archivo_salida, "Puntos GPS", "ogr")

if not capa.isValid():
    raise Exception("El shapefile se creó, pero no se pudo cargar en QGIS.")

QgsProject.instance().addMapLayer(capa)

QMessageBox.information(
    None,
    "Proceso terminado",
    f"Se han creado {numero_puntos} puntos.\n\n"
    f"Archivo:\n{archivo_salida}"
)

_____________________________________ 

Ahora ejecuta el script y aporta la información que te solicita. La ubicación del archivo:

 

el EPSG correcto para tu ubicación:


...y el nombre y ubicación para guardar el archivo shapefile resultante:


Y, con la velocidad del rayo, el resultado es mostrado. Con esto tenemos automatizada la importación de puntos para nuestros proyectos, abriendo interesantes posibilidades para su empleo en diversas aplicaciones. ¡Salud!

developed with duck.ai - published under Creative Commons Licence - septembre 26