/****************************************************************************** * $Id$ * * Project: MapServer * Purpose: A C# based mapscript example to use the atribute query and * highlight the results. * Author: Tamas Szekeres, szekerest@gmail.com * ****************************************************************************** * Copyright (c) 1996-2008 Regents of the University of Minnesota. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies of this Software or works derived from this Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *****************************************************************************/ using System; using OSGeo.MapServer; /// /// 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) { Console.WriteLine(""); 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 (query_bounds != null) { if (zoomToResults) { map.setExtent(query_bounds.minx, query_bounds.miny, query_bounds.maxx, query_bounds.maxy); map.scaleExtent(1.2, 0, 0); // increasing the visible area Console.WriteLine("Current map scale: 1:" + (int)map.scaledenom); } } else Console.WriteLine("The query returned 0 results ..."); } 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); } } } }