lunes, 24 de diciembre de 2007

PHP Mapscript Parte 3: Trabajando con Mapserver sin MapFile (.map)

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.

En esta parte 3 del tutorial haremos algo interesante, trabajaremos SIN usar un Mapfile (.map). Como ya se habrán dado cuenta los datos se cargan según la configuración del .map que hemos estado trabajando últimamente, pero he visto que preguntan siempre en los foros que siempre les parece algo rígido, tener que estar entrando a un archivo de texto para estar agregando capas o cambiándole el color. Con esta parte 3 de este tutorial, se te abrirán nuevas puertas y el horizonte como programador Web SIG, te darás cuenta que podemos, sin problemas pero con algo de tiempo, crear nuestra propia interfaz Web de administración del Mapserver (aunque ya existen proyectos de este tipo pero aún en desarrollo).

Yo diría que el .map o Mapfile es como un "punto ini" (.ini). Ese significa que lo usamos para optimizar la velocidad del mapserver para poder cargar las capas por defecto la primera vez que entran a nuestra aplicación, y una vez hecho ésto, los vamos modificando según nos convenga.

Esta vez haremos algo simple, trataremos de hacer el tutorial #1 pero sin usar MapFile...

Eso significa que intentaremos crear un mapa como SI EXISTIERA el siguiente MapFile:

LAYER
NAME "Departamentos"
STATUS ON
DATA "Lim_dep.shp"
TYPE POLYGON
          CLASS
STYLE
COLOR 200 150 2
OUTLINECOLOR 0 0 0
END
END
END


Este Mapfile que he puesto ES SOLO DE REFERENCIA y NO VA A SER UTILIZADO.

Aquí les pongo mi CÓDIGO EQUIVALENTE A LO ANTERIOR:

1 <?php
2 // ejemplo01.php trabajando sin mapfile
3 // Jaime M. Tan Nozawa 2007 Creative Co
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.
9
$jMap = ms_newMapObj("");
10
11
$jMap->set("name","Pruebas");
12
$jMap->set("shapepath","C:/ms4w-php5/
carpetaDondeestantusShapes/");
13
14
$jMap->setSize(600,400);
15
$jMap->setExtent(-87.9964,-19.0216,-63.114,1.19528);
16
17
18
$jMap->web->set( "imagepath" , "C:/ms4w-php5/tmp/ms_tmp/" );
19
$jMap->web->set( "imageurl", "/ms_tmp/" );
20
21
// Creamos un Layer dentro de nuestro MapObj y seteamos sus propiedades
22
$jLayer = ms_newLayerObj($jMap);
23
$jLayer->set( "name", "Departamentos");
24
$jLayer->set( "type", MS_LAYER_POLYGON);
25
$jLayer->set( "status", MS_ON);
26
$jLayer->set( "data", "Lim_dep.shp");
27
28
//Creamos un classObj dentro del LayerObj
29
$jClass = ms_newClassObj($jLayer);
30
31
//Creamos un styleObj dentro del classObj
32
$jStyle = ms_newStyleObj($jClass);
33
34
$jStyle->color->setRGB(200, 150, 2);
35
$jStyle->outlinecolor->setRGB(0, 0, 0);
36
37
$jImagen = $jMap->draw();
38
39
// Creamos y capturamos la ruta de imagen renderizada.
40
$url_imagen = $jImagen->saveWebImage();
41
?>


1) MapObj
En este caso, la creación del MapObj se realiza sin pasarle un parámetro, de esta forma no cargamos ningún .map:

$jMap
= ms_newMapObj("");


Además hay un objeto que ahora lo configuro "al vuelo" es el objeto Web. Este objeto Web no tienes que instanciarlo, ya está creado automáticamente al crear un MapObj por eso ingreso las propiedades de frente:

18 $jMap->web->set( "imagepath" , "C:/ms4w-php5/tmp/ms_tmp/" );
19
$jMap->web->set( "imageurl", "/ms_tmp/" );


Otra propiedad NUEVA es SHAPEPATH. Esta propiedad es necesaria para poder hacer más fácil las cosas y no estar poniéndole toda la ruta cada vez que agregamos un layer y hacemos referencia a la ubicación del shapefiel. (fíjate en la propiedad DATA del Layer, ya no pongo rutas largas)

