Archivos de la categoría Lenguajes de programación

Todo sistema nace con un lenguaje de programación

Generar un archivo KML a partir de coordenadas GPS con Python

En ocasiones tengo que marcar lugares en Google Earth. Es divertido cuando son 3 o 4. Cuando son 10 o más ya es cosa seria, pero marcar más de mil puntos ya no es práctico hacerlo de forma manual.

De coordenadas GPS a KML usando Python.

Por eso decidí hacer un programa en Python que a partir de las coordenadas almacenadas en un archivo CSV pudiera generar un par de archivos KML que se abren sin problemas en Google Earth y muestran la ubicación de esos puntos en el planeta.

simpleKML y CSV

Una de las muchas ventajas de Python es que no tienes que empezar desde cero. Para importar la información del archivo usé el módulo CSV. Es muy fácil de utilizar. Al barrer el contenido del archivo, por cada coordenada se agrega su punto correspondiente en el archivo KML.

with open(archivocsv, newline='') as File:
    reader = csv.reader(File)
    for row in reader:               
        longlat = row[2], row[1]
        coordenadas.append(longlat)
        kml.newpoint(name=row[0], coords=[longlat])

Hay varios módulos para generar archivos KML en Python, pero simpleKML me pareció, haciendo honor a su nombre, el más sencillo.

Su código de ejemplo así lo demuestra:

import simplekml
kml = simplekml.Kml()
kml.newpoint(name="Kirstenbosch", coords=[(18.432314,-33.988862)])  # lon, lat, optional height
kml.save("botanicalgarden.kml")

Ahora solo tenía que adaptar ese código con la información almacenada en el archivo CSV.

Al principio me llevé un gran susto, porque el resultado me apareció en el polo sur. Y es que, para este caso, primero va la longitud y luego la latitud.

Una vez que invertí el orden de las coordenadas el resultado fue el esperado.

Ejemplo

Como ejemplo, tengo la información de 4 puntos que rodean a la Isla Guadalupe, el punto más occidental de México.

1,29.189462,-118.553373
2,29.254561,-118.124540
3,28.806708,-118.080127
4,28.777603,-118.459080
Los 4 puntos ahora se pueden ver en Google Earth.
Ahora se pueden ver en el mapa los punto 1,2,3 y 4.

El programa no solo genera los puntos, también genera un polígono (o si somos más exactos un Linear Ring).

Linear Ring conecta el perímetro de los 4 puntos y lo muestra en Google Earth.
El Linear Ring conecta el perímetro de los 4 puntos y se puede cambiar su color de relleno.

Esto lo hace en archivos KML por separado, usted elige si quiere importar un archivo u otro o ambos.

Forma de uso.

python gps2kml.py archivo.csv

Esta instrucción  genera 2 archivos KML:

archivo-puntos.kml
archivo-LR.kml

Hice una prueba y este código me hizo el favor de generar los archivos KML con información de 1800 puntos en un par de segundos  ¡A eso le llamo velocidad!. 

Espero que esta información les sea de utilidad, uno nunca sabe.

Para saber más.

Foto principal de rawpixel en unsplash.

Enviar correos electrónicos con Python

envía correo con python

Incluir una función para enviar correos electrónicos en Python puede ser muy útil. Agregué esta función en el programa que utilizo para monitorear mis equipos de red para que me mande un correo electrónico en caso de alguna falla (léase Python Ping, un script que revisa las direcciones IP de tu red ).

Combinando esta función con una base de datos se puede aprovechar para mandar correos personalizados.  Para notificar cambios en el sistema, como un cambio de contraseña, o avisar de alguna situación. En fin que las aplicaciones son muchas y muy útiles.

Pero pongamos manos a la obra con un ejemplo.

Importar módulos.

Una de las cosas que más me gusta de python es que si no tiene una opción se puede incluir importando un módulo que de otro modo tardarías mucho tiempo en desarrollar.

Para lograr que mi script mande correos electrónicos incluí estas líneas al comienzo del programa.

from email.mime.text import MIMEText
from smtplib import SMTP

La función manda_correo

El trabajo pesado lo hace la función manda_correo cuyo trabajo se puede dividir en 3 partes.

La primera junta información, ¿Quién manda el correo?, ¿A cuál dirección se va a mandar? y el cuerpo del mensaje.

    from_address = "origen@correo.com"
    to_address = direccion
    message = "Hola " + nombre +", \n\n" + \
        "Este correo es solo para saludarte." + \
        "\n\nAtentamente," + \
        "\n\nTu función que manda correos desde Python."

