.. _query-as:

How-to display a raster layer and query as a vector layer
=========================================================

Raster services have limitations. WMS can only support a point-based
query and not polygon or attribute based queries. However, vector layers
can be more complicated to style and less consistently displayed between
different clients. GeoMoose provides a way to have services
automatically refer to a vector layer for query operations when using a
raster layer.

An example with parcels
-----------------------

This is a cut down example based on the layers in the desktop demo's
mapbook:

.. code:: xml

        <!-- this is the WFS / Vector definition of the layer -->
        <map-source name="vector-parcels" type="mapserver-wfs">
            <file>./demo/parcels/parcels.map</file>
            <!-- this tells the WFS service to get parcel features -->
            <param name="typename" value="ms:parcels"/>
            <layer name="parcels" selectable="true">
                <!-- this is where the select template is set. -->
                <template name="select"><![CDATA[
                    <div class="select-result">
                        <div class="select-label">
                            {{ properties.OWNER_NAME }}
                        </div>
                        <div class="select-action">
                            <div style="padding: 2px">
                                <a onClick="app.zoomToExtent([{{ properties.boundedBy | join }}])" class="zoomto-link">
                                    <i class="fa fa-search"></i>
                                    {{ properties.PIN }}
                                </a>
                            </div>
                        </div>
                    </div>
                ]]></template>
            </layer>
        </map-source>

        <!-- This is the WMS version of the parcels layer. -->
        <map-source name="parcels" type="mapserver" up="true" down="true" title="Parcels">
            <file>./demo/parcels/parcels.map</file>

            <!-- this is where @query-as is set... -->
            <layer name="parcels" status="on" query-as="vector-parcels/parcels">
                <!-- here is the identify template -->
                <template name="identify" src="./templates/parcels.html" />
            </layer>
        </map-source>

How this is processed internally
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The parcels layer is served as WMS. But if you look at the
``<layer name="parcels">`` it has a query-as attribute set to
``vector-parcels/parcels``. So a few things happen:

  1. When the Select service goes to execute a query, it looks for layers with a template
  which has the name attribute set to ``select``.  The ``parcels/parcels`` layer will
  not have one but because its query-as attribute is set to
  ``vector-parcels/parcels`` it will look for a 'select' template there
  first. It will find the template there and then use
  ``vector-parcels/parcels`` (WFS) instead of ``parcels/parcels`` (WMS) to
  execute the select query.

  2. When the Identify service goes to execute a
  query, it will NOT find the identify template in
  ``vector-parcels/parcels`` but WILL find it in parcels/parcels and use
  WMS to execute that query.

Only ``parcels/parcels`` needs to be turned on! GeoMoose will
automatically pick the best source with which to perform the query.

Other notes
~~~~~~~~~~~

The query-as also accepts a list of paths like in the catalog. It could
be possible to refer to multiple vector sources for querying. Or even
other raster sources for identify-queries.

AGS mapsources can also use the above "query-as" technique to allow query
operations.  In this case the target of the query-as could be a ags-vector mapsource.