12 $jMap->set("shapepath","C:/ms4w-php5/carpetaDondeestantusShapes/");

Fíjate claramente como voy ingresando las propiedades, siempre con el método "set" para cualquier objeto dentro del Map:
int set(string propertiedad, valor)
con el set podemos modificar casi todas las propiedades de los objetos (a menos que tenga una especializada para una propiedad específica) . Si retorna un valor -1, significa error.

2) Objetos dentro del MAP
Cuando creo un layer dentro del MapObj necesariamente, al instanciarlo, tengo que pasarle el objeto al cual va a ser parte. En este caso creo una capa LayerObj que se encontrará dentro de un MapObj:

ms_newLayerObj($jMap);

Igual para el class o para el style .. que están contenidos siempre dentro de un objeto mayor

29 $jClass = ms_newClassObj($jLayer);

32
$jStyle = ms_newStyleObj($jClass);

3) Contantes:
Además de todo lo anterior, se han usado unas nuevas contantes. Para nuestro caso la constante de tipos de Layers. En nuestro ejemplo el tipo polígono.
Otros posibles valores son:
MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_POLYGON, MS_LAYER_RASTER, MS_LAYER_ANNOTATION

El último tipo, hace referencia a una capa de anotaciones.
Algunas veces deseamos etiquetar solamente o sino poner
íconos , logos para adornar o facilitar la comprensión, ETC.

----
Bueno eso es todo, no pongo resultados porque sería el mismo que el de la parte 1. Pueden ustedes probar cambiar cualquiera de las propiedades pasándole parámetros GET o usando SESIONES. O mejor aún, hacemos una interfaz simple para configurar las propiedades. Bueno ya todo está en tu imaginación.
Para acabar siempre con una imagen , aquí les dejo un gráfico explicativo del .map (extraído del Libro WebMapping) que lo encontré navegando dentro del preview del libro.


disfrútenlo... y no olviden escribir y postear sus comentarios.

--NOTA de ACTUALIZACIÓN--
RETO DEL TUTORIAL: Recrear el mapa del tutorial parte 2 pero sin usar un MapFile.

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:

jueves, 15 de noviembre de 2007

PHP-Mapscript de Mapserver. Parte 2: Volviendo dinámico el MapFile

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.



En esta segunda parte del tutorial intentaremos hacer más dinámico nuestro MapFile (.map). Como vimos en la parte 1, pudimos crear un archivo de configuración inicial y cargar los datos que se mencionan en el contenido del archivo. Ahora queremos capturar los datos(propiedades) y modificar los datos que se encuentran dentro del archivo; claro, sin tener que entrar al .map para realizar un cambio, sino sólo realizándolo por código.

1. Primero el .map quedará como el siguiente para hacerlo más interesante:

#Inicio mapfile
MAP
NAME Pruebas
SIZE 600 400
EXTENT -87.9964 -19.0216 -63.114 1.19528

WEB
IMAGEPATH "C:/ms4w-php5/tmp/ms_tmp/" #Esto puede variar segun tu configuracion
IMAGEURL "/ms_tmp/"
END


LAYER
NAME "Departamentos"
STATUS ON
DATA "Lim_dep.shp"
TYPE POLYGON
CLASSITEM Nom_Dep

CLASS
NAME "LIMA"
EXPRESSION /LIMA/
STYLE
COLOR 200 150 2
OUTLINECOLOR 200 200 200
END
END

CLASS
NAME "OTROS"
EXPRESSION /.*/
STYLE
COLOR 100 28 55
OUTLINECOLOR 0 0 0
END
END
END

END
#Fin mapfile
Como nos percatamos ahora he agregado nuevas opciones (en negrita) de nuestro mapfile inicial.

Nuetra objeto layer ahora dispone de una propiedad más:
CLASSITEM Nom_Dep   
con él podemos escoger un campo dentro de la tabla, en este caso Nom_dep, para poder hacer algunas búsqueda y filtrar o segmentar según diferentes criterios.

