jueves, 20 de diciembre de 2007

PHP-Mapscript de Mapserver. Parte 2: Volviendo dinámico el MapFile (Continuación)

Creative Commons License

Esta obra está bajo una licencia de Creative Commons.

© 2007 Jaime M. Tan Nozawa. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra, o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

1  <?php
2
// Obtenemos las capas
3
4
$jCapas=$jMap->getAllLayerNames();
5
$layersOn = array();
6 foreach (
$jCapas as $idx => $layer) {
7
8
$capaObj=$jMap->getLayerByName($layer);
9
10 if (
$capaObj->status==MS_ON) {
11 echo
"** CAPA :{$capaObj->name} **<ul>";
12
13 for(
$i=0;$capaObj->getClass($i);$i++){
14
$Class = $capaObj->getClass($i);
15 echo
"<li>CLASS:
16 <ul>
17 <li>NOMBRE CLASS: {$Class->name}</li>
18 <li>EXPRESION: {$Class->getExpression()}</li>
19 <li>COLOR: {$Class->getStyle(0)->color->red} {$Class->getStyle(0)->color->green} {$Class->getStyle(0)->color->blue}</li>
20 </ul></li>
21 "
;
22
23 }
24
25 echo
"</ul>";
26 }
27
28 }
29
?>

Explicación ...

a) $jCapas=$jMap->getAllLayerNames();

Con el método (clase MapObj) getAllLayerNames obtenemos un array ($jCapas) en el cual dispondremos los nombres de cada capa (Layers) de nuestro MapFile. Por tanto haciendo un foreach haríamos un recorrido del array:

foreach ($jCapas as $idx => $layer)

b) Objeto LayerObj

$capaObj=$jMap->getLayerByName($layer);

Con el método (clase MapObj) getLayerByName obtenemos un objeto LayerObj($capaObj) a partir de su parámetro donde ingresas el nombre de la capa. Como ya hemos conseguido los nombres de cada capa a través del método anterior entonces no tenemos problemas. En otras palabras, el foreach anterior recorre capa a capa, y este método obtiene el objeto LayerObj (Ver Cuadro del tutorial parte 1).

La propiedad

$capaObj->status

obtiene en sí el estado de la capa , ON/OFF/DEFAULT. Los valores en el mapscript son contantes de entorno de la API. En este caso puede obtener los valores: MS_ON, MS_OFF, MS_DEFAULT.

Existen otras contantes booleanas que se usan en otras situaciones: MS_TRUE, MS_FALSE, MS_YES, MS_NO

Más Propiedades:

$capaObj->name : El nombre de la capa (String)
$capaObj->transparency : Transparencia de la capa (Int)
$capaObj->maxscale : Escala máxima de visualización (double)
$capaObj->minscale : Escala mínima de visualización (double)
$capaObj->classitem : Cadena classitem que se explicó al inicio(string)

Y así todas las propiedades que puedes agregar en el MapFile


c) Objeto ClassObj

Cada Objeto LayerObj puede tener muchos Objetos ClassObj dentro,pero siempre al menos uno. El ClassObj sirve para categorizar nuestra capa por filtros según el campo del CLASSITEM y filtrado con el EXPRESSION. Si se omite el EXPRESSION significa que solo había un único ClassObj.

$Class = $capaObj->getClass($i)

En nuestra caso estoy usando el método getClass (de la clase ObjLayer) que te retorna una objeto ClassObj que se almacena en la variable $Class. El $i es un número entero que debe representar que CLASS nos referimos. Cero (0) sería el primer class y obligatorio pues todo Layer debe tener siempre un Class.
Para variar ahora no usé foreach sino un for para hacer el recorrido.

Más propiedades del objeto ClassObj:

$Class->name : Nombre de la clase

Más métodos del objeto ClassObj:

$Class->getExpression() : Retorna un String que obtiene el FILTRO a usar


d) styleObj

Este objeto puedes definir el color de background; grosor y color lineas;tamaño de fuente; etc...

Yo estoy en este caso usando

$Class->getStyle(0)

Método de la clase ClassObj que obtiene un objeto styleObj. Debido a que siempre he usado
un solo Style por Layer pongo el número 0 , pero si hubiera más habrían números correlativos

Propiedades:

$Class->getStyle(0)->color : Propiedad que contine el Objeto colorObj.
Este objeto color tiene propiedades RGB (red,green,blue)

$Class->getStyle(0)->backgroundcolor : Color del fondo (colorObj)
$Class->getStyle(0)->outlinecolor : color del borde del CLASS (colorObj)
$Class->getStyle(0)->size : Tamaño de la fuente (int)

Es todo para ese código anterior, ¿fácil?

4. Modificando las propiedades

Comencemos con algo simple, modifiquemos el extent del mapa
(hacemos un aparente zoom) y el color de un Class de un layer:

1  <?php
2
// ejemplo02.php
3 // Jaime M. Tan Nozawa
4
5 //Cargo la extensión MapScript . Verificamos si la extensión ya está cargada por defecto.
6
if (!extension_loaded("MapScript")) dl('php_mapscript.'.PHP_SHLIB_SUFFIX);
7
8
// instanciamos un nuevo objeto: map object. El constructor debe recibir al menos el parámetro de la ubicación del archivo .map
9
$jMap = ms_newMapObj("ejemplo01.map");
10
11 $jMap->setExtent(-80.17494,-14.0216,-72.93546,-9.19528);
12
13
$jColor = $jMap->getLayerByName('Departamentos')
->getClass(0)->getStyle(0)->color;
14
15 $jColor->setRGB(100,150,120);
16
17
$jImagen = $jMap->draw();
18 // Creamos y capturamos la ruta de imagen renderizada.
19
$url_imagen = $jImagen->saveWebImage();
20
?>

$jMap->setExtent(-80.17494,-14.0216,-72.93546,-9.19528) ;

En este caso estamos usando el método setExtent para MODIFICAR
el extent del mapa y por tanto hacemos un zoom hacia una región
obteniendo las coordenadas de los puntos extremos.

setExtent(double minx, double miny, double maxx, double maxy)

Con las sieguiente línea:
$jColor =$jMap->getLayerByName('Departamentos')->getClass(0)->getStyle(0)->color;

Como se explicó antes he obtenido la propiedad colorObj
del estilo 0, de la clase 0, de la capa llamada 'Departamentos' de objeto Map.

Una vez hecho esto MODIFICARE el color de ese STYLE:

$jColor->setRGB(100,150,120 );

Más adelante estaré trabajando en un tutorial más interesante,
que lo llamaré: Mapserver sin MapFile (.map).

@__ @

Resultado:

2 comentarios:

Unknown dijo...

ESTOY TRATANDO DE HACER EL EQUIVALENTE DEL MAPFILE DE EN PHP DEL EJEMPLO DOS:
CUAL ES EL EQUIVALENTE:
CLASS
NAME "LIMA"
EXPRESSION /LIMA/

EN PHP

Jtux dijo...

En este tutorial:
http://phpexperto.blogspot.com/2007/12/php-mapscript-parte-3-trabajando-con.html

Puedes ver que exite las clases: ms_newClassObj y ms_newStyleObj

Para realizar la tarea..
otro detalle solo son lo setter para cada atributo