tag:blogger.com,1999:blog-5644592.post-20525092065258600042008-05-02T21:38:00.005+02:002008-05-02T23:55:58.065+02:00KML y la privacidadEste post pretender ser dos cosas: primero un pequeño manual de como hacer un servidor de KML con python y <a href="http://www.cherrypy.org/">cherrypy</a> y segundo demostrar qué se puede hacer para recibir feedback indiscriminado usando lo anterior.<br /><br />Conocimientos previos:<br />- cherrypy es un API que permite implementar una aplicación web en dos patadas<br />- <a href="http://code.google.com/apis/kml/documentation/">KML </a>es un formato usando principalmente por Google Earth que sirve como contenedor de información geográfica, puntos de interés, etc, etc<br /><br />KML no deja de ser un xml (*sic*) en el cual cabe de todo puntos, líneas, elementos 3D, animaciones y lo que nos interesa, conexiones a un servidor para obtener datos enumrados anteriormente. De esta forma es posible indicarle en un enlace que vaya a un servidor a buscar datos. Hay un pequeño pero efectivo <a href="http://code.google.com/apis/kml/documentation/kml_tut.html#network_links">tutorial </a>en la página del api de google earth.<br /><br />Tomando ese ejemplo creamos el servidor con cherrypy:<br /><br /><span style="color: rgb(160, 32, 240);">import</span> cherrypy<br /><br /><span style="color: rgb(128, 64, 64);"><b>class</b></span> <span style="color: rgb(0, 128, 128);">Root</span>:<br /> <span style="color: rgb(128, 64, 64);"><b>def</b></span> <span style="color: rgb(0, 128, 128);">get_kml</span>(self, latitude, longitude):<br /> kml = (<br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><?xml version="1.0" encoding="UTF-8"?></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><kml xmlns="<a href="http://earth.google.com/kml/2.2">http://earth.google.com/kml/2.2</a>"></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><Placemark></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><name>Random Placemark</name></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><Point></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"><coordinates>%f,%f</coordinates></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"></Point></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"></Placemark></span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(106, 90, 205);">\n</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);"></kml></span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><br /> ) %(longitude, latitude)<br /> <span style="color: rgb(128, 64, 64);"><b>return</b></span> kml<br /><br /> <span style="color: rgb(128, 64, 64);"><b>def</b></span> <span style="color: rgb(0, 128, 128);">index</span>(self, directory=<span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);">.</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span>):<br /> cherrypy.response.headers[<span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);">Content-Type</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span>] = <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);">application/vnd.google-earth.kml+xml</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">"</span></span> <br /> <span style="color: rgb(128, 64, 64);"><b>return</b></span> self.get_kml(-3.332565,42.600353);<br /><br /> index.exposed = True<br /><br /><span style="color: rgb(128, 64, 64);"><b>if</b></span> __name__ == <span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span><span style="background-color: rgb(242, 242, 242);"><span style="color: rgb(255, 0, 255);">__main__</span></span><span style="background-color: rgb(229, 229, 229);"><span style="color: rgb(0, 0, 0);">'</span></span>:<br /> root = Root()<br /> cherrypy.quickstart(root);<br /><br /><br />El tema web no me va, pero estaba interesado en saber como va este tema en python. Me da la impresión que aún está por detrás de Ruby. He estado mirando <a href="http://turbogears.org/">turbogears </a>y la verdad me ha gustado.<br /><br />En el tutorial ponen un ejemplo de KML que se conecta a un servidor, podríamos cambiar la sentencia Link por lo siguiente:<br /><br /><link><br /> <href>http://localhost:8080/</href><br /></link><br /><br />De esta forma al cargar ese fichero en google earth se conectaría al servidor y bajaría kml.<br /><br />Ahora la segunda parte: qué pasa si ese kml es generado por una aplicación y el usuario lo carga en su google earth. Pongamos, por ejemplo, un software de guiado para maquinaria agrícola, en el cual después de haber trabajado se puede guardar ese trabajo a KML para poder verlo más tarde en el PC. Pongamos que ese software escribe algo así dentro del fichero kml:<br /><blockquote><br /><link><br /> <href>http://servidor.com/?license_no=1234&lat=-3.332565&lon=42.600353</href><br /></link><br /></blockquote><br /><br />Gracias al número de licencia conoces al usuario y con latitud y longitud conoces la localización de sus parcelas. Eso por no hablar que con unos pocos bytes se puede enviar _de todo_. Tiene su parte mala, pero también su parte buena, se le pueden dar bastantes usos.<br /><br />Por cierto, y no digo que tenga algo que ver, ya he implementado el writer para kml de agroguía :):<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_XzuP3e63Ok8/SBt0iTmt08I/AAAAAAAAA3s/BklMrhhdG28/s1600-h/_bis.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://bp3.blogger.com/_XzuP3e63Ok8/SBt0iTmt08I/AAAAAAAAA3s/BklMrhhdG28/s320/_bis.png" alt="" id="BLOGGER_PHOTO_ID_5195874727829033922" border="0" /></a>javi santanahttp://www.blogger.com/profile/07638486113933454853noreply@blogger.com