Fecha de publicación: 16/06/2011
Código de la demo de incidencias de tráfico
Recibimos una petición sobre una demo que hicimos hace unos meses, a ver si podíamos publicar la aplicación. Por supuesto, es una aplicación está desarrollada con software libre, en el lenguaje de programación Python, está disponible para descarga aquí, y lo que viene a continuación es una explicación de cómo funciona.
Esta aplicación tiene como objeto generar un fichero KML con los datos de las incidencias de trafico de Gipuzkoa publicadas por el Gobierno Vasco.
La aplicacion coge como fuente de datos el XML de incidencias de tráfico facilitado por GV y mediante la API de B5M conseguimos el punto exacto (lat, lon) de la incidencia. B5M es el servicio geográfico de la Diputación de Gipuzkoa, y entre sus datos libres están los puntos kilométricos de las carreteras guipuzcoanas.
La aplicación está desarrollada en python, y tiene tres funciones básicas:
- Una función que parsea el XML de GV parseXMLopendata
- Una función que ataca el API de B5M para sacar (lat,long) de un punto kilométrico concreto find_latlon_pk(road,km):
- Una función que genera el KML generateKMLdetails(gip_incidents):
parseXMLopendata():
Las incidencias vienen definidas de la siguiente manera:
[xml]
[/xml]
Esta función va recorriendo el fichero XML y selecciona las incidencias de gipuzkoa. (Matrícula = SS), generando una estructura de datos donde dispondremos de la información parseada.
def find_latlon_pk(road,km):
Por cada registro de la lista anterior buscamos su lat,lon mediante el punto kilometrico. Esto lo hacemos consultando el API publica de B5M
URL_B5M = “http://b5m.gipuzkoa.net/ogc/wfs/gipuzkoa_wfs?service=wfs&version=1.1.0&request=getfeature&typename=KP&srs=EPSG:4326&Filter=<Filter><AND><PropertyIsEqualTo><PropertyName>NOMBRE</PropertyName><Literal>%s</Literal></PropertyIsEqualTo><PropertyIsEqualTo><PropertyName>PK</PropertyName><Literal>%s</Literal></PropertyIsEqualTo></AND></Filter>” % (road,km)
Donde road es la carretera y km es el kilómetro donde ha ocurrido la incidencia.
Por ejemplo, queremos sacar el punto kilometrico 6 de la Gi-20, entonces nuestra consulta sería la siguiente:
Devolviendonos un XML, de donde sacamos el dato que nos interesa:
<gml:pos>43.315428 -1.957029</gml:pos>
Veamos donde queda en el mapa ese punto kilométrico.
Ahora que ya tenemos la lat y lon del putno kilometrico, lo añadimos a la estructura de datos.
def generateKMLdetails(gip_incidents):
Una vez teniendo la estructura de datos, mediante esta función generamos un fichero KML donde vendrán las incidencias con la información de cada una de ellas.
Puedes probar este script directamente desde una conosola ejecutando:
$ python incidencias_gipuzkoa.py
donde te creará el fichero KML con las ultimas incidencias de tráfico en Gipuzkoa.
Como hemos comentado antes, esto está desarrollado en python, puedes utilizar este proyecto o si prefieres utilizar la lógica de la aplicación para desarrollar el tuyo propio en el lenguaje que prefieras.
Enlaces: