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

19 comentarios:

JACE17 dijo...

aja.. ta chevere esta primera parte hee,..

oe chino pon la segunta partex pex....

Jtux dijo...

Ya listo... segunda levantada

Unknown dijo...

Bueno al fin puedo hacer mi pregunta:
Estoy siguiendo la parte uno del curso de php_MAPSCRIPT.
lo primero que hice es hacer mi mapfile todo sale bien cuando lo publico con el cgi mapserv se publica sin ningun problema.
Cuando le agrego el código PHP y lo llamo http://...../**.php
no me manda ningun error pero tampoco me presenta la imagen del mapa.
otro detalle en el directorio de temporales tampoco se genera ninguna imagen.
que puede pasar.
gracias

Unknown dijo...

xxxxxxxxxxxxx
codigo .map
MAP
NAME Pruebas
SIZE 600 400
EXTENT -81.328393 -18.351232 -68.653396 -0.038607
#SHAPEPATH "/home/postgres/vectores"
WEB
IMAGEPATH "/usr/local/apache2/htdocs/tmp/"
IMAGEURL "/tmp/"
END
LAYER
NAME Peru_dep
DATA "/home/postgres/vectores/departamentos.shp"
STATUS OFF
TYPE POLYGON

CLASS
STYLE
COLOR 200 150 2
OUTLINECOLOR 0 0 0
END
END
END
END

Jtux dijo...

Yo digo que tu problema es que no tienes instalado el modulo mapscript en tu servidor Linux...
Haz un phpinfo y mira si tienes cargado el módulo... todo parece estar bien

Unknown dijo...

podrias crear una entada para la instalacion demapserver y todo lo requerido sobre ubuntu. Llevo arto tiempo conla intalacion y aun tengo dudas, instale el paquete de mapserver 5 en ubuntu, pero no puedo acceder alos mapas, por un problema en cgi, tambien tengo un probelma con los conceptos, pero te agradeceria que publicaras algoacercade la instalacion de mapserver sobre ubuntu.

de antemano muchas gracias
claudio Altamirano O.
Estudiante Ing. Informatica
UCtemuco
Chile

Unknown dijo...

holas ya me salio la leccion uno esro solo cambiar el status pasarlo a on.
sigo a delante con la leccion 2

Oscar dijo...

El enlace al fichero Lim_dep.shp no está disponible. Por favor, podrías decirme desde dónde puedo bajarlo.

Gracias, Oscar.

Jtux dijo...

Bueno si, el problema radica en que geocities esta con el limite del ancho de banda de lo que le doy... voy a ver, si lo pongo en algun otro sitio como rapidshare o gigasize

Unknown dijo...

Voy a intentarlo, porque llevo ya algunos meses peleandome con esto en mac os y ahora lo estoy intentando en Ubunto, espero contar con su apoyo, porque de esto depende que me titule de la uni.

Saludos

Stalin Barcelonista de Corazón dijo...

Saludos...

Estoy tratando de instalar mapserver con soporte para PHPMapscript y a la hora de cargar la extension php_mapscript.so me sale este error:

Fatal error: Call to undefined function dl() in /usr/local/apache2/htdocs/index1.php on line 4

Podría indicarme a que se debe este error???

Gracias

Adrian Rivera dijo...

Ya tengo todo instalado y realice todos los pasos que dice el tutorial, al correr el ejemplo me sale lo siguiente

Warning: [MapServer Error]:
msSHPOpenFile(): (/var/www/ensayos/mapas/./Lim_dep.shp) in /var/www/ensayos/mapas/index.php on line 5

Warning: [MapServer Error]: msDrawMap(): Failed to draw layer named 'Departamentos'. in /var/www/ensayos/mapas/index.php on line 5

Lo más curioso es que si quito del archivo .map STATUS ON genera una imagen pero en blanco.

De ante mano muchas gracias por su ayuda

Unknown dijo...

hola he estado visitando varios blogs en la red y este se me hace de los mas completos, agradezco deantemano su atencion y les expongo mi problema.

tengo muchas dudas sobremapserver lo he estado aprendiendo poco a poco pero hay cosas que no me salen y que no entiendo aun cuando tengo las mejores intenciones, ojala puedan ayudarme.

una de las dudas que mas me preocupan es la siguiente:

aparentemente tengo todo instalado correctamente y si me muestra la imagen del .map en mi pagina , sin embargo lla nomeclatura de los layers me aparece en un cuadro con un tache, mi . map es este.

MAP
EXTENT 478585.948739 2142124.3699595 482356.97541 2145895.3966305
FONTSET "../misc/fonts.txt"
IMAGECOLOR 255 255 255
IMAGETYPE png
SYMBOLSET "../misc/symbols.sym"
SHAPEPATH "../shapes/"
SIZE 400 400
STATUS ON
UNITS KILOMETERS
NAME "bju_bus_1"

OUTPUTFORMAT
NAME png
MIMETYPE image/png
DRIVER GD/PNG
EXTENSION png
IMAGEMODE PC256
TRANSPARENT FALSE
END

PROJECTION

"init=epsg:4326"

