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.

13 comentarios:

Marcello Benigno dijo...

Congratulations! very good blog, let's continue teaching phpmapscript!!!

krakc redfield dijo...

Hola amigo, esta muy bueno tu blog y los temas interesantes, pero tengo una pregunta que hacerte.
estoy creando una web en php y tengo varias secciones, mi forma de pasar de seccion en seccion es por medio de FORMs con metodo POST pero he visto webs donde la barra de direcciones se ve algo asi index.php?op=seccion1 y me gustaria que la mia se viera de la misma forma pero no se como hacerlo, yo uso tres archivos, uno de configuracion, un index y uno de funciones donde guardo todas las funciones.

agradezco tu ayuda.

Jtux dijo...

Eso es un Front Controller, revisa como hacerlo es simple.

Revisa en este link justo en el foro de PHP peru sobre capas
http://php.org.pe/index.php?topic=785.msg1749#msg1749

Salu2

krakc redfield dijo...

gracias amigo me ha servido de mucho, no sabia que existia eso de capas, ahora si falta leer (como siempre hago) para aprender ha usar las capas.
suerte con tu blog.

Unknown dijo...

hola como puedo acceder a mis comentarios preguntas que publique el año pasado, en estos dias estoy de vaca hasta el 5 de Enero y le voy a dar duro al php_Mapscript ganas no me faltan ni comocimientos sobre sig. Lo que me falta es saber programar ya que mi perfil profesional es la Ing agricola.
Me he propuesto en este año 2009 hacer algo importante en este tema en mi centro de labores todo en plataforma libre y en LINUX ya tengo instalado mi postgres/postgis, el mapserver, como herramienta de escritorio usare Grass, QGIS, GVSIG y para metadatos geonetwork.
ya tengo algo (muy elemental) con mapfiles.

feliz año

Jtux dijo...

Tus comentarios estan en el post anterior de la primera parte del tutorial. Este es el tutorial parte 3... Navega meses atrás en el menú o sino ve al final del blog y alli aparecen para ver post antiguos.
Tambien puedes hacer q todos estos comentarios lleguen de frente a tu correo suscribiendote cuando publicas un comentario

Unknown dijo...

hola ya termine los dos primeras partes sin problema cuando estoy haciendo la tercera parte y convierto el mapfile a php y ejecuto el php no me manda ningún error genera la imagen... peroooo..no me publica el mapa al parecer el codigo esta bien pero por que no me publica...
gracias por la ayuda

Unknown dijo...
Este comentario ha sido eliminado por el autor.
Unknown dijo...

quisiera hacerte una pregunta sobre mapscript
ya demostraste como crear el mapObj sin usar mapfile
yo necesito poder generar el reference map sin tener la imagen por adelantado
eso se puede hacer???
saludos

Unknown dijo...

quisiera hacerte una pregunta sobre mapscript
ya demostraste como crear el mapObj sin usar mapfile
yo necesito poder generar el reference map sin tener la imagen por adelantado
eso se puede hacer???
saludos

Unknown dijo...

hola, muy bueno y didacticoel post, te hago una consulta, estoy tratando de entregarle con php al .map la ruta de los archivos temporales pero no me resulta, yo ocupo un .map y en php ingreso lo sgte:
$dirpath = "C:/MFD_/tmp/usu/";
$dirurl = "tmp/usu/";
$mapObject->web->set("IMAGEPATH",$dirpath);
$mapObject->web->set("IMAGEURL",$dirurl);
he probado comentamdo la etiqueta web y descomentandola en el .map pero me arroja lo sgte:
Fatal error: Property 'IMAGEPATH' does not exist in this object. in C:\MFD_\archivo.php on line 100.
yo trabajo con un .map y logro cambiar el width y el height pero la ath de los temporales no puedo.
Otra cosa es si sabes como pasarle valores a las variables del .map con php, por ejem: IMAGEPATH '%myvar%'".
cualquier ayuda me sirve, gracias.

Unknown dijo...

hola necesito un poco de ayuda se lo agradesco de antemano... este es mi codigo en el cual estoy cargando una capa.. desde la base de dato la tabla PREDIO.. pero al tratar llamarla desde mapscript no la reconoce, trate cambiando con las comillas pero no encuentro la solucion...

Nota: la tabla predio la cree desde gvsig, y se creo con el nombre en mayusculas....
mi correo es: gfflores11@gmail.com



$oLayer = ms_newlayerobj($map);
$oLayer->set("name","Barrio");
$oLayer->set("type",MS_LAYER_POLYGON);
$oLayer->set("status",MS_ON);
$oLayer->setConnectiontype(MS_POSTGIS);
$oLayer->set("connection","user=postgres password=celeron dbname=prueba3 host=192.168.5.2 port=5432");
$oLayer->set("data",'the_geom from "PREDIO" ');
$oClase = ms_newClassObj($oLayer);
$oEstilo = ms_newStyleObj($oClase);
$oEstilo->outlinecolor->setRGB(24,129,18);
$oEstilo->color->setRGB(255,255,255);




PD: "me gustaria si como puedo ponerle un filtro a esta misma capas gracias...."

Juan Carlos Munoz dijo...

Auxilio como asigno con mapscript sin archivo map, los elementos scalebar y legend, ayuda porfa