archivo

Python

UNIGIS Girona ofrece webinars, abiertos y gratuitos, sobre temáticas relacionadas con las Tecnologías Geoespaciales. El próximo geowebinar Crea tu mapa a partir de datos de las redes sociales se realizará:

Jueves 17 de septiembre 2015, a las 16h00. (Calcula tu zona horaria)

A cargo de Josep Sitjar, tutor UNIGIS Girona y analista SIG del Servicio de SIG y Teledetección (SIGTE) de la Universidad de Girona.

heat_map_978x424

Los datos publicados en las redes sociales tienen un componente geográfico: los tweets pueden estar geoposicionados, las fotografías hacen referencia de determinados sitios, los datos de Foursquare permiten encontrar lugares. En este webinar seguiremos una metodología para recoger datos geoposicionados de las redes sociales, así como diversos métodos de representación de estos datos en entornos web. Veremos como partir de la librería Tweepy (python), el almacenamineto de los datos en una base datos no relacional (MongoDB) y la visualización de los datos sobre un mapa web (Leaflet) se puede extraer valor y explotar los datos que circulan en las redes sociales.

 

Puedes inscribirte y encontrar más información en la web de UNIGIS

Actualizado: Grabación del webinar

Libros recomendados sobre Python:

20150304014122666

Hace poco estaba buscando la manera de poder programar algún dispositivo móvil para la captura de datos. Una de las ideas fue mediante una placa Arduino pero no disponía del sensor GPS y tampoco es accesible para mucha gente. Buscando por la red me topé con QPython, la oportunidad de programar en Python desde nuestro teléfono móvil Android, y más importante que eso, poder acceder a los sensores del propio móvil entre otras cosas.

Se que esta aplicación no es nada nueva pero la verdad es que no lo conocía, y estoy seguro que otros estarán como yo. Vosotros mismos os podréis dar cuenta una vez veáis por encima lo que es capaz de hacer, que disponer de un dispositivo programable de este tipo tan a mano puede ser de gran utilidad. Y ahora, a explicar lo poco que llevo entendido sobre esta aplicación:

QPython te permite ejecutar código Python desde vuestras terminales Android, además de instalar librerías externas con un solo comando, tanto librerías preparadas para el acceso a las funciones del móvil como instalar otras librerías disponibles para Python con cientos de funcionalidades directamente de la red. Estas aplicaciones las podemos dejar ejecutándose en segundo plano en nuestro móvil.

La aplicación de QPython la podéis descargar gratuitamente desde la Play Store y está basada en Python 2.x, pero también existe la versión para Python 3.x. Podéis encontrar documentación en su Wiki qpython con ejemplos y explicaciones, o en stackoverflow.

20150304021723784

Para la instalación de librerías externas consta de dos métodos:

  • QPypi: librerías ya preparadas por la aplicación. Podemos encontrar androidhelper (acceso a sensores del móvil, cuadros de texto, etc), kivy (nos permite crear aplicaciones rápidas en nuestro android: botones, pantallas con mensajes, etc), numpy, sqlite3, etc.
  • pypi: nos da acceso al directorio de librerías Python en la red, permitiendo la descarga de la librería que queramos tan solo introduciendo su nombre.

Una de la librerías que hemos probado a instalar es la librería de Geopy, entrando en el apartado de librerías de la aplicación y escribiendo un: `pip install geopy` se nos instalará esta librería de Python para la geocodificación de coordenadas en direcciones. La precisión de los GPS en los móviles sabemos que no es una maravilla, pero para muchos casos puede ser suficiente, y lo mismo de sus sensores de orientación, etc.

20150304023508542

Una vez instalada, podemos abrir la aplicación y acceder a un pequeño tutorial «Quick Start». Aquí ya podemos echar un vistazo de la apariencia que tiene el código en estas aplicaciones. En cualquiera de ellas podemos hacer click sobre «Copy to editor to run», y una vez estamos en el editor hacemos click en el botón de «Play» para ejecutar el script. En el segundo podemos ver un ejemplo de una aplicación que cambia de color el fondo de pantalla al hacer click sobre la pantalla (tenerla en ojo para hacer captura al presionar de un punto GPS por ejemplo).

20150304021723736

Si en vez de entrar en el tutorial, deslizamos la pantalla hacia la izquierda, aparecerán el resto de botones de la aplicación, entre los que podemos ver la consola para ejecutar código, el Editor y el Programs con nuestros scripts, el apartado de Libraries para la instalación de librerías externas y el de Community con acceso a la web de qpython.org

Otra cosa que estarás pensando es lo complicado que sería escribir código con el teclado del móvil, o el envío a través de otros medios. Desde QPython lo han solucionado con un lector QR en su web que carga directamente tu código en la app (actualmente no disponible por reforma de la web). Por ahora lo más factible sería cargar tu fichero en el móvil utilizando algún métodos de los comunes para envío de datos, ya sea usando la red o mediante cable de datos.

20150304022908390

Un ejemplo sencillo es el acceso al sensor gps, mostrando por consola sus coordenadas. Aquí faltaría ver con más calma el significado de los datos que nos da, creo que si le pedimos al sensor las coordenadas de tipo «network» son las relacionadas con tu red wifi o torre móvil pero no están calculadas mediante gps, para ello son las de tipo «gps» que vemos en el script gps_track de más abajo.

