martes, 30 de diciembre de 2008

Eclipse PDT 2.0 lanzado

Eclipse 3.4 GanymedeEclipse PDT 2.0 estable fue lanzado hace poco oficialmente, el 26 de Diciembre del 2008 y tiene muchas novedades.

La primera gran novedad es que está basado en la versión 3.4 Eclipse Ganymade y todas sus ventajas que conlleva estar basada en ella.

Se asume que esta versión es más lijera que la anterior. Lo que si es un hecho que el instalador pesa menos :)

Una nueva característica que rápidamente notaremos es en el Explorador de archivos PHP. Tenemos la posibilidad de separar nuestros recursos de aplicación, con las librerías js y estilos css, esto hace nuestro proyecto más modular desde la perspectiva del IDE. Además ahora también incluye la librería de funciones y clases de PHP nativa.

Una nueva característica son los @property y @method en PHPdoc, que nos ayudará en el asistente de autocompletado para propiedades y métodos que deseamos que aparezcan(y no aparecían). Por ejemplo propiedades que publicamos a través del método mágico _get.

Existen más características propia de la orientación a objetos de PHP que han incluído en el IDE. Seguiré testeando esta nueva versión para seguir posteando mis apreciaciones.

Anímate ya está para la descarga el All-in-One tanto para Linux, MAc y Windows : http://www.eclipse.org/pdt/

lunes, 15 de diciembre de 2008

Generando código PHP desde UML

Creative Commons License

Esta obra está bajo una licencia de Creative Commons.

© 2008 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.


Continuando con el artículo de herramientas CASE UML para PHP 5, veremos ahora la creación de código a partir de un diagrama de clases de dos herramientas: BoUML y ArgoUML.

Indice de secciones:
  1. Revisando la generación de código
  2. Revisando las asociaciones entre clases
    1. Dependencia
    2. Asociación simple
    3. Asociación de agregación y composición
    4. Asociación de generalización

1) Revisando la generación de código








Clase creada en ArgoUML / Clase Creada en BoUml

Se ha una clase Carrito, pero en diferentes herramientas. Veamos el código generado

>> Código generado en BoUML <<
Se puede verificar lo siguiente:
  • Vemos que genera el nombre de clase en PHP con el mismo nombre que en el UML
  • IMPORTANTE: Dispone de unas etiquetas de comentario // Bouml preserved body begin/end que permitirá evitar la sobre-escritura de tus implementaciones una vez que hayas generado tu código
  • Detectó bien la inicialización de un atributo y la visibilidad
  • Se crea las carpeta según el paquete donde se encuentra (previa configuración)
  • PROBLEMA: Los valores de retorno siempre son null, a pesar de haberle especificado entero o cadena.
  • PROBLEMA: Se crea un comentario, pero no comenta el tipo de dato de los atributos, los parámetros del método o la visibilidad.
<?php

/**
* Clase Carrito de compras
*/
class Carrito {
/**
* Cantidad de productos en el carrito
*/
private $cantidad = 0;

/**
* Contructor
*/
public function __construct()
{
// Bouml preserved body begin 0001F503

$return=NULL;

return($return);
// Bouml preserved body end 0001F503
}

public function count()
{
// Bouml preserved body begin 0001F583

$return=NULL;

return($return);
// Bouml preserved body end 0001F583
}

public function guardar()
{
// Bouml preserved body begin 0001F603

$return=NULL;

return($return);
// Bouml preserved body end 0001F603
}

}
?>

>>Código generado en ArgoUML<<
Se puede verificar lo siguiente:
  • Vemos que genera el nombre de clase en PHP con el estilo de formato largo, con el separados underline(_) y como prefijo al nombre original en UML
  • Se crea un comentario estilo PHPdoc, lo realizo de forma excelente documentando casi todo. Inclusive el creador, fecha y otros detalles minucios.
  • Dispone de unas etiquetas de comentario similares al BoUML, que permitirá evitar la sobre-escritura de tus implementaciones una vez que hayas generado tu código
  • Los valores de retorno son detectado, inclusive te realiza un cast de las variables.
  • Detectó bien la inicialización de un atributo y la visibilidad
  • Te genera una carpeta por paquete.
  • Dispone de unas secciones especiales como /* user defined includes */ para agregar includes o requires y no ser sobre-escritos.
  • Para generar un tipo String, se debe especificar el tipo "char"
  • Problema: Tiene demasiado "código extra", un código para detectar si es PHP 5, y fuerza mostrar los errores inclusive los de tipo "Notice".
  • Te crea un include para cada archivo donde se aloja la clase que necesitas. si esta clase estuviera relacionada a muchas otras generaría mucho código (una para cada asociacion). Este código se consideraría tambien "extra" o "de más" si es que utilizamos el método mágico __autoload, para la carga automática de clases. O bueno claro! con los namespaces que vienen ya en PHP 5.3
