using System;
using OSGeo.MapServer;
/**
*
Title: Mapscript query map example.
* Description: A C# based mapscript example to use the arribute query an highlight the results.
* @author Tamas Szekeres szekerest@gmail.com
* @version 1.0
*/
///
/// A C# based mapscript example to use the arribute query an highlight the results.
///
class DrawQuery
{
public static void usage()
{
Console.WriteLine("usage: QueryMap {mapfile} {query string} {outfile} {-zoom}");
System.Environment.Exit(-1);
}
public static void Main(string[] args)
{
if (args.Length < 3 || args.Length > 4) usage();
bool ZoomToResults = (args.Length == 4 && args[3] == "-zoom");
mapObj map = new mapObj(args[0]);
Console.WriteLine ("# Map layers " + map.numlayers + "; Map name = " + map.name);
QueryByAttribute(args[1], map, ZoomToResults);
map.querymap.status = mapscript.MS_ON;
map.querymap.color.setRGB(0,0,255);
map.querymap.style = (int)MS_QUERYMAP_STYLES.MS_HILITE;
try
{
imageObj image = map.drawQuery();
image.save(args[2],map);
}
catch (Exception ex)
{
Console.WriteLine( "QueryMap: ", ex.Message );
}
}
private static bool IsLayerQueryable(layerObj layer)
{
if ( layer.type == MS_LAYER_TYPE.MS_LAYER_TILEINDEX )
return false;
if(layer.template != null && layer.template.Length > 0) return true;
for(int i=0; i 0)
return true;
}
return false;
}
public static void QueryByAttribute(string qstring, mapObj map, bool zoomToResults)
{
Console.WriteLine("\nPerforming QueryByAttribute:");
try
{
layerObj layer;
rectObj query_bounds = null;
for (int i = 0; i < map.numlayers; i++)
{
layer = map.getLayer(i);
if (layer.connection != null && IsLayerQueryable(layer))
{
Console.WriteLine("Layer [" + i + "] name: " + layer.name);
BuildQuery(layer, qstring);
// zoom to the query results
using (resultCacheObj results = layer.getResults())
{
if (results != null && results.numresults > 0)
{
// calculating the extent of the results
if (query_bounds == null)
query_bounds = new rectObj(results.bounds.minx, results.bounds.miny,
results.bounds.maxx, results.bounds.maxy,0);
else
{
if (results.bounds.minx < query_bounds.minx) query_bounds.minx = results.bounds.minx;
if (results.bounds.miny < query_bounds.miny) query_bounds.miny = results.bounds.miny;
if (results.bounds.maxx > query_bounds.maxx) query_bounds.maxx = results.bounds.maxx;
if (results.bounds.maxy > query_bounds.maxy) query_bounds.maxy = results.bounds.maxy;
}
}
}
}
}
// setting the map extent to the result bounds
if (zoomToResults)
map.setExtent(query_bounds.minx, query_bounds.miny, query_bounds.maxx, query_bounds.maxy);
}
catch (Exception e)
{
Console.WriteLine("QueryByAttribute: " + e.Message);
}
}
private static void BuildQuery(layerObj layer, string qstring)
{
if (layer != null && layer.map != null)
{
/*layer.open();
string qs = "";
string att = "";
for (int i=0; i < layer.numitems; i++)
{
if (qs == "")
{
qs = "(";
att = layer.getItem(i);
}
else
{
qs += " OR ";
}
qs += "'[" + layer.getItem(i) + "]'='" + qstring + "'";
}
qs += ")";
layer.close();*/
string qs = qstring;
string att = null;
Console.WriteLine("Query string: " + qs);
try
{
layer.queryByAttributes(layer.map, att, qs, 1);
}
catch (Exception e)
{
Console.WriteLine("BuildQuery: " + e.Message);
}
}
}
}