(gps_basics.py)

import androidhelper
dr = androidhelper.Android()
dr.startLocating()
l = dr.readLocation()
rloc = l.result
rnet = rloc["network"]
print rnet["latitude"], rnet["longitude"]

Otro pequeño ejemplo es leer la orientación del sensor aunque no he podido comprobar su exactitud o funcionamiento, pero nos sirve como prueba:

import androidhelper
dr = androidhelper.Android()
dr.startSensingTimed(1, 250)
sensor = dr.sensorReadOrientation().result
l = dr.readSensors()
print l.result
lr = l.result
azi= lr['azimuth']
print azi
droidtrack_bus

El siguiente script de prueba que he realizado está basado en ejemplos vistos en la wiki de Qpython y también en este antiguo post, Droidtrack, sobre la captura de datos GPS. Lo que conseguirás con el siguiente script es simplemente ir capturando los datos del sensor gps de tipo «gps» cada 30 segundos con un total de 50 puntos, siendo el resultado un fichero de texto como el de la imagen que aparecerá en nuestra tarjeta de memoria.

(gps_track.py)

#-*-coding:utf8;-*-
#qpy:2
#qpy:console

print "This is console module"

import androidhelper, time
droid = androidhelper.Android()
droid.startLocating()
time.sleep(10)
c = 0
while c<50:

l = droid.readLocation()
R =l.result
try:
R =R["gps"]
Lat= R["latitude"]
Lon=R["longitude"]
#R1 =R["network"]
#Lat1=R1["latitude"]
#Lon1=R1["longitude"]
outstr = str(Lat) +","+ str(Lon)
droidfile = '/sdcard/droidtrack_bus1.txt'
print outstr#, str(Lat1) , str(Lon1)
fh = open(droidfile,'a')
res= fh.write(outstr +'\n' )
res = fh.close()
time.sleep(30)
c+=1
print c
except:
time.sleep(10)
print c
print R
c+=1

Para este caso he querido realizar una representación rápida de los datos utilizando CartoDB quedando algo así:

20150304014122269

Pensar la cantidad de opciones que nos abre tener un dispositivo programable y móvil bajo un lenguaje como Python, con el que poder realizar por ejemplo una interfaz con un formulario realizado con la librería kivy para la captura de coordenadas gps mediante androidhelper, teniendo la posibilidad de convertirlos al momento a direcciones mediante geopy y analizar las estadísticas de la zona mediante numpy, todo esto mediante vuestro móvil en el propio lugar donde estés y de forma automatizada.

Todo esto es por ahora una simple prueba con lo que he podido encontrar, falta mucho por aprender e investigar, seguro que existen muchas más opciones o documentación que desconozco. Me encantaría conocer si lo habéis probado o si le encontráis posibles utilidades.

Os mantendré informados con las próximas pruebas que realice.

gmailpythonsimple

Merodeando por Internet encontré una página con contenido muy interesante «Pythin, GIS and Stuff», en ella vi un código que ya había pensado en buscar y es la opción de poder enviar un email con los resultados a nuestra cuenta desde el propio script. Y esto se hace de una forma muy sencilla. He simplificado un poco el de su web para que podáis pegar y copiar directamente sea cual sea la plataforma que vais a usar (en su web ejemplo de uso con ArcGIS).

Al ser una librería de Python, este código funciona desde cualquier sitio donde lo ejecutes, puedes agregarlo a scripts de OGR/GDAL desde editores externos,o a tus scripts en gvSIG, PyQGIS o ArcPy. En todos funciona perfectamente por lo que he podido probar.

Lo único que necesitamos introducir es la información una cuenta Gmail, la contraseña, y la cuenta destinatario. (Cuidado si le mandáis a alguien el script con eliminar la contraseña).

La función aceptará dos variables, el mensaje (una variable tipo string) y una variable booleana (True/False) por si queremos modificar el contenido de alguna forma, en este caso solo indica un supuesto de si se han procesado bien o mal los cálculos, cambiando el encabezado del email.

·

pythonemail

·

Además se ha añadido que la variable se cargue con los datos de un txt que hallamos podido crear. Esto se puede eliminar, solamente dejando que se asigne el valor de una variable string normal, asignar directamente a strResult un valor.

Copiando y pegando este bloque de código solamente deberéis de usarlo llamandolo de la forma:

sendResultEmail(strResult, success)

·

import smtplib

def sendResultEmail(msgContents, success_TF):
    '''sendResultEmail(msgContents, success_TF)'''

    #Info
    to = 'email@gmail.com'
    send_username = 'email@gmail.com'
    send_password = '*****'
    smtpserver = smtplib.SMTP("smtp.gmail.com",587)

    if success_TF:
        subject = 'Resultados de la prueba de email: script SUCCESS.'
    else:
        subject = 'Resultados de la prueba de email: script FAILURE.'
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(send_username, send_password)
    header = 'To:' + to + '\n' + 'From: ' + send_username + '\n' + 'Subject:' + subject + '\n'
    msg = header + '\nArcpy results: \n' + msgContents + '\n'
    smtpserver.sendmail(send_username, to, msg)
    smtpserver.close()

outTxt = "c:/gvsig/uni/dataInfo.txt"
txtFile = open(outTxt, "r")
strResult = txtFile.read()
txtFile.close()
success = True

sendResultEmail(strResult, success)