<?php

error_reporting(E_ALL);

/**
* Modelo Test PHP 5 y UML - modelo\class.Carrito.php
*
* $Id$
*
* This file is part of Modelo Test PHP 5 y UML.
*
* Automatically generated on 16.12.2008, 00:46:11 with ArgoUML PHP module
* (last revised $Date: 2008-04-19 08:22:08 +0200 (Sat, 19 Apr 2008) $)
*
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @package modelo
*/

if (0 > version_compare(PHP_VERSION, '5')) {
die('This file was generated for PHP 5');
}

/* user defined includes */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes end

/* user defined constants */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants end

/**
* Short description of class modelo_Carrito
*
* @access private
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @package modelo
*/
class modelo_Carrito
{
// --- ASSOCIATIONS ---


// --- ATTRIBUTES ---

/**
* Short description of attribute cantidad
*
* @access private
* @var int
*/
private $cantidad = 0;

// --- OPERATIONS ---

/**
* Short description of method __construct
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return void
*/
public function __construct()
{
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CFA begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CFA end
}

/**
* Short description of method count
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return int
*/
public function count()
{
$returnValue = (int) 0;

// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF4 begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF4 end

return (int) $returnValue;
}

/**
* Short description of method guardar
*
* @access public
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
* @return boolean
*/
public function guardar()
{
$returnValue = (bool) false;

// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF6 begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CF6 end

return (bool) $returnValue;
}

} /* end of class modelo_Carrito */

?>



2) Revisando las asociaciones entre clases
Analizaremos varias asociaciones entre clases y la generación del código en PHP:

Asociacion de dependencia
Es una relación de uso, es decir una clase usa a otra, que la necesita para su cometido. Se representa con una flecha discontinua va desde la clase utilizadora a la clase utilizada. Con la dependencia mostramos que un cambio en la clase utilizada puede afectar al funcionamiento de la clase utilizadora, pero no al contrario.



ArgoUML





BoUml




>>Código generado en BoUML<<
No hubo ningún cambio en el código con ésta asociación

>>Código generado en ArgoUML<<
Por la linea 22, antes de los includes de usuario del código ArgoUML generado anteriormente, se insertan estas nuevas lineas. La clase utilizadora(dependiente) "Carrito", realiza un include_once a la clase utilizada "BD". Ésto implica que dentro de la vida de un objeto Carrito requerirá llamar a un método o una instancia de BD.

/**
* include modelo_BD
*
* @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
*/
require_once('modelo/class.BD.php');


Asociacion simple
Permite asociar objetos que colaboran entre si. La diferencia con la dependencia radica en que se guarda una referencia de la otra clase.
Esta asociación dispone de navegabilidad, esta dirección significa que uno puede obtener o "ver" el objeto apuntado, a través del objeto cliente. También implica, al igual que la dependencia, el llamar a un método u obtener la instancia de una clase.



ArgoUml




BoUml



>>Código generado en BoUML<<
Para Bouml es necesario crearle el atributo donde guardará la referencia a la clase, esta se encontrará en los extremos de la asociación. En este caso Carrito solita una instancia de BD, y esta se almacenará en el nuevo atributo "conexion".
Revisar al final del código, notar que generó un atributo más


<?php

/**
 * Clase Carrito de compras
 */
class Carrito {
  /**
   * Cantidad de productos en el carrito
   */
  private $cantidad = 0;

  /**
   * Contructor
   */
  public function __construct()
  {
    // Bouml preserved body begin 0001F503

$return=NULL;

return($return);
    // Bouml preserved body end 0001F503
  }

  public function count()
  {
    // Bouml preserved body begin 0001F583

$return=NULL;

return($return);
    // Bouml preserved body end 0001F583
  }

  public function guardar()
  {
    // Bouml preserved body begin 0001F603

$return=NULL;

return($return);
    // Bouml preserved body end 0001F603
  }

  /**
   * instacion de clase DB en asociacion conexion
   */
  private $conexion = null;

}
?>

>>Código generado en ArgoUML<<
En ArgoUML no se crea el atributo en la clase Carrito, pero si crea un comentario sobre la asociación y el nombre bautizado para el extremo. Por ello he creado manualmente un atributo "conexion" en la clase.
OJO, solo puse la primera parte: revisar la linea 47 y 48 del código
<?php

error_reporting(E_ALL);

/**
 * Modelo Test PHP 5 y UML - modelo\class.Carrito.php
 *
 * $Id$
 *
 * This file is part of Modelo Test PHP 5 y UML.
 *
 * Automatically generated on 16.12.2008, 01:57:32 with ArgoUML PHP module 
 * (last revised $Date: 2008-04-19 08:22:08 +0200 (Sat, 19 Apr 2008) $)
 *
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 * @package modelo
 */

if (0 > version_compare(PHP_VERSION, '5')) {
    die('This file was generated for PHP 5');
}

/**
 * include modelo_BD
 *
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 */
require_once('modelo/class.BD.php');

/* user defined includes */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-includes end

/* user defined constants */
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants begin
// section -64--88-1-33--101592aa:11e3c5ee07c:-8000:0000000000000CB6-constants end

/**
 * Short description of class modelo_Carrito
 *
 * @access private
 * @author Jaime M. Tan Nozawa, <jtnozawa@gmail.com>
 * @package modelo
 */
class modelo_Carrito
{
    // --- ASSOCIATIONS ---
    // generateAssociationEnd : conexion

    // --- ATTRIBUTES ---

    /**
     * Short description of attribute cantidad
     *
     * @access private
     * @var int
     */
    private $cantidad = 0;

    // --- OPERATIONS ---

Continuará... con multiplicidad, agregación/composición y generalización

martes, 9 de diciembre de 2008

UML y PHP: Herramientas Case

Creative Commons License

Esta obra está bajo una licencia de Creative Commons.

© 2008 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.



Después de haber analizado el negocio y haber realizado tus workflow de procesos, es hora de comenzar a diseñar (y analizar) la arquitectura de tu sistema.

La gran pregunta para todo desarrollador y arquitecto de software que implementará en PHP sería: qué herramientas CASE dispongo, hay alguna libre... y éstas me generarán código PHP ? y código PHP 5 si pido mucho???

Pues les listaré los que a los largo de estos años he podido testear:

StarUML : Interesante herramienta, es perfecta para la documentación usando la metodología RUP, los que vienen de utilizar Rational Rose, esta herramienta les parecerá ser un clon casi idéntico (inclusive en los colores). Tienes la posibilidad de crear íconos para tus estereotipos y crear tus propios profiles. (Digamos que puedo crear mi Profile para modelar para Zend Framework o un MVC propio más "abierto"). Su interfaz es ligera y agradable. utiliza UML 2.0.

La generación de código para PHP 5: intermedio ***
Utiliza un método de "templates", en el cual uno puede inclusive modificar el código que generará. Detecta agregación y composición y genera automáticamente el atributo en la "clase cliente"

Desventaja :
- Solo corre en Windows
- El código generado "chanca" (sobre-escribe) el código anterior generado.
- La generación de clases las crea sin tomar en cuenta el paquete donde se encuentra.
- Puedes crear Diagramas E-R pero al final no genera nada de SQL.
- No dispone de ingeniería reversa para PHP.


ArgoUML :
ArgoUML es una de esas joyitas libres hechas encajadas perfectas para JAVA, por suerte estos últimos años ha tomado en cuenta a PHP y su capacidad orientación a objetos y tenemos esta gran herramienta para PHP. Ahh!!...Por cierto esta es la que uso.

La generación de código para PHP 5: Excelente *****
Tiene la capacidad de generar código PHP 5 y seguir desarrollando paralelamente (no chanca el código), dispone de unas etiquetas de comentario que evitan la sobre-escritura de métodos. La generación de código la realiza usando la técnica de clases de nombres largos: presentacion_UCCcontrollers_gestionarPrestamo.php
Aunque ya estamos a puertas de los namespaces de PHP 5.3 y PHP 6, aún sigue siendo la única "forma simple" de dar pertenencia de una clase a una paquete.

>> Corre en Linux y en Windows <<

Desventajas:

- Es muy pesado y requiere de mucha memoria principal.
- Sigue utilizando UML 1.4, la interfaz no es tan agadable ni dispone de íconos para reconocer los estereotipos. (es un problema identificar mis clases controladoras con las de datos).
- Aunque ha mejorado en la última versión, sigo creyendo que su "usabilidad" no es de lo mejor.
- No dispone de Ingeniería reversa para PHP (si la sacan sería un GOL)
- No detecta la composición. No es una desventaja pero te dá más trabajo en crear atributos.


Bouml
BoUML fue una sorpresa después de haberlo testeado hace poco (y haberlo hecho hace 2 años veo su evolución), ahora ya tiene soporte TOTAL para PHP 5 y está orientado al programador. Está diseñado ,y te fuerza a usar la metodología RUP, por ejemplo no puedes crear un diagrama de clases en un "Use case View" donde solo se debe crear casos de uso. Es ligero, usa UML 2.0 y tiene íconos para los estereotipos. Interesante :)

