Un Mapa de México con OpenLayers y MapServer
Pues he seguido jugando con OpenLayers y he creado un mapa digital de México donde se pueden ver las ortofotos del INEGI, división estatal y municipal. Todo esto en un lapso tal vez de 4 hora contando la instalación de mapserver.
OpenLayers no es un servidor de mapas web como lo son MapServer, ArcGIS Server, Geoserver, MapGuide Open Source, sino una librería en JavaScript que tiene la cualidad de poder acceder a información geoespacial ya sea de servidores que cumplan con el estándard WMS y WFS del OpenGeospatial Consortium (OGC) o de los principales servicios comerciales que hay en la actualidad como son Google Maps, Virtual Earth, TerraServer, WorldWind. En pocas palabras OpenLayers es una opción de código abierto similar a la API de Google Maps, pero con la libertad de acceder a más fuentes de datos.
Instalar MapServer en Windows
Para esta prueba lo primero que se debe de hacer es descargar MapServer, el programa que servirá los mapas de división política de México. Esto puede realizarse de distintas maneras, pero la más sencilla es descargar el paquete MS4W desde esta dirección. MS4W (MapServer For Windows) es un paquete que incluye Apache, PHP, el mismo MapServer y sus utilerías.
Al descargar MS4W tendrás un archivo *.zip que deberás de descomprimir directamente en el disco C:\ de tu computadora, debiendo quedar un directorio llamado c:\ms4w al hacerlo. De ahí lo único que debes de realizar es ejecutar el archivo apache-install.bat que se encuentra dentro de dicho directorio. Lo único que debes de fijarte es no tener instalado otro servidor HTTP en la computadora (como el Internet Information Server de Microsoft) pues de lo contrario el servicio del Apache entrará en conflicto y no podrá ejecutarse.
Si se instaló de manera correcta MapServer podrás ver una pantalla similar al accerder a la dirección http://localhost

Crear un archivo *.map de configuración
Ahora es cuestión de crear un archivo MAP de configuración con el cual MapServer identifica qué datos se usarán y con qué simbología se representarán. En este caso el archivo se los dejo en esta liga y a continuación se puede ver cada sección del mismo.

Esta primera sección del archivo indica los datos generales del proyecto, nombre, status, tamaño de la imágen a crear en pixeles, las coordenadas mínimas y máximas de inicio del mapa, las unidades en las que se encuentra y la ruta del directorio donde se encuentran los shapefiles que vamos a utilizar.

Posteriormente hay que definir una sección WEB que indica la ruta física donde se grabarán los archivos que MapServer generará, al igual que la dirección URL desde la cual se pueden acceder. Y por último para nuestro caso la sección METADATA donde se describen las propiedades de nuestro servicio WMS, las tres propiedades forzosas que debes de configurar son wms_title - nombre del servicio, wms_onlineresource - URL para acceder al servicio y wms_srs - sistemas de coordenadas que el servicio soportará. La sección PROJECTION que está fuera de la sección WEB debe de indicarse también de manera forzosa.
Y por último se crean las secciones LAYER por cada capa de información que vamos a mostrar en el mapa. En la imágen de la izquierda está la de los límites municipales. Hay que resaltar que al igual que en la sección WEB descrita arriba, cada layer debe de tener una sección METADATA donde se indique mínimamente el título del layer para el servicio WMS. Con excepción de este punto el resto del layer se similar a cualquier otro que se defina para MapServer.
El archivo que creamos (mexico.map) lo podemos guardar en cualquier directorio que deseemos, en este caso en c:\ms4w\Apache\htdocs\wmsserver.
Aunque en este artículo describo la creación del archivo map como si se editara manualmente es preciso decir que hoy en día es posible hacerlo desde editores especiales, inclusive uDig y qGIS tienen opciones para exportar las capas que tengas abiertas en un archivo *.map que posteriormente puedes insertarle las secciones METADATA necesarias para que funcione como servicio WMS (tal vez en otro post ponga un ejemplo).
Configurando OpenLayers para leer el servicio WMS creado.
Creo que el paso más fácil de los tres, y es que OpenLayers tiene la virtud de estar diseñado precisamente para acceder de manera simple a servicios de mapas en la red. por lo tanto y usando el ejemplo del post anterior, solo debemos de agregar estas líneas a nuestra página html para que se carguen las capas que estamos sirviendo via MapServer:
var mexicourl = “http://148.235.89.18/cgi-bin/mapserv.exe?map=/ms4w/apache/htdocs/wmsserver/mexico.map”;
var wmsmexico = new OpenLayers.Layer.WMS(”Estados y Municipios”,mexicourl,
{layers: “municipios,estados”, transparent: true, format: “image/png”});
map.addLayer(wmsmexico);
En conclusión les puedo comentar que el uso combinado de MapServer y OpenLayers ofrece una buena alternativa para crear aplicaciones de mapas web con herramientas de código abierto. Ambos productos parten de la simpleza en su estructura y el que OpenLayers funcione con JavaScript ofrece grandes posibilidades para extender su funcionalidad.
El único detalle que he encontrado es el problema de las etiquetas que se llegan a repetir debido a que MapServer no sabe que las peticiones que le hacen son para crear un mosaico dentro de OpenLayers, dejando un resultado como el de la imágen de abajo. La solución es ya sea instalar ka-map o el mismo Tile-Cache, los cuales generan la imágen completa que se necesita desplegar en OpenLayers y posteriormente la dividen para crear el mosaico y hacer más eficiente su despliegue.

