Estoy tratando de recuperar una lista de todos los valores de una capa de ráster (GeoTIFF) en GeoServer (2.5.x).
Intenté modificar el código de http://trac.osgeo.org/openlayers/wiki/GetFeatureInfo pero no logro encontrar la forma de hacerlo. Creé un control personalizado que utiliza OpenLayers.Handler.Box
como entrada. Esto me devuelve los límites correctos (coordenadas del rectángulo seleccionado) pero ¿cómo envío los límites a GeoServer WMS?
Puedo codificar un módulo de Python para enviar los límites y extraer los valores del ráster y devolverlos a mi aplicación web, pero pensé que esto debe ser posible desde OpenLayers ¿Alguien tiene un ejemplo de cómo extraer un rango de valores de un ráster usando GeoServer y OpenLayers?
Hasta ahora, mi código es:
function findLayerClick(event) {
mouseLoc = map.getLonLatFromPixel(event.xy);
layerlist = 'mylayer';
//GetCoverage
var url = sec.getFullRequestString({
REQUEST: "GetFeatureInfo",
EXCEPTIONS: "application/vnd.ogc.se_xml",
BBOX: map.getExtent().toBBOX(),
X: event.xy.x,
Y: event.xy.y,
INFO_FORMAT: 'text/plain',
QUERY_LAYERS: layerlist,
FEATURE_COUNT: 50,
WIDTH: map.size.w,
HEIGHT: map.size.h},
"http://localhost:8080/geoserver/wms");
var request = OpenLayers.Request.GET({
url: url,
callback: extractFeatures
});
}
function extractFeatures(e) {
console.log(e);
}
Mi mapa, capas y el control que maneja la selección de cuadro:
function init() {
wgs84 = new OpenLayers.Projection('EPSG:4326');
googleProjection = new OpenLayers.Projection('EPSG:900913');
var options = {
controls: [
new OpenLayers.Control.LayerSwitcher(),
new OpenLayers.Control.Navigation({zoomWheelEnabled: true, handleRightClicks: true}),
new OpenLayers.Control.PanZoom(),
new OpenLayers.Control.DragPan(),
new OpenLayers.Control.ScaleLine({maxWidth:200})
],
div: 'map-canvas',
theme: null,
units: 'm',
projection: googleProjection,
displayProjection: wgs84,
maxResolution: 'auto',
eventListeners: {
'movestart': function(e) {
},
'zoomend': function(e) {
zoomBoxControl.deactivate();
}
}
};
map = new OpenLayers.Map(options);
var ghyb = new OpenLayers.Layer.Google(
"Google Physical",
{
type: google.maps.MapTypeId.TERRAIN,
minZoomLevel: 1,
numZoomLevels: 11,
sphericalMercator: true,
projection: 'EPSG:900913'
}
);
//esta es la capa de ráster
sec = new OpenLayers.Layer.WMS(
"mylayer",
"http://localhost:8080/geoserver/wms",
{layers: 'mylayer', format:'image/png', transparent:'true'},
{opacity: 1.0, visibility: true, displayInLayerSwitcher: true, isBaseLayer: false}
);
OpenLayers.Util.extend(control, {
draw: function () {
this.drag = new OpenLayers.Handler.Box( control,
{"done": this.notice},
{keyMask: OpenLayers.Handler.MOD_CTRL});
this.drag.activate();
},
notice: function (bounds) {
mybounds = bounds;
console.log(mybounds);
var lowerLeft = map.getLonLatFromPixel(new OpenLayers.Pixel(mybounds.left, mybounds.bottom));
var upperRight = map.getLonLatFromPixel(new OpenLayers.Pixel(mybounds.right, mybounds.top));
mybounds = new OpenLayers.Bounds();
mybounds.extend(lowerLeft);
mybounds.extend(upperRight);
//findLayerClick(mybounds);
return(true);
}
});
}
La función findLayerClick
devuelve un valor válido de un píxel clicked pero necesito la lista (tabla, array o lo que sea) de valores en el rango seleccionado. Espero que alguien pueda ayudarme.