#"proj=longlat"
#"ellps=WGS84"
#"datum=WGS84"
#"no_defs"
END
LEGEND
IMAGECOLOR 255 255 255
KEYSIZE 18 12
KEYSPACING 5 5
LABEL
SIZE MEDIUM
TYPE BITMAP
BUFFER 0
COLOR 0 0 89
FORCE FALSE
MINDISTANCE -1
MINFEATURESIZE -1
OFFSET 0 0
PARTIALS TRUE
END
POSITION LL
STATUS ON
TEMPLATE "C:/ms4w/apps/maplab-2.2.1/htdocs/mapbrowser/legend_template.html"
END

QUERYMAP
COLOR 255 255 0
SIZE -1 -1
STATUS on
STYLE HILITE
END

SCALEBAR
ALIGN CENTER
COLOR 0 0 0
IMAGECOLOR 255 255 255
INTERVALS 5
LABEL
SIZE MEDIUM
TYPE BITMAP
BUFFER 0
COLOR 0 0 0
FORCE FALSE
MINDISTANCE -1
MINFEATURESIZE -1
OFFSET 0 0
PARTIALS TRUE
END
POSITION LL
OUTLINECOLOR 0 0 0
SIZE 300 3
STATUS ON
STYLE 0
UNITS KILOMETERS
END

WEB
# IMAGEPATH "C:/ms4w/apps/maplab-2.2.1/projects/gmf_apps/bju_1/tmp/"
# IMAGEURL "http://127.0.0.1:2048/maplab_projects/gmf_apps/bju_1/tmp/"

MINSCALE 2000000
MAXSCALE 50000000

IMAGEPATH "C:/ms4w/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"

METADATA
"ows_onlineresource" "http://127.0.0.1:2048/cgi-bin/mapserv.exe?map=C:/ms4w/apps/proyectos/bju/maps/bju_bus_1.map"
"ows_srs" "EPSG:4326"
"ows_title" "bju_bus_1"
END
QUERYFORMAT text/html
LEGENDFORMAT text/html
BROWSEFORMAT text/html
TEMPLATE "fooOnlyForWMSGetFeatureInfo"
END

LAYER
DATA "C:/ms4w/apps/proyectos/bju/shapes/base_9.shp"
#DUMP TRUE
METADATA
"ows_title" "base_9"

#"ows_srs" "EPSG:4326"
...
...
...
...
....
NAME "vaper_busq"
PROJECTION
"proj=longlat"
"ellps=WGS84"
"datum=WGS84"
"no_defs"
END
STATUS ON
TEMPLATE "fooOnlyForWMSGetFeatureInfo"
TYPE POINT
UNITS METERS
CLASS
NAME "vaper_busq"
STYLE
ANGLE 360
COLOR 200 205 133
OPACITY 100
OUTLINECOLOR 0 0 0
SIZE 7
SYMBOL "circle"
END
END
END

el archivo que llama al mapa lo hice en maplab, como resultado me muestra el mapa como quiero, pero las imagenes de las layers no las muestra, el texto y todo lo demas si, cabe mencionar que en el dir /ms_tmp tasmpoco aparece la imagen renderizada...... no se que esta pasando o que estoy haciendo mal.

podrian ayudarme por favor.

por todo gracias

Oscar dijo...

Esta muy interesante tu tutorial. Yo necesito unir mi seguridad a pmapper para que ciertos usuarios solo tengan acceso a ciertas capas que yo les asigne. Creo que con esto es bastante factible. Cierto?

Otra cosa que necesito es la posibilidad de editar una capa a traves de esta u otra aplicacion web y no con una desktop (actualmente uso gvSIG)

Si pudieras orientarme te lo agradeceria mucho.

Saludos!

Wilfo dijo...

Hola amigo , me aprece este error al correr el ejemplo:
Warning: [MapServer Error]: loadSymbolSet(): (misc/symbols/symbols.sym) in C:\ms4w\Apache\htdocs\prueba\PHPWebPage.php on line 18 Warning: Failed to open map file ejemplo14.map in C:\ms4w\Apache\htdocs\prueba\PHPWebPage.php on line 18 Fatal error: Call to a member function draw() on a non-object in C:\ms4w\Apache\htdocs\prueba\PHPWebPage.php on line 19


Mi código php es este:


draw();
$url_imagen = $jImagen->saveWebImage();
?>

Wilfo dijo...

Interesante amigo .Aprendi mucho en este blog sobre GIS.Pero ultimamente he realizado filtros coenctandome a Postgree los cuales seran de mucha ayuda para todos ustedes.
http://neurocodigo.wordpress.com

Unknown dijo...

Hola buenas tardes, soy estudiante de programación. Actualmente uso MapServer(Ms4w) y tengo un proyecto que incluye la parte del SIG, y me gustaría que me ayudasen con información acerca de 'mapserver con php' o algo por el estilo, ya que en español no hayo muchas referencias (ésta es una de las pocas), Y me podrían ayudar a hacer zoom a un mapa? ya sea con php o JS. GRACIAS.

Unknown dijo...

Hola que tal, solo una pregunta... Como seria el proceso de guardado de la imagen generada en PHP?

Saludos

Unknown dijo...

Hola hay alguna forma de conectar contigo por correo tengo problemas con postres y mapserver y necesito ayuda gracias