La generación de código para PHP 5: Excelente *****
Tiene la capacidad de generar código PHP 5 y también seguir desarrollando paralelamente (no chanca el código), tiene un generador de métodos getter y setters (es lo mejor, me ahorro harto trabajo) e inclusive te genera código PHP5 en los métodos.

Viene con un aplicativo para la gestion de proyecto colaborativo y la gestión de cambios en los diagramas que creamos. (excelente aportación)
Tiene una opción de ingeniería reversa para PHP 5. Muy buena. (Con ésto hace este programa de los libres único por ahora)

Detecta la asociación de composición , crea un atributo en la clase cliente.

Desventajas:
- El código aún no dispone de una técnica para dar pertenencia de una clase a un paquete, pero tal vez halla un truco por allí (que no he logrado modificar) para generar con técnica de "nombres largos" de clase.
- No tiene un generador SQL para el modelo de datos.
- Increible, no encontré otra desventaja.. jeje
- Otra desventaja es que a pesar que se puede poner el estilo de documentacion de PHPdocumentor no detecta los returnValue o los parámetros de un método para generarlos en el comentario. Es posible digitarlos manualmente pero sería muy laborioso


Después hay otras herramientas como: umbrello (**) (su interfaz es básica y su generación de código también) y claro el Rational Rose (**)... que podemos decir que es el mejor en RUP y UML ... PERO....
para genera código PHP sólo conozco el PHP4Rose: genera sólo codigo PHP 4 y es pésimo.


CONCLUSIONES:

* Aplicaciones como Rational Rose para PHP está descartado (sin analizar el costo de licencias).
* ArgoUML es bueno pero se requiere capacitación y mucha RAM en tu PC.
* Ningúna herramienta Case propone aún los namespaces de PHP 5.3 ó PHP6 y eso que está a la vuelta de la esquina.

* A pesar de que aún utilizo ArgoUML, me empeñaré en seguir investigando el bouml que está demasiado interesante. Cuando bouml tenga la opción de cambiar el "formato de nombre de una clase" (o me digan como hacerlo) y disponga de la generación de un modelo de datos (SQL) estaremos frente a LA HERRAMIENTA case para PHP.

Aún para mis proyectos seguiré usando ArgoUML y en mis tiempos libres seguir investigando boUML.

Retomando el Blog PHP experto

Tengo que pedir disculpas a los lectores de mi blog, que increiblemente con mi ausencia de POSTs, mi contador a incrementado considerablemente de visitas, y les agradezco enormemente.

Para este retorno de revivir el blog crearé varias partes:

