Imagenes Satelitales via Python

download Imagenes Satelitales via Python

of 4

Transcript of Imagenes Satelitales via Python

  • 7/31/2019 Imagenes Satelitales via Python

    1/4

    Imgenes satlite en Python

    VIGILANTES

    DEL PLANETAQuin no ha querido alguna vez sentirse como esos informticos de la NASA en su centro de control? Hoynos construiremos el nuestro y controlaremos el planeta y sus alrededores.

    POR JOS MARA RUIZ Y PEDRO ORANTES

    C ada vez que vemos el lanzamien-to de un cohete todos quedamosasombrados ante la explosin deldespegue, la atenta mirada de todos esoscientficos a los paneles de control, y lamonstruosa cifra que nos dicen que sehan gastado en el proyecto.

    A donde van los impues-tos?Es entonces cuando surge la pregunta yeso a m en qu me repercute? Un daestando en el despacho de la Rama delIEEE de Mlaga tuve una conversacin enla que me contaron que la mayor parte delos satlites emiten al mundo las imge-nes y los datos que recogen. Es decir, si seposee el equipo necesario es posible reci-bir en tu propia casa imgenes fascinantesdel universo, de Marte o de la Tierra.

    La temperatura del ocano, imge-nes meteorolgicas, imgenes delcampo magntico del sol o de lasmisiones a Marte son enviadas cons-tantemente a la Tierra desde estosengendros espaciales. Y el efecto essiempre el mismo, el espectador esdeslumbrado por el presentador detelevisin con una imgenes increblesmientras se escuchan acordes de sinte-tizador.

    Acaso no son esas imgenes de domi-nio pblico? Dnde puedo conseguirlas?En el presente artculo utilizaremosPython para crear un script CGI que nospermita recoger y mantener actualizadaslas imgenes que queremos en una espe-cie de collage o mural. Construiremosnuestro propio centro de control espa-cial.

    Recoger las imgenesLo primero ser encontrar las imgenes yreunirlas. Vamos a usar como ejemplocuatro imgenes de carcter cientfico.Se actualizan a distintos intervalos, demanera que podremos ver cmo evolu-

    Python DESARROLLO

    61Nmero 10W W W. L I N U X - M A G A Z I N E . E S 61

    Poco tiempo despus de finalizar esteartculo apareci una noticia en Slashdot(ver Recursos [4]) hablando de una lla-marada solar de tal tamao que iba aalterar las comunicaciones. Cuando sedan este tipo de eventos en muchos cen-tros de control de satlites los ingenie-

    ros cruzan los dedos para que sus satli-tes no caigan ante la ola de viento solarque se origina. El lector puede apreciarla llamarada en la Figura 4.

    Curiosidad

  • 7/31/2019 Imagenes Satelitales via Python

    2/4

    En la variable c almacenamos el objetoque representa la conexin realizada ypodemos enviar peticiones.

    >>> c.request("GET","/issue/08")

    >>>

    Usamos el comando GET, con lo queestamos solicitando un objeto. El segun-do parmetro del mtodo es la rutahasta el objeto. As que la URL que esta-mos solicitando es http://www.linux-magazine.es/index.html . Es impor-tante que la ruta comience con una barra/, como si fuese la ruta de un ficherode una mquina. Cmo sabemos si todoha ido bien?

    >>> r = c.getresponse()>>> print r.status,r.reason200 OK>>>

    Con getresponse podemos conseguir unobjeto que representa los datos devuel-tos por la conexin. Este objeto tiene,entre otros, los atributos status y rea-son que nos indican el estado, unnmero con un significado especial, yla explicacin del mismo. En este caso

    todo ha ido bien y por eso recibimos unOK. En caso contrario, si no existiesela ruta que pedimos habramos obteni-do:

    >>> r = c.getresponse()>>> print r.status, r.reason400 Bad Request>>>

    Ahora ya tenemos la pgina, solo tene-mos que leerla, usando el mtodo read()del objeto respuesta.

    >>> print r.read()

    Linux Magazine - U

    Spamassasin, Hypermail, U

    Encriptacin GPG, SDL, U

    ...

    Cuando hayamos finalizado debemoscerrar la conexin invocando el mtodoclose() del objeto que representa la cone-xin, en este caso sera:

    >>> c.close()>>>

    Para obtener las imgenes vamos a hacerexactamente lo mismo, abriremos unaconexin, pediremos la imagen, la alma-cenaremos en una diccionario y cerrare-mos la conexin.

    Python Imaging LibraryNuestra idea original era realizar unmural o collage con las imgenes recupe-radas. Python no nos provee de unalibrera de tratamiento grfico en su dis-tribucin estndar. Eso no quiere decir

    que no exista tal librera, y no slo exis-te, sino que adems es muy potente ytil. Nos referimos a Python ImagingLibrary (ver URL [2] en el Listado deRecursos al final del artculo).

    La librera PIL (Python Imaging Library)nos va a permitir tratar imgenes en unagran cantidad de formatos. Podremos con-vertirlas a otro formato, rotarlas, escalar-las, mezclarlas, etc. Aquel lector que hayatenido contacto con programas de mani-pulacin grfica, como por ejemplo GIMP(ver URL [3] en el Listado Recursos), com-prender la potencia de una librera conestas funcionalidades.

    cionan las eventos que se registran.Puedes encontrar las URLs en Recursos[1].

    Debemos descargar las imgenes yalmacenarlas dentro de nuestro progra-ma, haremos uso de la librera httplibque es parte de la distribucin estndarde Python. Esta librera nos permitirhablar de t a t con un servidor webremoto sin tener que preocuparnos delos detalles de ms bajo nivel. Esta con-versacin la realizaremos usando el pro-tocolo HTTP . Este protocolo es bastantesimple y de l slo necesitaremos unaparte mnima.

    Cuando Tim Berners Lee realiz eldiseo original de la Web quiso que elprotocolo para pedir los documentosfuese lo ms simple posible. HTTP sereduce a la recepcin y el envo de infor-macin al servidor, eso y slo eso. Secompone de varios comandos, pero losms conocidos son GET , que podemostraducir como tomar, y POST , quepodemos traducir en este contexto comoenviar o mandar. As que tomamosdocumentos y enviamos informacin.

    Una parte importante de HTTP es URLque nos sirve para darle nombre a esosdocumentos. Todos estamos acostumbra-dos a tratar con urls, generalmente deltipo http://www.linux-magazine.es/ issue/08 . La url se compone de: [protoco-lo]://[maquina]/[ruta]/[objeto] . Vamos aver ahora porqu es tan importante quesepamos esto.

    La librera httplib de Python estableceen un primer paso una conexin con elservidor remoto mediante el mtodo HTTPConnection

    >>> c = httplib.HTTPConnection U

    ("www.linux-magazine.es")>>>

    DESARROLLO Python

    62 Nmero 10 W W W. L I N U X - M A G A Z I N E . E S

    01 >>>mural =Image.new('RGB',(600,480))

    02 >>> im =Image.open("daemon.jpg")

    03 >>> im.thumbnail((300,200),Image.ANTIALIAS)

    04 >>> mural.paste(im,(0,0))05 >>> mural.paste(im,(300,0))06 >>> mural.show()07 >>>

    Listado 1: Ejemplo de usode PIL

    Figura 1: La imagen original que vamoa amodificar con PIL.

    Figura 2: La imagen del pequeo demonio deBSD rotado 45 con PIL.

  • 7/31/2019 Imagenes Satelitales via Python

    3/4

    Python DESARROLLO

    63Nmero 10W W W. L I N U X - M A G A Z I N E . E S

    en el resultado hemos invocado el mto-do show() que mostrar el resultadomediante el programa xv (para cerrar xvsolo tenemos que pulsar q).

    Nosotros no buscamos rotar imgenes,

    sino escalarlas. Las imgenes presentesen la web suelen ser de gran tamao ynosotros queremos crear un mural de untamao esttico. Tendremos que adaptarlas imgenes descargadas para que que-pan en el mural.

    Para hacerlo vamos a insertar lasimgenes en una mayor, pero haymuchas maneras de hacer esto. Lasolucin que adaptaremos en nuestrocaso es la de dividir la imagen-mural entantos recuadros como imgenes vaya-mos a insertar. Cmo sabremos la can-tidad de cuadrculas? Pues escogere-mos la menor potencia de 2 que seamayor que nuestro nmero de imge-nes. No es muy complicado, por ejem-plo, si tenemos 7 imgenes, 8 (2 eleva-do a 3) ser suficiente. Bsicamentemultiplicaremos 2 por s mismo hastaque sea mayor que el nmero de im-genes que queramos mostrar.Grficamente lo que haremos ser irdividiendo en anchura y en altura laimagen en cuadrculas, en cada itera-

    cin se multiplicar por 2 el nmero decuadrculas. Con este mtodo perdere-mos espacio en la imagen, pero al sertan sencillo no complicar mucho elcdigo.

    Creemos el thumbnail Primero creemos una imagen vaca, verListado 1. La Figura 3 muestra el resulta-do. Esta vez no cargamos ninguna ima-gen, sino que usamos el mtodo new()que necesita el tipo de pixel (RGB vienede Red->Rojo Green->Verde Blue->Azul, es uno de los formatos estndar)y el tamao de la imagen medido enpixels. En nuestro caso hemos escogido600 pixels de ancho por 480 de alto(presta atencin a los (), porque laresolucin se expresa como una secuen-cia del tipo (x,y) ). Esta nueva imagenno contiene nada a excepcin de undecepcionante fondo negro. Vamos aponer algo de color!

    Cogemos la imagen del daemon einvocamos el mtodo thumbnail() queescala la imagen tanto vertical comohorizontalmente. Tenemos que pasarle eltamao deseado como una secuencia, lanueva imagen tendr un tamao de

    300x200 pixels. Puede aceptar un par-metro adicional, en nuestro caso es Image.ANTIALIAS que debera mejorarla resolucin de la nueva imagen.

    A continuacin usamos el mtodo paste() de Image que nos permitepegar una imagen dentro de otra en lascoordenadas indicadas como segundoparmetro. Pegamos la imagen dae-mon dos veces, la primera en la posi-cin (0,0) del mural y la segunda en laposicin (300,0). Podemos ver el resulta-do usando el mtodo show() .

    El fichero de configuracinLas URLs y la resolucin deben ser recogi-das por el programa, pero cmo? Existenvarias opciones, podramos pasrselas alprograma cuando se ejecute. Las URLstienen el problema de ser bastante largasen ocasiones, as que la linea de comandopara ejecutar el programa puede ser engo-rrosa.

    En lugar de eso vamos a usar un ficherode configuracin. Cada vez que el progra-ma se ejecute leer este fichero y recogerlos parmetros oportunos.

    Qu forma tendr el fichero? La ltimatendencia es crear ficheros XML de confi-guracin. Pero el XML puede ser demasia-do complicado si tenemos en cuenta quenuestro fichero de configuracin puedeno tener ms de 10 lneas. En UNIX la ten-dencia es la de usar el formato de clave= valor y ese es el que usaremos. Elfichero ser como el que se muestra en elListado 2.

    Leeremos cada lnea del fichero, la divi-diremos usando el = y usaremos la pri-mera parte como clave en un diccionario,y la segunda como valor. Si ya existe laclave, usaremos una lista como valor con

    Como no viene de serie con Pythondeberemos instalarla en nuestra distribu-cin o sistema operativo. Existen paque-tes RPM y DEB de la misma.

    Cmo se trabaja con PIL? Puesmediante la manipulacin de objetos dela clase Image . Esta clase es capaz dealbergar imgenes de casi cualquier for-mato, permitindonos manipularlas.Vemos un ejemplo. En la Figura 1 pode-mos ver la imagen original del ficherodaemon.jpg en mi equipo. Vamos a rotar-la 45 grados:

    >>> import Image>>> im = Image.open U

    ("daemon.jpg")>>> img.rotate(45).show()>>>

    En la Figura 2 podemos ver el resultado.Hemos usado el mtodo rotate() al quehemos pasado un ngulo de 45 grados, y

    01 [tamao]02 horizontal = 80003 vertical = 6000405 [imgenes]06 url1 =

    http://www-mgcm.arc.nasa.gov/MarsToday/marstoday.gif

    07 url2 =http://www.sec.noaa.gov/sxi/current_sxi_4MKcorona.png

    08 url3 =http://www.ssec.wisc.edu/data/sst/latest_sst.gif

    09 url4 = http://www.wetterzen-trale.de/pics/D2u.jpg

    Listado 2: collage.conf

    Figura 3: Creamos una imagen vaca con PILy despus colocamos otras imgenes en suinterior como mosaico.

    Figura 4: Llamaradas solares que amenazancon dejar fuera de combate a los satlites decomunicadciones.

  • 7/31/2019 Imagenes Satelitales via Python

    4/4

    Cuando un mtodo comienza con __se convierte en privado. Cualquier inten-to de hacer uso de ese mtodo generaruna excepcin. Por tanto esos mtodosno pueden ser invocados desde fuera delobjeto Collage . De esta manera Collageslo tiene un mtodo accesible desde elexterior, generaCollage() . Se ha separadola generacin de HTML de la del collagepara posibilitar las futuras extensionesdel objeto. Por ejemplo podramos no

    querer generar un fichero HTML sinoincorporar la imagen en un programa. Ental caso heredaramos de Collage y crea-ramos un nuevo mtodo generaCollage() que solo generase laimagen y la devolviese.

    El mtodo __generaHTML() genera elcdigo HTML de la pgina web. Unpunto a resaltar es que genera un mapa

    sobre el collage, de maneraque sea posible pulsar sobrelas distintas imgenes que enl aparecen. Al hacerlo se car-gar la imagen a tamao natu-

    ral. El mapa se genera reco-rriendo el diccionario de im-genes. Cada entrada del dic-cionario contiene un objeto dela clase Imagen .

    Imagen alberga la informa-cin de cada imagen descar-gada mientras el programa laalmacena. Se almacenan losdatos propios de cada ima-gen, como por ejemplo lascoordenadas que ocuparfinalmente en el collage.

    Como siempre, se esperaque el lector dedique algo de tiempo ajugar con el programa para adaptarlo asus necesidades o ideas.

    ConclusinLa complejidad de un programa Pythonno depende de la cantidad de lneas decdigo que contenga, sino ms bien delnivel al que trabaje. En el programa deeste artculo hemos hecho uso intensivode libreras que han realizado acciones

    muy complicadas por nosotros. Pythonposee una amplio abanico de libreras aexplotar, muchas de ellas con aos dedesarrollo esperando a programadorescon ideas originales que poner en prcti-ca. s

    los distintos valores comoentrada. Pero por qu vamosa realizar nosotros el trabajoduro cuando alguien ya lo haresuelto?

    Python trae en su distribu-cin estndar una librera quenos ser de enorme utilidad.Alguien consider oportunoelaborar un analizador dearchivos de configuracin, sellama ConfigParser . Con ellapodemos extraer la informa-cin del archivo de configura-cin.

    El archivo de configuracinse compone de Secciones yOpciones. Cada seccin con-tiene varias opciones, y losnombres de las secciones y opcionesdeben ser nicos. Por eso las URLscomienzan con url1, url2 y url3.Pero esto no ser un problema, vemoscmo funciona ConfigParser (ver Listado3). Como podemos apreciar en el ejem-plo, el uso de ConfigParser es muy senci-llo. Primero se crea el analizador, guar-dndolo en la variable config . Despuscargamos con el mtodo readfp() el fiche-ro de configuracin; este mtodo tambin

    analiza el fichero. A partir de ese momen-to podemos realizar preguntas al objetoalmacenado en config . Con sections()obtenemos una lista de las secciones ycon options() de las opciones. Con esainformacin ya podemos recoger losdatos necesarios usando el mtodo get() ,al que pasamos una seccin y unaopcin.

    Ensamblemos las partesAhora ya tenemos: Un sistema de configuracin,

    usando ConfigParser . Un sistema para descargar las

    imgenes, usando httplib . Un sistema para manipular las

    imgenes, usando PIL.Nos toca ahora unirlo todo para que gene-re la pgina que aparece en la Figura 5. Elresultado final se puede descargar de [5].

    Crearemos una clase Collage con losmtodos __cargaConf() __descarga() __totalXY() generaCollage() __generaImagen() __generaHTML()

    DESARROLLO Python

    64 Nmero 10 W W W. L I N U X - M A G A Z I N E . E S

    [1] Grficos que usaremos:

    http://www-mgcm.arc.nasa.gov/ MarsToday/marstoday.gif

    http://www.sec.noaa.gov/sxi/ current_sxi_4MKcorona.png

    http://www.ssec.wisc.edu/data/sst/ latest_sst.gif

    http://www.wetterzentrale.de/pics/D2u. jpg

    [2] Python Imaging Library: http://www.pythonware.com/products/pil/

    [3] The Gimp: http://www.gimp.org

    [4] Noticia sobre llamarada solar enSlashdot: http://science.slashdot.org/ science/05/09/08/1933205.shtml?tid=215&tid=14

    [5] Listado del programa final de esteartculo:

    RECURSOS

    Figura 5: Nuestro panel de control espacial terminado y colocado enuna pgina web generada dinmicamente.

    01 >>> config =ConfigParser.ConfigParser()

    02 >>> config.readfp(open('colla-ge.conf'))

    03 >>> config.sections()04 ['tamao', 'imgenes']05 >>>06 >>> config.options('imagen')07 ['url1', 'url3', 'url2']08 >>>09 >>>

    config.get('imagen','url1')10

    '"http://www-mgcm.arc.nasa.gov/MarsToday/marstoday.gif"'

    Listado 3: Uso deConfigParser