3 votos

¿Utilizar OpenLayers WMSGetFeatureInfo en la capa Mapserver?

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.

4voto

Celso Puntos 66

Tengo mapas como el tuyo trabajando y la única diferencia que pude detectar es que yo uso OpenLayers.Capa.WMS en lugar de OpenLayers.Layer.MapServer .

Dado que GetFeatureInfo es una operación del protocolo WMS OL correctamente no debe aplicarse a las capas de Mapserver (aunque Mapserver es totalmente capaz de hablar WMS). Intente crear la capa de la siguiente manera:

var wmsmap = new OpenLayers.Layer.WMS( "grib plot",
 "/cgi-bin/mapserv.exe?map=wxmap/glmpvis.map",
     {layers: 'mosaic',
      srs: 'YOUR SRS HERE',
      format: 'image/png',
      isBaseLayer: false,
      visibility: true
     }
);

1voto

Robert Koritnik Puntos 731

Creo que tu problema se debe a que no has configurado un proxy en OpenLayers.

La solicitud para obtener información sobre las características se realiza mediante AJAX (OpenLayers.Request.GET). Si su servidor no está configurado para aceptar peticiones multidominio, deberá utilizar un script (el proxy) para realizar la petición.

Utilizando un script proxy el flujo es el siguiente:

  • Usted carga su página web desde su servidor.
  • Si realiza una petición AJAX, ésta se envía al script proxy de su servidor.
  • El script realiza la petición "real" al servidor deseado y devuelve los datos.

Asegúrese también de que su capa está configurada para poder ser consultada si utiliza un servidor WMS.

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