[Spanish] Leyendas en mapas con mapserver

Jorge Arévalo jorge.arevalo at deimos-space.com
Wed Sep 28 07:35:55 EDT 2011


2011/9/27 Jorge Arévalo <jorge.arevalo at deimos-space.com>:
> Buenas,
>
> 2011/9/26 Jorge Gaspar Sanz Salinas <jsanz at osgeo.org>:
>> El 26/09/11 18:04, Jorge Arévalo escribió:
>>> Hola listeros,
>>>
>>> Gracias a vuestros consejos, voy haciéndome con mapserver :-). Ahora
>>> estoy liado con el tema de las leyendas de los mapas. Me explico:
>>>
>>> Estoy sirviendo un fichero ndvi bastante grande (ya he usado gdaladdo
>>> y gdaltindex, gracias por la guía). Los ficheros ndvi tienen una
>>> banda, y los valores de los píxeles van de -1 a +1. Con los parámetros
>>> "SCALE" Y "SCALE_BUCKETS" de LAYER puedo controlar el rango de valores
>>> a clasificar y el número de valores en cada rango. Por ejemplo, ahora
>>> lo tengo de esta forma:
>>>
>>> LAYER
>>>     NAME "ndvi"
>>>     DATA /path/al/fichero
>>>     TYPE RASTER
>>>     STATUS on
>>>     PROCESSING "SCALE=-1.0, 1.0"
>>>     PROCESSING "SCALE_BUCKETS=10"
>>>     ...
>>> END
>>>
>>> Con eso consigo sacar el ndvi, y me aplica unos colores el solito. Al
>>> no meterle ninguna opción CLASS para modificar el color de los píxeles
>>> en función de su valor, entiendo que me coge escala de grises en
>>> función de los rangos que yo le haya definido (10, en mi caso), ¿me
>>> equivoco?.
>>
>> pues eso lo sabrás tú no? es decir si ves escalas de grises o no....
>>
>
> Sí, perdón por la manera de expresarlo :-). Lo veo en escala de
> grises, claro, y es como me gustaría verlo. La pregunta es otra. Para
> aclararnos:
>
> Tengo un ndvi: una sola banda, con valores de tipo Float32,
> comprendidos entre -1.0 y 1.0. Lo voy a servir a través de Mapserver.
> Si a la capa donde se carga el ndvi le meto dos clases tal que asi
>
> CLASS
>     NAME "rojo"
>     EXPRESSION ([pixel] < 0.3)
>     STYLE
>         COLOR 255 0 0
>     END
> END
>
> CLASS
>    NAME "azul"
>    EXPRESSION ([pixel] >= 0.3)
>    STYLE
>        COLOR 0 0 255
>    END
> END
>
> La petición GetLegendGraphic me devuelve esto, lógicamente
> http://dl.dropbox.com/u/6599273/leyenda.png
>
> Y mi imagen se ve en azul y rojo, claro:
> http://dl.dropbox.com/u/6599273/capturas/ndvi_en_gvsig.png
>
> Pero si cambio mi mapfile, quito las dos clases esas y le meto la
> directiva PROCESSING "SCALE=1.0, -1.0", la imagen me sale en escala de
> grises, como a mí me gusta (entiendo que esa directiva me
> pre-clasifica todos los valores en ese rango, y les asigna un valor de
> escala de grises automáticamente). Entonces, se ve así
>
> http://dl.dropbox.com/u/6599273/capturas/ndvi_gris_en_gvsig.png
>
> Pero claro, ahora la leyenda me sale en blanco. No hay clases definidas.
>
> Lo que quiero es poder sacar mi imagen en escala de grises, como en el
> segundo enlace, y que además la leyenda me de todos los posibles
> valores de la escala. Pero claro, no quiero crearme una clase por cada
> posible valor de la escala de grises. ¿Hay alguna manera de hacer
> esto?
>
>
>>>
>>> Pero lo que me gustaría es sacar en OpenLayers una leyenda, ofreciendo
>>> una interpretación para cada uno de esos colores que aparecen (tanto
>>> si son los colores por defecto como si son los que yo me quiera
>>> definir). He estado mirando el tema de templates, y HTML legend, pero
>>> creo que me estoy yendo por las ramas. ¿Voy bien encaminado?, ¿algún
>>> ejemplo que pueda ver?
>>>
>>> Muchas gracias por adelantado, y un saludo,
>>>
>>
>> diría que lo suyo es meter clases con su etiqueta y luego mapserver te
>> contestará a una petición getLegendGraphic con una bonita leyenda (que
>> puedes configurar).
>>
>> Luego esa petición la puedes poner en tu visor en algún sitio que
>> proceda (por ejemplo debajo del nodo de la capa si estás usando un árbol
>> de GeoExt).
>>
>
> Ya, lo que pasa es lo que explico arriba. Que no quiero tener que
> crearme una clase por cada nivel de gris.
>


Pues he encontrado la manera de generar la leyenda con GRASS, mediante
r.colors, para establecer como "grey" el color de la banda y d.legend,
para generar la leyenda. Lo que no he llegado todavía a hacer es
automatizar el proceso entero. Vamos, que sé entrar en GRASS y generar
la leyenda, pero no sé si sabría escribir un script de Python que la
generara sola (por lo que pone en la doc de GRASS, d.legend te saca la
leyenda por la salida gráfica activa:
http://grass.osgeo.org/gdp/html_grass64/d.legend.html)

En resumen, que:

- Mapserver me genera leyendas basándose en los objetos CLASS de un
mapfile (o en la ruta al html que le especifique en LEGEND, supongo)
- GRASS me las genera basándose en los ficheros raster en si, que es
lo que me interesa...

Cuantas piezas hay que juntar...

-- 
Jorge Arévalo
Internet & Mobility Division, DEIMOS
jorge.arevalo at deimos-space.com
http://es.linkedin.com/in/jorgearevalo80
http://mobility.grupodeimos.com/
http://gis4free.wordpress.com
http://geohash.org/ezjqgrgzz0g


More information about the Spanish mailing list