La segunda que se encarga de construir un correo electrónico con la información que le proporcionaste

    mime_message = MIMEText(message, "plain")
    mime_message["From"] = from_address
    mime_message["To"] = to_address
    mime_message["Subject"] = "Saludos " + nombre

Y por último, la parte que se encarga de negociar con el servidor y mandar el correo electrónico.

    smtp = SMTP('servidordecorreo.com',587)
    smtp.login("usuario","contraseña")
    smtp.sendmail(from_address, to_address, mime_message.as_string())
    smtp.quit()

Los parámetros de la función son totalmente personalizables y en mi caso sólo usé un nombre coloquial para el saludo y la dirección de correo de destino.

Aquí pueden leer el código completo:

funcion que envia correos en python

¡Llegó el correo!

Ahora con HTML.

Me preguntaron como hacer para mandar correos con estilo y eso se logra con HTML. Para lograrlo hay que hacer algunos ajustes.

enviar correos con html con python

En la línea 16 hay que cambiar de plain a html y claro, incluir los códigos HTML  en el cuerpo del mensaje.

Y así de simple, de golpe y porrazo ya tenemos una función que manda correos electrónicos desde Python.

Para saber más.

Imagen principal de Samuel Zeller en Unsplash.

python ping en ejecucion

Python Ping, un script que revisa las direcciones IP de tu red

La mejor forma de aprender un lenguaje de programación es tomando un proyecto y resolviendo sus problemas. En el proceso se investiga como hacer las cosas, resolver algunas dudas, depurar el código y probar su funcionalidad.

Soy fan de Python, pero no soy un experto. Python Ping es un programa que toma un archivo CSV (delimitado por comas) que tiene dos datos, una descripción del equipo y su dirección IP.

El programa toma esa información y hace ping, si el equipo responde, muestra un mensaje de OK, de lo contrario, reproduce un sonido y muestra un mensaje de error.

Hace una pausa de 10 minutos y vuelve a empezar. De esa forma es posible detectar problemas en la red, su ubicación y su frecuencia.

En una operación normal, todo debería de estar OK, pero todos sabemos que eso no siempre es así.

El archivo CSV.

Lo bonito de almacenar la información en un archivo CSV es que es muy sencillo de editar, actualizar y mantener.

Para ejemplo de este artículo elegí servidores que todos conocemos:

Archivo servidores.csv

Google , google.com
Bing , bing.com
Facebook , facebook.com
Twitter , twitter.com
Wikipedia , wikipedia.com

Una descripción, luego una coma y al final una dirección. Para el ejemplo puse los dominios, pero se pueden reemplazar por las direcciones IP. Eso lo hago porque a mi me interesa revisar una red local.

Desmenuzando el programa.

Al final del artículo pondré el código completo, aquí voy a ir desmenuzando algunas de las partes del mismo.

Import

import os
import csv
from colorama import Fore
import time
import datetime

Esta es la lista de los import del programa. Para que algunas cosas funcionen es necesario declararlas primero.

os lo utilizo para ejecutar instrucciones como si estuviera en la terminal.

csv para importar la información del archivo CSV en una variable dentro del programa.

colorama le da color, poniendo los errores en rojo, lo que esta bien en verde, los textos en blanco.

time y datetime los uso para formatear algunas salidas de tiempo.

check_ping

La función check_ping es la que hace el trabajo pesado. Quiero hacer notar que en lugar de utilizar el comando ping tradicional uso el comando fping que es más rápido y se adapta mejor cuando se llama desde un script.

La instrucción fping hace 10 reintentos antes de declarar un error de conexión.

sonido_alerta

Esta función es un plus. No voy a estar viendo la pantalla todo el tiempo durante la ejecución del script. Así que si hay un error hace un sonido. Como pueden ver en el código, lo que hace es reproducir un archivo mp3 a su elección.

El loop

El programa se repite indefinidamente en un ciclo haciendo una pausa de 10 minutos. De esta forma está revisando continuamente la red y avisa si hay algún problema. Para terminar el ciclo hay que presionar Control + C y se interrumpe la ejecución.

python_ping en acción

Como pueden ver, el programa es relativamente sencillo. Estoy consciente de que hay muchas cosas que se pueden mejorar, así que estoy abierto a sus comentario. Si desean utilizarlo, lo pueden hacer respetando claro la licencia pública general GNU, que permite utilizar, distribuir y modificar este código.