* Analisis y Diseño OO : UML y RUP con PHP.
* Arquitectura Orientada al Servicio SOA para PHP, BPEL y BPMN
* Patrones de Diseño, capas de abstracción y SPL.
* Frameworks (Zend Studio en especial).
* SIG libre con PHP-mapscript (continuaré con los tutoriales ya avanzados).
* Base de datos: PostgreSQL y PostGIS.
* PHP 5.3 y PHP 6.
* IDE's para PHP (Eclipse PDT y Netbeans, en especial).
* Cursos y conferencias de PHP.

También escribiré algunos artículos mezclando los conceptos de ingeniería de software y el SIG.
Te haz preguntado porqué los SIG usualmente no se diseña en UML o utilizan un patrón de arquitectura como el MVC. Porqué los frameworks de PHP para Mapscript son usados como plantillas y no como "frameworks".
Los WMS, WFS y WCS no es acaso una "arquitectura orientada al servicio" pero espacial, pero aún así no lo toman como son. (UNA ARQUITECTURA!!!)

Espero sea de su interés los temas que postee y gracias nuevamente por sus visitas.

lunes, 12 de mayo de 2008

Fotos de la Conferencia en UTP

El 28 de abril se realizó la primera conferencia de la comunidad PHP perú.

NOTA: por si acaso solo están las fotos correspondiente a mi expo... para mas detalles ver los links inferiores de todo el evento

Aquí las fotos:

Foto 1: Yo, comenzando a exponer (el burro por delante). Mi expo fue sobre PHP Mapscript por cierto






Foto 2: Los chicos de rojo, la comunidad PHP perú y gente de Movile Bridges








Foto 3: Aquí me están dando mi presente recordatorio, eteeee, quien es quien ta a mi costado???








Foto 4: El auditorio de UTP, si se fijan bien ---> M. Lara ponchado sentado a la izquierda JEJE







Si quieren el PDF de la exposición lo pueden obtener aquí.
Mas fotos de la expo aqui

lunes, 21 de abril de 2008

Conferencia PHP 2008 - Mapserver

Este es el primer evento que la Comunidad PHP Perú realiza, con el propósito de incentivar el uso y discusión de la herramienta PHP presentando aplicaciones reales desarrolladas e implementadas con el lenguaje PHP.

REGISTRO EN LINEA:
------------------
http://www.php.org.pe/registro_conferencia/registro.php
---------------------

Seminario PHP Lima 2008
Día: Lunes 28
Hora: 17:30
Lugar: Auditorio UTP

Comunicaciones Móviles y PHP
  • Expositor: Valentín Guardamino
  • Development Manager Soft Bridges Perú
  • Analista programador TSS- Perú
  • Ingeniero de Software – UPC

Comunidad PHP y Budix.com
Expositores:
Raúl Yamashiro
  • Profesional Egresado de Cibertec.
  • Software Developer Comunidad PHP Perú.
  • Comunidad Budix.com.
Daniel Isla
  • Bachiller Ingeniería Sistemas - UNMSM.
  • Software Developer Comunidad PHP Perú.
  • Comunidad Budix.com.

Recursos Microsoft para los desarrolladores PHP
Expositor:
Speaker Microsoft Perú

Mapas por Internet con PHP-Mapscript de Mapserver
Expositor:
Jaime M. Tan Nozawa (miembro del Foro PHP Perú)
  • Desarrollador en PHP experiencia en Diseño objeto-relacional.
  • Consultor y analista de sistemas de información.
  • Experto en SIG Libre.
  • Experto en Redes Linux y Ms. Windows.


Sistema de Rastreo y Localización Satelital
Expositor:
Humberto Bejarano bravo (moderador del Foro PHP Perú)
Algunos desarrllos:
  • Sistema de Rastreo y Localización Satelital – Disatel Guatemala.
  • Juego 3D de Carreras INDY - Gattaca Colombia.
  • Sistema Transaccional de Aplicaciones Financieras via ATM's (Cajeros Automáticos).
  • Cajas Municipales Sullana, Huancayo.
  • Sistema de Consultas y Pagos Electrónicos, Telebanking - ScotiaBank Peru.
  • Simulador de Vuelo para Helicóptero MI-17.

Equipo PHP Perú.

Mas información en:

http://php.org.pe/index.php?topic=631.msg1486#msg1486
http://www.utp.edu.pe/ltv3/phpPeru.html

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.