Puedo utilizar la declaración OpenLayers.Layer.Mapserver de OpenLayers para generar un raster a partir de datos GRIB. He leído en la documentación de MapServer y en foros que debería ser posible obtener información de puntos del raster utilizando WMSGetFeatureInfo de OL. He probado algunas combinaciones de las soluciones reportadas por otros. Sin embargo, como el control es para un WMS normal y también casi todas las soluciones implican GeoServer, más o menos he llegado a un muro. Así que este es mi código:
<script type="text/javascript">
var map, info, wmsmap;
function init() {
map = new OpenLayers.Map("map", {
projection: new OpenLayers.Projection("EPSG:3857"),
units: "m",
maxResolution: 156543.0339,
maxExtent: new OpenLayers.Bounds(
-20037508, -20037508, 20037508, 20037508.34),
displayProjection: new OpenLayers.Projection("EPSG:4326"),
controls: [
new OpenLayers.Control.Navigation(),
new OpenLayers.Control.KeyboardDefaults(),
new OpenLayers.Control.PanZoomBar(),
new OpenLayers.Control.Scale(),
new OpenLayers.Control.Attribution()
]
});
var osmLayer = new OpenLayers.Layer.OSM("OpenStreetMap");
// Test MapServer WMS layer
wmsmap = new OpenLayers.Layer.MapServer( "grib plot", "/cgi-bin/mapserv",
{mode: "map",
map: "wxmap/glmpvis.map", layers: "mosaic", format:'image/png',
transparent:true, reaspect: "true"},
{singleTile: true, ratio: 1, isBaseLayer: false, opacity: 1, visibility: true,
projection: new OpenLayers.Projection("EPSG:3857")});
// add layers to map
map.addLayers([osmLayer, wmsmap]);
// add controls
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.addControl(new OpenLayers.Control.Permalink());
map.addControl(new OpenLayers.Control.MousePosition(
{div: document.getElementById('ex_llmousectl'),
id: "ll_mouse", formatOutput: formatLonlats} ));
map.addControl(new OpenLayers.Control.MousePosition(
{div: document.getElementById('utm_mousectl'),
id: "utm_mouse", prefix: "UTM ", displayProjection: map.baseLayer.projection, numDigits: 0} ));
map.setCenter(new OpenLayers.LonLat(-117, 33).transform(
new OpenLayers.Projection("EPSG:4326"),
map.getProjectionObject()),6);
info = new OpenLayers.Control.WMSGetFeatureInfo({
url: "/cgi-bin/mapserv",
maxFeatures: 1,
title: 'Identify features by clicking',
queryVisible: true,
layers: [wmsmap],
vendorParams: {
map: "wxmap/glmpvis.map",
},
eventListeners: {
getfeatureinfo: function(event) {
map.addPopup(new OpenLayers.Popup.FramedCloud(
"chicken",
map.getLonLatFromPixel(event.xy),
null,
event.text,
null,
true
)); //map.addPopup
} // getfeatureinfo
} // eventListeners
});
map.addControl(info);
info.activate();
function formatLonlats(lonLat) {
var lat = lonLat.lat;
var long = lonLat.lon;
var ns = OpenLayers.Util.getFormattedLonLat(lat);
var ew = OpenLayers.Util.getFormattedLonLat(long,'lon');
return ns + ', ' + ew + ' (' + (Math.round(lat * 100) / 100) + ', ' + (Math.round(long * 100) / 100) + ')';
}
} // end of init
</script>
Y mi mapfile (algunos url y ubicaciones de archivo cambiado por privacidad, pero no es necesario para esta pregunta)
MAP
NAME "testgrib"
IMAGETYPE PNG
EXTENT -14000000 3000000 -7000000 7000000
STATUS ON
SIZE 2145 1377
SHAPEPATH "../shapefiles"
SYMBOLSET "../symbols/symbols35.sym"
FONTSET "../fonts/fonts.list"
DATAPATTERN "^.*$"
IMAGECOLOR 255 255 255
PROJECTION
"init=epsg:3857"
END
WEB
IMAGEPATH "test/img/tmp/ms_tmp/"
IMAGEURL "http://localhost:8080/wxmap/test/img/tmp/ms_tmp/"
METADATA
"wms_title" "WMS Test " ## REQUIRED
"wms_onlineresource" "http://localhost:8080/cgi-bin/mapserv?" ## Recommended
"wms_srs" "ESPG:3857 EPSG:4326 EPSG:4269 EPSG:3978 EPSG:900913" ## Recommended
"wms_abstract" "This text describes my WMS service." ## Recommended
"wms_enable_request" "*"
"ows_sld_enable" "true"
# testing
"wms_feature_info_mime_type" "text/html"
END
END
OUTPUTFORMAT
NAME "png"
DRIVER GD/PNG
MIMETYPE "image/png"
IMAGEMODE RGBA
EXTENSION "png"
TRANSPARENT ON
END
LAYER # GRIB attempt
NAME mosaic
STATUS ON
TYPE RASTER
DATA ../grib/ds.vis.bin
CLASSITEM "[pixel]"
METADATA
"gml_include_items" "all"
"wms_include_items" "all"
END
# testing
DUMP TRUE
HEADER "../templates/test_header.html"
TEMPLATE "../templates/test_body.html"
FOOTER "../templates/test_footer.html"
PROJECTION
"proj=lcc"
"lat_1=25"
"lat_2=25"
"lat_0=0"
"lon_0=-95"
"x_0=0"
"y_0=0"
"a=6371200"
"es=0.0"
"+no_defs"
END
PROCESSING "NODATA=32129"
PROCESSING "BANDS=01"
PROCESSING "SCALE=0,11200"
LABELITEM "[pixel]"
CLASS
NAME "< 1/4"
EXPRESSION ([pixel] < 400 )
STYLE
COLOR 100 0 100
END
END
CLASS
NAME "1/4 - 1/2"
EXPRESSION ([pixel] >= 400 AND [pixel] < 800 )
STYLE
COLOR 200 200 0
END
END
CLASS
NAME "1/2 - 3/4"
EXPRESSION ([pixel] >= 800 AND [pixel] < 1200 )
STYLE
COLOR 150 0 0
END
END
CLASS
NAME "3/4 - 1"
EXPRESSION ([pixel] >= 1200 AND [pixel] < 1600 )
STYLE
COLOR 200 0 200
END
END
CLASS
NAME "1 - 2"
EXPRESSION ([pixel] >= 1600 AND [pixel] < 3200 )
STYLE
COLOR 100 100 0
END
END
CLASS
NAME "2 - 3"
EXPRESSION ([pixel] >= 3200 AND [pixel] < 4800 )
STYLE
COLOR 255 153 0
END
END
CLASS
NAME "3 - 5"
EXPRESSION ([pixel] >= 4800 AND [pixel] < 8000 )
STYLE
COLOR 0 0 200
END
END
CLASS
NAME "5 - 6"
EXPRESSION ([pixel] >= 8000 AND [pixel] < 9600 )
STYLE
COLOR 0 100 0
END
END
CLASS
NAME "6 - 7"
EXPRESSION ([pixel] >= 9600 AND [pixel] < 11200 )
STYLE
COLOR 0 200 0
END
END
CLASS
NAME "> 7"
EXPRESSION ([pixel] >= 11200 )
STYLE
COLOR 250 250 250
END
END
END # End of mosaic layer
END
Y necesito archivos de plantilla aquí para la respuesta: test_header.html
<!-- MapServer Template -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/transitional.dtd">
<html>
<head>
<title>MapServer Template Sample</title>
</head>
cuerpo_prueba.html
<body>
band1: [value_0]
</body>
pie_de_prueba.html
</html>
No estoy seguro de que el test_body.html sea correcto. Pero, el problema principal es que cuando hago clic en la imagen, no pasa nada. Firebug no indica que se envíe ninguna consulta a MapServer para la capa. Inserté un breakpoint en el código WMSGetFeatureInfo en la función getfeatureinfo pero la ejecución no entró en el código.
Como me di cuenta de que tal vez el problema se centraba en no declarar la capa como OpenLayers.Layer.WMS en lugar de MapServer, también intenté crear la capa utilizando OpenLayers.Layer.WMS. Pero, que creó problemas de su propio. No sé muy bien qué pregunta hacer. Puede que pregunte la otra más tarde. Por lo tanto, si alguien tiene alguna idea sobre cómo utilizar esto con la capa Mapserver o tal vez un control diferente, realmente apreciaría la ayuda. Gracias.