En nuestro objeto CLASS que se encuentra dentro de LAYER ahora dispone de más propiedades:
 CLASS
NAME "LIMA"
EXPRESSION /LIMA/
STYLE
COLOR 200 150 2
OUTLINECOLOR 200 200 200
END
END

En este caso estoy poniéndole un nombre a ese CLASS : LIMA , y el filtro se hace según una expresión regular
en este caso /LIMA/ osea busca dentro de la columna Nom_dep todas los registros que contienen la palabra" LIMA".

En el otro STYLE denominado OTROS , la expresión regular
/.*/ significa uno o más caracteres. En otras palabras todas los restantes. y fíjense que cada CLASS se colorea con colores diferentes tanto sus bordes como el contenido.

2. Ahora procederemos a agregar más lineas en nuestro Ejemplo01.php y lo renombraremos a

ejemplo02.php

 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
// Renderización
12
$jImagen = $jMap->draw();
13
14
// Creamos y capturamos la ruta de imagen renderizada.
15
$url_imagen = $jImagen->saveWebImage();
16
?>
17
<HTML>
18 <HEAD>
19 <TITLE>Ejemplo 1</TITLE>
20 </HEAD>
21 <BODY>
22 <IMG SRC=<?php echo $url_imagen; ?> >
23 <br>
24 <?php
25
// Obtenemos Propiedades del MapaObj llamado jMap
26
echo "Nombre mapa: {$jMap->name}<br>";
27 echo
"Extent mapa: {$jMap->extent->minx} // {$jMap->extent->miny} // {$jMap->extent->maxx} // {$jMap->extent->maxy} <br>";
28 echo
"Tama&ntilde;o imagen: {$jImagen->width} {$jImagen->height}<br>";
29 echo
"Escala: 1/{$jMap->scale}<br><br>";
30
// echo ms_GetVersion()
31 ?>
32
</BODY>
33 </HTML>


Vemos claramente como podemos acceder a las propiedades del MapObj: $jMap

$jMap->name : propiedad nombre del object MapObject
$jImagen->width : ancho de la imagen en pixels
$jMap->extent->miny (minx) (maxx) (maxy) para capturar extent del mapa
La escala no está es muy buena proporción por que se esta usando coordenadas geodésicas (no obtiene áreas)
en próximos tutoriales veremos como corregir esta opción.

3. Ahora que ya mas o menos conocen los objetos y las propiedades , les dejo algo de código interesante para que lo analicen:

 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
?>


Resultado:


continuará...

lunes, 5 de noviembre de 2007

PHP-Mapscript de Mapserver. Parte 1: Conceptos

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.


¿Qué es MapServer?
MapServer es un entorno de desarrollo en código abierto (Open Source Initiative) para la creación de aplicaciones SIG en Internet/Intranet con el fin de visualizar, consultar y analizar información geográfica a través de la red mediante la tecnología Internet Map Server (IMS).

Sus características principales son:

Fuente: wikipedia

¿Qué es PHP/Mapscript?
PHP/Mapscript es un módulo para PHP que permite acceder a la API de MapServer. Éstas funciones y clases estarían disponible dentro de nuestro entorno de desarrollo. El módulo fue desarrollado y es actualmente mantenida por la empresa
DM Solutions Group.

La Familia mapscript está refresentada como el siguiente árbol (fuente de dato aquí):
          
  MapServer
/\
/ \
/ \
PHPMapScript \ SWIGMapScript
PHP4 +----+-----+----+----+----+
| | | | | |
Perl Python Ruby Java Tcl ...

Perl Python Ruby Java Tcl ...Y como se ve claramente el PHP es un Mapscript que es más cercano al MapServer y por ende más nativo en la ejecución de nuestras aplicaciones.

El MapFile
El MapServer se caracteriza por tener un archivo de configuración denominado mapfile que tiene como extensión punto map (.map). Aquí se definen los datos a ser usados por nuestra aplicación como los siguientes mencionados: las capas, sus tipos y su configuración; fuente de datos de origen y forma de servir los datos; leyenda y proyecciones ; y muchos otras configuraciones que se desea que se cargen al inicio.

