[mapserver-users] Query feature using openlayers and mapserver

P Kishor punk.kish at gmail.com
Thu Oct 29 08:44:09 EDT 2009


On Thu, Oct 29, 2009 at 1:13 AM, Aypes <apestgas at yahoo.com.hk> wrote:
>
> Dear all,
>
> I might open a topic in a wrong forum, because I do not know whether I
> should ask this question in Mapserver or OpenLayers forum. If I did, I feel
> sorry about that.
>
> I want to query the layer with using openlayers. However, I do not know how
> to 'call' the templates from mapfile to the html file.I have found topics
> about query using mapserver and openlayers, but I have still no idea how to
> code in html file. The query function is fine when using mapserver alone.
>
> In the mapfile, I have put metadata into web like this:
> WEB
>        HEADER "/ms4w/Apache/htdocs/web_header.html"
>        FOOTER "/ms4w/Apache/htdocs/web_footer.html"
>        EMPTY  "empty.html"
>        Metadata
>        "wms_title" "WMS"
>        "wms_onlineresource"
> "http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/Apache/htdocs/test.map&"
>        "wms_srs"       "EPSG:4269"
>        "wms_feature_info_mime_type" "text/html"
>        END
>        template "/ms4w/Apache/htdocs/web.html"
>        imagepath "/ms4w/Apache/htdocs/tmp/"
>        imageurl "/tmp/"
> END
> PROJECTION
>        "init=epsg:4269"
> END
>
> And in the layer, data from postgresql postgis (with attribute ID) was used
> with metadata:
> Name "Abc"
> metadata
>                "wms_title" "Abc"
>                "wms_srs" "EPSG:4269"
> End
> .....
>
> I also have put header footer in layer and template in the class
> Class
>        Name "abc"
>        Template "/ms4w/Apache/htdocs/query.html"
>             ......
> END
>
> The code in html file:
> var layer = new OpenLayers.Layer.MapServer( "ABC WMS",
>
> "http://localhost/cgi-bin/mapserv.exe?map=c:/ms4w/Apache/htdocs/test.map&",
>        {layers: 'Abc'} );
> I tried {layers: 'Abc', mode: 'query', params ='ID'}  but it did not work.
>
> I found an example of query: http://www.co.sweet.wy.us/mapserver/map.html
> I want to query the layer by a click instead of dragging and a new window
> come out to display information.
> How can I make this in html file?
>
> Furthermore, I find many examples using new OpenLayers.Layer.WMS. But when I
> use it, it displays nothing. I can only use new OpenLayers.Layer.MapServer
> to display map. What is the problem?
>


Here is how I did it, and it worked for me (test for typing errors)

Step 1: In the map file

Step 1a: WEB

    WEB
    ,,

        # WMS server settings
        METADATA
            ..
            "wms_feature_info_mime_type"    "text/html"
        END
    END # WEB

Step 1b: LAYER to be queried

    LAYER
        NAME 'layer_name'
        ..

        METADATA
           ..
            'wms_include_items' "FiEld_NaMe"   # field name is possibly
                                               # case-sensitive in the case of
                                               # shape files
        END # METADATA

        DUMP true
        HEADER "/absolute/path/to/template_header.html"
        TEMPLATE "/absolute/path/to/template_body.html"
        FOOTER "/absolute/path/to/template_footer.html"
    END # LAYER

Step 2: In your HTML templates

Step 2a: in template_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>

Step 2b: in template_body.html

  <body>
    <b>FiEld_NaMe:</b> [FiEld_NaMe]
  </body>

Step 2c: in template_footer.html

</html>

Step 3: In your HTML file with OpenLayers code

        map.addControl(
            new OpenLayers.Control.WMSGetFeatureInfo(
                function() {
                    return {
                        url: "/url/to/mapserv",
                        maxFeatures: 1,
                        title: 'Identify features by clicking',
                        queryVisible: true,
                        layers: [layer_name],
                        vendorParams: {
                            map: "/absolute/path/to/mapfile"
                        },
                        eventListeners: {
                            getfeatureinfo: function(event) {
                                map.addPopup(
                                    new OpenLayers.Popup.FramedCloud(
                                        "chicken",
                                        map.getLonLatFromPixel(event.xy),
                                        null,
                                        event.text,
                                        null,
                                        true
                                    ),
                                    true
                                ); // map.addPopup
                            } // getfeatureinfo
                        } // eventListeners
                    } // return
                }
            )
        ).activate();



-- 
Puneet Kishor http://www.punkish.org
Carbon Model http://carbonmodel.org
Charter Member, Open Source Geospatial Foundation http://www.osgeo.org
Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor
Nelson Institute, UW-Madison http://www.nelson.wisc.edu
-----------------------------------------------------------------------
Assertions are politics; backing up assertions with evidence is science
=======================================================================
Sent from Madison, WI, United States


More information about the mapserver-users mailing list