4 votos

Obtener la lista de todas las características y valores de la capa raster (GeoServer y OpenLayers2)

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.

2voto

nmtoken Puntos 1096

Intenté modificar el código de http://trac.osgeo.org/openlayers/wiki/GetFeatureInfo pero no logro encontrar una manera de hacerlo.

No puedes usar una solicitud WMS GetFeatureInfo para recuperar un rango de valores, porque solo funciona en una ubicación puntual (en una imagen GetMap). Esta es una limitación de la especificación WMS.

Además, un WMS no te proporciona los valores reales de tus datos de entrada (incluso si es un conjunto de datos ráster), te da una representación de los datos. Si deseas acceder a los valores de datos en un GeoTIFF en GeoServer, necesitarás configurar un servicio WCS.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X