Por tal motivo, podríamos decir que el corazón del Mapserver se configura a través de un archivo de texto que es usado en tiempo de ejecución. Bajo la perspectiva del programador se puede presentar como una jerarquía de objetos con un padre principal y muchos objetos hijos que derivan de él.

Notas sobre MapServer CGI : Aunque este no es el objetivo de nuestro artículo, la forma de utilización como CGI de mapserver es la más tradicional y la usada usualmente en los tutoriales que encontramos en Internet. MapServer CGI trabaja a través de plantillas HTML (templates) y bajo estructuras rígidas de consulta básica. Ahí el archivo .map es de vital importancia para la inicialización de las capas.

El PHP Mapscript rompe ésta rigidez del .map (pues carga las capas configuradas en él al inicializar) y podemos modificar, cambiar e incluso agregar más capas según queramos. Ésto significa que si tenemos una capa de color verde inactiva, podemos modificarla a rojo y activa. Hacer acercamiento o consultar data relevante.


Requerimientos para desarrollar
  1. Servidor Web: Apache o IIS con el módulo de PHP y PHP-mapscript de Mapserver
  2. Librerías : PROJ4, OGR, GDAL y utilitarios que iremos requiriendo
  3. Fuente de Datos: shape files, PostGIS u otra fuente OGR
  4. Un archivo Mapfile (.map)
  5. Un editor de texto o ID preferido para PHP.
  6. Conocimiento básicos de Geodesia y SIG y lo más importante: Muchas ganas de aprender
Estamos con suerte porque los requerimientos 1,2,3 ya vienen incluidos para Windows en un paquete llamado MS4W y lo pueden conseguir aquí.
Para los que están metidos en Linux, verán que encontrarán infinidad de paquetes ya compilador tanto para Ubuntu, Debian o Fedora. Solo se intalarían los debs o rpms correspondientes.
Por otro lado, también en Linux podrían usar un paquete denominado FGS y se encuentra aquí.

Si la instalación en Linux se torna algo dificultosa, pueden solicitar con comentario para crear un artículo dedicado sólo a la instalación del mismo.

Un ejemplo básico:

ejemplo01.php

1
<?php
2
// ejemplo01.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
// Renderización
12
$jImagen = $jMap->draw();
13
14
// Creamos y capturamos la ruta de imagen renderizada.
15
$url_imagen = $jImagen->saveWebImage();
16
?>
17
<HTML>
18 <HEAD>
19 <TITLE>Ejemplo 1</TITLE>
20 </HEAD>
21 <BODY>
22 <IMG SRC=<?php echo $url_imagen; ?> >
23 </BODY>
24 </HTML>


ejemplo01.map

MAP
NAME Pruebas
SIZE 600 400
EXTENT -87.9964 -19.0216 -63.114 1.19528

WEB
IMAGEPATH "C:/ms4w-php5/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
END

LAYER
NAME "Departamentos"
STATUS ON
DATA "Lim_dep.shp"
TYPE POLYGON
CLASS
STYLE
COLOR 200 150 2
OUTLINECOLOR 0 0 0
END
END
END
END


En el archivo .map toda entrada es similar a etiquetas HTML porque tienen un inicio y un fin. El Mapfiles estonces está compuesto por objetos y otros que lo contiene.


La estructura de objetos del mapfile sería la siguiente (Fuente: Tutorial MapServer 4.X):


MAP
               |
+----+-----+----+----+----+
| |
WEB LAYER
                          |
        +----+-----+----+----+----+
| |
CLASS ...



Explicando el .map

Una sección relevante del .map es el objeto Web:
WEB
IMAGEPATH "C:/ms4w-php5/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
END

Aquí se especifica las rutas donde se van a crear las imágenes renderizadas. Aquí le configuramos que se guarden en:
C:/ms4w-php5/tmp/ms_tmp/ (Cámbialo por uno de tu conviencia). Recuerda que esta carpeta debe de poder ser accedido públicamente a través de /ms_tmp/ . (El ms4w ya la configura automáticamente con un Alias en el Apache -- httpd.conf : Alias /ms_tmp/ /ms4w-php5/tmp/ms_tmp/ --)

