/// <summary> /// method to do the real server side process for info tool. /// </summary> public override void Process() { //get pixel tolerance from url of client side. int pixelTolerance = System.Convert.ToInt32(HttpContext.Current.Request[PixelToleranceKey]); MapControlModel model = MapControlModel.GetModelFromSession(); model.SetMapSize(MapAlias, MapWidth, MapHeight); //extract points from url of client side. System.Drawing.Point[] points = ExtractPoints(DataString); //do searching and get results back MultiResultSetFeatureCollection mrfc = RetrieveInfo(points, pixelTolerance); IEnumerator resultEnum = mrfc.GetEnumerator(); //retrieve the selected feature from collection while (resultEnum.MoveNext()) { IResultSetFeatureCollection irfc = (IResultSetFeatureCollection)resultEnum.Current; IFeatureEnumerator ftrEnum = irfc.GetFeatureEnumerator(); while (ftrEnum.MoveNext()) { Feature ftr = (Feature)ftrEnum.Current; //create a html table to display feature info and stream back to client side. CreateInfoTable(ftr); irfc.Close(); mrfc.Clear(); break; } break; } }
// search through all tables to find objects that intersect // the states bordering KS private void menuItemSearchMultipleTables_Click(object sender, System.EventArgs e) { try { Cursor.Current = Cursors.WaitCursor; // find states that intersect KS // then combine them and search all layers within // also uses search for feature Feature fKS = _catalog.SearchForFeature("usa", MapInfo.Data.SearchInfoFactory.SearchWhere("State='KS'")); SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchIntersectsFeature(fKS, IntersectType.Geometry); IResultSetFeatureCollection fc = _catalog.Search("usa", si); MapInfo.FeatureProcessing.FeatureProcessor fp = new MapInfo.FeatureProcessing.FeatureProcessor(); Feature f = fp.Combine(fc); si = MapInfo.Data.SearchInfoFactory.SearchWithinFeature(f, ContainsType.Centroid); MultiResultSetFeatureCollection mfc = _catalog.Search(_catalog.EnumerateTables(TableFilterFactory.FilterMappableTables()), si); // set map view to show search results _map.SetView(f); ShowSearchGeometry(f.Geometry); // show results as selection SelectFeatureCollection(fc); } finally { Cursor.Current = Cursors.Default; } }
/// <summary> /// Get a MultiFeatureCollection containing features in all layers falling into the tolerance of the point. /// </summary> /// <param name="points">points array</param> /// <param name="pixelTolerance">pixel tolerance used when searching</param> /// <returns>Returns a MultiResultSetFeatureCollection object</returns> protected MultiResultSetFeatureCollection RetrieveInfo(Point[] points, int pixelTolerance) { if (points.Length != 1) { return(null); } MapControlModel model = MapControlModel.GetModelFromSession(); //get map object from map model MapInfo.Mapping.Map map = model.GetMapObj(MapAlias); if (map == null) { return(null); } //creat a layer filter to include normal visible layers for searching IMapLayerFilter layerFilter = MapLayerFilterFactory.FilterForTools( map, MapLayerFilterFactory.FilterByLayerType(LayerType.Normal), MapLayerFilterFactory.FilterVisibleLayers(true), "MapInfo.Tools.MapToolsDefault.SelectLayers", null); ITableEnumerator tableEnum = map.Layers.GetTableEnumerator(layerFilter); //return if there is no valid layer to search if (tableEnum == null) { return(null); } System.Drawing.Point center = points[0]; //create a SearchInfo with a point and tolerance SearchInfo si = MapInfo.Mapping.SearchInfoFactory.SearchNearest(map, center, pixelTolerance); (si.SearchResultProcessor as ClosestSearchResultProcessor).Options = ClosestSearchOptions.StopAtFirstMatch; //retrieve all columns si.QueryDefinition.Columns = null; MapInfo.Geometry.Distance d = MapInfo.Mapping.SearchInfoFactory.ScreenToMapDistance(map, pixelTolerance); (si.SearchResultProcessor as ClosestSearchResultProcessor).DistanceUnit = d.Unit; (si.SearchResultProcessor as ClosestSearchResultProcessor).MaxDistance = d.Value; //do search MultiResultSetFeatureCollection mrfc = MapInfo.Engine.Session.Current.Catalog.Search(tableEnum, si); return(mrfc); }