El ejemplo completo lo puedes ver en esta liga, en el cual puedes ver las instrucciones usadas abriendo el código fuente de la misma página.


April 21st, 2007 at 4:03
Enhorabuena por el artículo, me ha gustado mucho.
La verdad es que publicar con MapServer es un placer por su sencillez y potencia. Ahora mismo creo que es el que mejores resultados estéticos ofrece (tal vez salvando a Mapnik, pero no lo conozco mucho).
Un par de cosas:
No estoy seguro, pero creo que en MapServer se pueden fijar las posiciones de las etiquetas, si esto lo combinas con la opción de que puedan quedar partidas (creo que era PARTIAL) entonces el etiquetado de cada tesela del mosaico debería solapar con las otras correctamente. Repito que no lo he probado, últimamente trabajo con deegree y no he tenido ocasión de probar esto.
La otra, creo que TileCache no hace una petición “enorme” y luego las parte sino que simplemente hace la faena de pedir las teselas en el servidor y luego ofrecer una interfaz hacia los clientes soportando diferentes protocolos, entre ellos uno específico para teselas que han llamado WMSC.
Esta es una propuesta de especificación que ha hecho MetaCarta y que dista todavía bastante de ser un estándar (sólo la soportan ellos!) aunque creo que la gente de GeoServer también están trabajando en ello.
Repito, da gusto ver artículos tan bien escritos sobre el mejor servidor de mapas libre y uno de los clientes ligeros que más prometen. Se nota que te has tomado tu tiempo.
Un saludo.
April 22nd, 2007 at 6:33
[...] Un Mapa de México con OpenLayers y MapServer | hablandodesigs: Un Mapa de México con OpenLayers y MapServer [...]
April 22nd, 2007 at 9:08
[...] Un Mapa de México con OpenLayers y MapServer [...]
April 23rd, 2007 at 10:41
Gracias XuRxo por tus observaciones, voy a revisar mas a detalle las opciones de MapServer para ver si hay algo que mejore el etiquetado.
Ahora con respecto a Tile-Cache, tal vez no me explique bastante bien, pero básicamente es la opción de crear metatiles, con lo que en vez de generar cada tesela a la vez se genera un grupo de ellas y posteriormente se subdividen. Sinceramente ya no quise ahondar mucho en el tema pues creo que mezclaría muchos temas en el mismo post. De todas maneras es algo que pronto quiero probar y ya les platicaré.
April 23rd, 2007 at 17:22
eeeee
hello world!
April 24th, 2007 at 16:32
Hola, si la verdad tu articulo esta muy interesante. Yo también he estado probando con esto del mapserver y el openlayer, pero aun estoy confundido con lo del Tile Cache.
No se si estoy bien, pero entiendo que como el admin del sitio, que el genera un grupo de teleselas y luego las subdivides. Lo que no vi en el còdigo fuente de tu pagina es si dividiste el layer de la division politica? y lo otro que he encontrado es que cuando empiezas a bajar de zoom (a acercarte), el mapa se queda colgado y no renderiza buena parte de los tiles, es un problema que estoy tratando de resolver ahora y me gustaria saber si alguien mas sabe como solucionarlo…
Saludos
May 12th, 2007 at 16:42
Hi My Name Is ivavag.
July 7th, 2007 at 10:11
Alguien me podrìa decir donde puedo bajar el fuente de MapServer! O la forma de refrescar automàticamente un capa!!
July 13th, 2007 at 14:21
no hay
July 18th, 2007 at 4:12
Hola!
necesito ayuda urgentemente. Estoy creando un servicio con map server para luego poder visualizarlo con la ayuda de openlayers, pero me encuentro con el problema que:
-o no me detecta bien el mapfile
-o el mapfile tiene algun error porque todo se vuelve de color rosa.
-o es un tema de configuración
He estado buscando y creo que puede ser un problema de TILES pero no veo como arreglarlo.
De hecho, cuando intento ver el visor de Mexico directamente desde el link de mas arriba me sucede lo mismo.
Gracias por adelantado
July 20th, 2007 at 8:30
Si lo que estas viendo es todo del color de fondo que tenes determinado en tu .map probablemente tengas un problema con tu zoom o con tu extent.
Mira http://trac.openlayers.org/wiki/SettingZoomLevels
Acordate que este tipo de preguntas las podes ( debes ) hacer en las listas tanto de mapserver como de openlayers.
Saludos
Muy bueno el blog
July 26th, 2007 at 14:05
Estoy haciendo una preuba en mapserver, pero no se como hacer si una coordenada UTM cae dentro del poligo de unos de mis shapes, podria proporcionarme algun script o como puedo hacerlo
September 20th, 2007 at 8:41
Un datalle que me costo descubrir hasta que lo encontre en un foro.
No podia iniciar el servidor apache y esto era por tener el skype corriendo que usa el puerto 80
Solución cerrarlo iniciar el apache y luego ejecutar el skype que al verlo ocupado usa otro puerto.
Saludos de
Buenos Aires
October 15th, 2007 at 8:10
hola bueno tengo un problemita para abrir el archivo .map q cree no se donde debo guardarlo y ademas no me sale la opcion de maplap (la parte donde se debe cargar el archivo ) no se sime pueden ayudar a la configuracion para el montado del mapa a mapserver paso a paso porfavor ok gracias espero su respuesta
November 10th, 2007 at 10:43
hola. tengo un problema, teno w. vista y no puedo instalar apache desde el simbolo de sistema, sencillamente no hace nada, ni siquiera ejecutando como administrador. alguna idea?.
gracias!
November 24th, 2007 at 21:49
Mapserver es una excelente herramienta para SIG pero cuando se corre sobre linux, de hecho existe una version de linux especial llamada HostGis, el unico pero es que el servidor no tiene entorno grafico, se recurre a comandos.
Les recomiendo que para este tipo de aplicaciones utilicen linux y se olvidan de caidas de sistema, virus y sobre todo de tener que utilizar software pirata
January 28th, 2008 at 13:53
Como genero mi map sin ningun problema…. con el ejemplo que dieron, hago lo mismo solo cambio algunos datos pero no llego a visualizar la información,carga el servicio pero no se vee nada
May 26th, 2008 at 17:22
Hola estaba probando la instalacion del MapServ con el ejemplo de Hello World y me manda un error: loadWeb(): Unknown identifier. Parsing error near (/ms_tmp/): (line1).
esto en el valor del map_web_imagepath.
comento que lo estoy corriendo en win XP.
Saludos.
September 10th, 2008 at 11:51
Sabes tengo una duda me sale el siguiente error
loadWeb(): Unknown identifier. Parsing error near (/opt/fgs/www/htdocs/tmp/):(line 1)
a que se debe?
Muy bueno el articulo
Saludos
September 11th, 2008 at 16:22
hola tengo este error loadWeb(): Unknown identifier. Parsing error near (/opt/fgs/www/htdocs/tmp/):(line 1)
nose que pasa toy estancado ayuda porfavor
Saludos
November 19th, 2008 at 5:05
Hola que tal
estoy muy perdido, planteo mi situación
tengo un Mapserver sirviendo WMS y un Openlayer consumiendo de este, de por medio tengo un mapscript en php que me hace de wraper entre ellos dos para proyectar unos puntos que tengo en una bbdd segun se explica en http://mapserver.gis.umn.edu/docs/howto/cgi-wrapper-script . Hasta aquí todo bien.
Mi mapserver tiene que lee los datos rasters de un montón de ortofotografias que tiene en un directorio siguiendo la tecnica de crear un .shp que los referencia según se explica en http://mapserver.gis.umn.edu/docs/howto/raster_data#rasters-and-tile-indexing las ortofotografias están en formato ecw
El problema que se me plantea es a la hora de proyectar estos puntos que tengo en cordenadas (y mapas) UTM y que pertenecen a USOS diferentes
Primer problema que se me plantea es yo quiero mostrar mediante openlayer la extensión de toda españa. como lo hago a la hora de definir el maxExten en openlayer si los corners de caeen en diferentes usos?? yo hago lo siguinete:
map = new OpenLayers.Map(’map’,{
maxExtent: new OpenLayers.Bounds(0, 0, 9999999, 9999999), //si se mesclen sistemes se li enva completament la cebolla
maxResolution: ‘auto’,
projection:”EPSG:23031″,
units: “m”,
transitionEffect: “resize”,
controls: [
new OpenLayers.Control.KeyboardDefaults(),
]
}
);
capa_espanya = new OpenLayers.Layer.WMS(”espanya”,”http://localhost/cgi-bin/mapserv.exe”,{
map:’C:\\ms4w\\Apache\\htdocs\\preproduccio\\wms2.map’,
layers: “esp”,
}
,{singleTile: true} //per a una sola rajola
);
wrapper = new OpenLayers.Layer.WMS(”Wrapper”,”http://localhost/preproduccio/wrapper.php”,{
map.addLayer(capa_espanya);
map.setCenter(new OpenLayers.LonLat(lon, lat));
map.setCenter(new OpenLayers.LonLat(722417, 4574945));
map.addControl( new OpenLayers.Control.LayerSwitcher() );//*/
});
La capa que sirvo en el archivo map es :
PROJECTION
#”init=epsg:4326″# amb aqueta projeccio no pille les trampes pero si el mapes
“init=epsg:23031″
END
LAYER #primera capa
NAME “local”
STATUS default #La dibuja siempre ON i OFF permite mostrarla y ocultarla
TILEINDEX “map_index.shp”
TILEITEM “Location”
DEBUG on
TYPE raster #Tipo de capa pot ser pun punt un raster etc un poligon
PROCESSING “BANDS=1,2,3″
PROCESSING “SCALE=AUTO”
METADATA
“wms_srs” “EPSG:23031″
“wms_name” “local”
“wms_title” “local”
“wms_server_version” “1.1.0″
“wms_format” “image/jpeg”
END
PROJECTION
“init=epsg:23031″
END
END
El resultado que obtengo es que los puntos y mapas que que caen en el USO 31 los pinta bien pero los que caen en el USO 30 los pinta a la derecha de los de del 31, para entendernos un punto en Barcelona me lo representa bien pero luego un punto en Madrid me lo representa a la derecha de barcelona (Perdón a los que no seas de españa)
Sospecho que es problema de las proyecciones pero no alcanzo a entender como funciona el tinglado como puedo representar dos puntos en USOS diferentes si a la hora de hacer la llamada al WMS la caja no me da opcion a definir a que uso corresponde cada corner?
Sospecho también que este problema no se presentaría si utilizara coordenadas esferica es asi?
Alguien sabe de alguna referencia, pagina, tutorial etc sobre el tema de proyecciones y demás?
Bueno lo dejo aquí tengo un montón problemas más pero tampoco quiero avasallar el personal.
Gracias