Eso significa que si creamos una archivo :
C:/ms4w-php5/tmp/ms_tmp/prueba.gif
Se accede de la forma : http://localhost/
ms_tmp/prueba.gif

IMPORTANTE: Cada vez que accedemos a nuestro script PHP : Ejemplo01.php , se percatarán que se crea automáticamente una imagen GIF o JPG con un nombre aleatorio. Esa es la imagen que se muestra hacia el navegante y es capturada en la variable $url_imagen.

El MAP tiene los siguientes atributos
SIZE 600 400
EXTENT -87.9964 -19.0216 -63.114 1.19528

Especifica el tamaño de la imagen (el gif o jpg autogenerado ) y su extent.
El Extent especifica el límite de coordenadas en el cual se mostrará el mapa. En el Caso del Perú, como estamos en el OESTE - SUR ... corresponde los puntos: inferior-izquierdo (
-87.9964 -19.0216) y superior-derecho (-63.114 1.19528). Mi analogía con trigonometría de matemáticas , es como si estuvieramos en el tercer cuadrante.


El objeto Layer se encuentra contenido dentro del objeto MAP. Y el CLASS dentro del Layer

LAYER
NAME "Departamentos"
STATUS ON
DATA "Lim_dep.shp"
TYPE POLYGON
          CLASS   
STYLE
COLOR 200 150 2
OUTLINECOLOR 0 0 0
END
END
END

Vemos que nuestra capa llamada "Departamentos" carga un shape file de tipo polígono ... y lo coloremos con colores RGB (200 150 2) a través del objeto STYLE que se encuentra dentro del OBJETO CLASS.
STATUS ON: dice que la capa esté activa y se muestre por defecto.


El Resultado:


link anexo

Shape File : Lim_dep.shp

miércoles, 31 de octubre de 2007

Web GoPHP5, Dejando a PHP4 sin soporte para el 2008

PHP4 ya tiene siete años de haber se liberado, y PHP5 ya casi llega a los 3 años de estar en el aire; pero a pesar de ello muchos hostings aun no han agregado soporte para php5 por temor a que las aplicaciones de sus clientes no funcionen, o al menos no lo activan por defecto. De acuerdo con Nexen.net el 80% de los hostings aún continuan usando php4 en sus servidores.

Es por ello que nace GoPHP5.org, como una iniciativa para que los proyectos basados en php abandonen el soporte a PHP4 y se pasen a PHP5, aprovechando sus ventajas; así como comprometer a los hostings para que ellos también eliminen php4 de sus servidores.

La meta es llegar 5 de Febrero de 2008 con el mínimo soporte para php4. Proyectos como Drupal 7 y phpMyAdmin ya se han comprometido a esta iniciativa, y otros como MediaWiki desde ya solo corren en php5. En la lista de correo wp-hackers ya han discutido el cambio hacia php5 varias veces ya. La respuesta siempre ha sido: cuando exista mayor soporte de php5.


http://www.gophp5.org/

lunes, 29 de octubre de 2007

Propuesta de creación framework PHP peruano

Hace poco me dieron la propuesta para desarrollar un framework propio peruano para PHP 5 con MVC y usando patrones de diseño. Bueno, ya se comenzó el desarrollo aún con muchos problemas de ausencia de servidor y manos para el apoyo. Pero ahí se avanza.
Estaré informando de las noticias y los avances. A ver si alguien quiere apoyar..!! En lo que sea : con un servidor SVN: manos pa programar y controlar versiones; o simplemente pidiendo que le gustaría que tenga... JA!

sábado, 27 de octubre de 2007

Wiki de UML con PHP

He abierto este wiki de UML con PHP que habla sobre el tema
http://es.wikipedia.org/wiki/UMLPHP

Espero puedan colaborar y aportar. aun esta en construcción para ser mejorado.

Por cierto, estaré haciendo más articulos sobre este tema que será de interés para muchos, que es trabajar con objetos y PHP 5.

Bienvenido al blog PHP experto

Bienvenido al Blog de PHP experto, espero sea de tu agrado las experiencias y todas los artículos interesantes que se publiquen sobre PHP orientación a objetos y detalles interesantes.

Saludos

YO... JTN