[mapguide-commits] r6937 - in branches/2.4/MgDev/Desktop: MapViewer MapViewer.Desktop
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Thu Aug 16 02:07:48 PDT 2012
Author: jng
Date: 2012-08-16 02:07:48 -0700 (Thu, 16 Aug 2012)
New Revision: 6937
Modified:
branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs
branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs
branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs
branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs
Log:
mg-desktop: Re-work the viewer selection logic. The existing viewer selection logic pre-dates the porting over of MgRenderingService::QueryFeatures to mg-desktop. Again, this is purely a move to ensure consistency of API behaviour between mg-desktop and MapGuide proper. We can now probably eliminate a lot of selection/tooltip code that's currently in MgMapViewerProvider as it is no longer required.
Modified: branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs 2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/IMapViewer.cs 2012-08-16 09:07:48 UTC (rev 6937)
@@ -296,6 +296,13 @@
void SelectByGeometry(MgGeometry geom);
/// <summary>
+ /// Selects features from all selectable layers that intersects the given geometry up to the specified number
+ /// </summary>
+ /// <param name="geom"></param>
+ /// <param name="maxFeatures">The maximum number of features to select. Specify -1 for all features</param>
+ void SelectByGeometry(MgGeometry geom, int maxFeatures);
+
+ /// <summary>
/// Zooms to the initial map view
/// </summary>
void InitialMapView();
Modified: branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs 2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/MgMapViewer.cs 2012-08-16 09:07:48 UTC (rev 6937)
@@ -2089,10 +2089,8 @@
_lastTooltipX = x;
_lastTooltipY = y;
- var layers = _map.GetLayers();
-
- var mapPt1 = ScreenToMapUnits(x - 2, y - 2);
- var mapPt2 = ScreenToMapUnits(x + 2, y + 2);
+ var mapPt1 = ScreenToMapUnits(x - this.PointPixelBuffer, y - this.PointPixelBuffer);
+ var mapPt2 = ScreenToMapUnits(x + this.PointPixelBuffer, y + this.PointPixelBuffer);
var ringCoords = new MgCoordinateCollection();
ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt2.X, mapPt2.Y));
ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt1.X, mapPt2.Y));
@@ -2101,113 +2099,12 @@
ringCoords.Add(_geomFact.CreateCoordinateXY(mapPt2.X, mapPt2.Y)); //Close it
var poly = _geomFact.CreatePolygon(_geomFact.CreateLinearRing(ringCoords), new MgLinearRingCollection());
- for (int i = 0; i < layers.GetCount(); i++)
+ MgTooltipQueryResult tr = _provider.QueryMapFeatures(MgQueryRequestType.Tooltip, null, poly, MgFeatureSpatialOperations.Intersects, "", 1, 4 /* has tooltips */) as MgTooltipQueryResult;
+ if (tr != null)
{
- var layer = layers.GetItem(i);
- var layerGroup = layer.GetGroup();
- //Layer not visible or its parent is not visible
- if (!layer.IsVisible() || (layerGroup != null && !layerGroup.IsVisible()))
- continue;
-
- //No defined tooltips
- if (!_provider.LayerHasTooltips(layer))
- continue;
-
- //Drawing layers have no intelligence
- string fsId = layer.FeatureSourceId;
- if (fsId.EndsWith(MgResourceType.DrawingSource))
- continue;
-
- //Nor do rasters
- if (IsRasterLayer(layer))
- continue;
-
- var objId = layer.GetObjectId();
- var ldfId = layer.GetLayerDefinition();
- var ldfIdStr = ldfId.ToString();
-
- //No tooltip detected
- //if (!_tooltipExpressions.ContainsKey(ldfIdStr))
- if (!_provider.HasTooltips(ldfId))
- continue;
-
- //Make sure geometry property checks out
- var geomName = _provider.GetGeometryProperty(objId);
- var clsDef = layer.GetClassDefinition();
- var props = clsDef.GetProperties();
- if (props.IndexOf(geomName) < 0)
- continue;
-
- var geomProp = props.GetItem(geomName) as MgGeometricPropertyDefinition;
- if (geomProp == null)
- continue;
-
- var trans = _provider.GetMapToLayerTransform(layer, geomProp);
-
- string propName = "QUERYTOOLTIP";
- MgFeatureQueryOptions query = new MgFeatureQueryOptions();
- query.AddComputedProperty(propName, _provider.GetTooltipExpression(ldfId));
- if (trans != null)
- {
- var txPoly = (MgGeometry)poly.Transform(trans);
- query.SetSpatialFilter(geomName, txPoly, MgFeatureSpatialOperations.Intersects);
- }
- else
- {
- query.SetSpatialFilter(geomName, poly, MgFeatureSpatialOperations.Intersects);
- }
-
- MgFeatureReader reader = null;
- reader = layer.SelectFeatures(query);
- try
- {
- if (reader.ReadNext())
- {
- object value = null;
-
- var pt = reader.GetPropertyType(propName);
- switch (pt)
- {
- case MgPropertyType.String:
- value = reader.GetString(propName);
- break;
- case MgPropertyType.Boolean:
- value = reader.GetBoolean(propName);
- break;
- case MgPropertyType.Byte:
- value = reader.GetByte(propName);
- break;
- case MgPropertyType.DateTime:
- value = reader.GetByte(propName);
- break;
- case MgPropertyType.Double:
- case MgPropertyType.Decimal:
- value = reader.GetDouble(propName);
- break;
- case MgPropertyType.Int16:
- value = reader.GetInt16(propName);
- break;
- case MgPropertyType.Int32:
- value = reader.GetInt32(propName);
- break;
- case MgPropertyType.Int64:
- value = reader.GetInt64(propName);
- break;
- case MgPropertyType.Single:
- value = reader.GetSingle(propName);
- break;
- }
-
- if (value != null)
- return value.ToString(); //.Replace("\n", Environment.NewLine);
- }
- }
- finally
- {
- reader.Close();
- }
+ _activeTooltipText = tr.Tooltip;
+ return _activeTooltipText;
}
-
return string.Empty;
}
@@ -2245,11 +2142,17 @@
Clipboard.SetImage(this.GetCurrentImage());
}
+ public void SelectByGeometry(MgGeometry geom)
+ {
+ SelectByGeometry(geom, -1);
+ }
+
/// <summary>
/// Selects features from all selectable layers that intersects the given geometry
/// </summary>
/// <param name="geom"></param>
- public void SelectByGeometry(MgGeometry geom)
+ /// <param name="maxFeatures"></param>
+ public void SelectByGeometry(MgGeometry geom, int maxFeatures)
{
//Don't select if dragging. This is the cause of the failure to render
//multiple selections, which required a manual refresh afterwards
@@ -2260,70 +2163,18 @@
var sw = new Stopwatch();
sw.Start();
#endif
-
- string mapCsWkt = _map.GetMapSRS();
- var layers = _map.GetLayers();
-
- if (ModifierKeys != Keys.Control)
- _provider.ClearSelection(_selection);
-
- for (int i = 0; i < layers.GetCount(); i++)
+ //We will be either wiping or updating the existing selection set
+ MgSelectionQueryResult sel = _provider.QueryMapFeatures(MgQueryRequestType.Selection, null, geom, MgFeatureSpatialOperations.Intersects, "", maxFeatures, (1 | 2)) as MgSelectionQueryResult; //1=Visible, 2=Selectable, 4=HasTooltips
+ if (sel != null)
{
- var layer = layers.GetItem(i);
- if (!layer.Selectable || !layer.IsVisible())
- continue;
-
- string fsId = layer.FeatureSourceId;
- if (fsId.EndsWith(MgResourceType.DrawingSource))
- continue;
-
- //Nor do rasters
- if (IsRasterLayer(layer))
- continue;
-
- //This could be a newly added layer
- _provider.CheckAndCacheGeometryProperty(layer);
-
- var objId = layer.GetObjectId();
- string geomName = _provider.GetGeometryProperty(objId);
-
- //Make sure geometry property checks out
- var clsDef = layer.GetClassDefinition();
- var props = clsDef.GetProperties();
- if (props.IndexOf(geomName) < 0)
- continue;
-
- var geomProp = props.GetItem(geomName) as MgGeometricPropertyDefinition;
- if (geomProp == null)
- continue;
-
- MgFeatureQueryOptions query = new MgFeatureQueryOptions();
- string filter = layer.GetFilter();
- if (!string.IsNullOrEmpty(filter))
- query.SetFilter(filter);
-
- var trans = _provider.GetMapToLayerTransform(layer, geomProp);
- if (trans != null)
- {
- var txGeom = (MgGeometry)geom.Transform(trans);
- query.SetSpatialFilter(geomName, txGeom, MgFeatureSpatialOperations.Intersects);
- }
- else
- {
- query.SetSpatialFilter(geomName, geom, MgFeatureSpatialOperations.Intersects);
- }
-
- MgFeatureReader reader = layer.SelectFeatures(query);
- try
- {
- _selection.AddFeatures(layer, reader, 0);
- }
- finally
- {
- reader.Close();
- }
+ MgSelectionBase newSel = sel.Selection;
+ string newXml = newSel.ToXml();
+ _selection.FromXml(newXml);
}
-
+ else
+ {
+ _selection.FromXml("");
+ }
#if TRACE
sw.Stop();
Trace.TraceInformation("Selection processing completed in {0}ms", sw.ElapsedMilliseconds);
@@ -2642,7 +2493,7 @@
MgGeometry geom = _wktRW.Read(MakeWktPolygon(mapPt1.X, mapPt1.Y, mapPt2.X, mapPt2.Y));
- SelectByGeometry(geom);
+ SelectByGeometry(geom, 1);
}
else if (this.ActiveTool == MapActiveTool.ZoomIn)
{
Modified: branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs 2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer/MgMapViewerProvider.cs 2012-08-16 09:07:48 UTC (rev 6937)
@@ -341,5 +341,47 @@
{
_mapToLayerTransforms[objId] = trans;
}
+
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="queryType"></param>
+ /// <param name="layerNames"></param>
+ /// <param name="filterGeom"></param>
+ /// <param name="selectionVariant"></param>
+ /// <param name="featureFilter"></param>
+ /// <param name="maxFeatures"></param>
+ /// <param name="layerAttributeFilter"></param>
+ /// <returns></returns>
+ public abstract MgQueryMapFeaturesResult QueryMapFeatures(MgQueryRequestType queryType, MgStringCollection layerNames, MgGeometry filterGeom, int selectionVariant, string featureFilter, int maxFeatures, int layerAttributeFilter);
+
+ protected MgTooltipQueryResult MakeTooltip(string tooltip) { return new MgTooltipQueryResult(tooltip); }
+
+ protected MgSelectionQueryResult MakeSelectionResult(MgSelectionBase sel) { return new MgSelectionQueryResult(sel); }
}
+
+ public abstract class MgQueryMapFeaturesResult
+ {
+
+ }
+
+ public class MgTooltipQueryResult : MgQueryMapFeaturesResult
+ {
+ internal MgTooltipQueryResult(string tooltip) { this.Tooltip = tooltip; }
+
+ public string Tooltip { get; private set; }
+ }
+
+ public class MgSelectionQueryResult : MgQueryMapFeaturesResult
+ {
+ internal MgSelectionQueryResult(MgSelectionBase newSelection) { this.Selection = newSelection; }
+
+ public MgSelectionBase Selection { get; private set; }
+ }
+
+ public enum MgQueryRequestType
+ {
+ Tooltip,
+ Selection
+ }
}
Modified: branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs
===================================================================
--- branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs 2012-08-16 07:28:53 UTC (rev 6936)
+++ branches/2.4/MgDev/Desktop/MapViewer.Desktop/MgDesktopMapViewerProvider.cs 2012-08-16 09:07:48 UTC (rev 6937)
@@ -159,5 +159,14 @@
{
return _renderSvc.RenderMap(_implMap, (MgdSelection)selection, format);
}
+
+ public override MgQueryMapFeaturesResult QueryMapFeatures(MgQueryRequestType queryType, MgStringCollection layerNames, MgGeometry filterGeom, int selectionVariant, string featureFilter, int maxFeatures, int layerAttributeFilter)
+ {
+ var fi = _renderSvc.QueryFeatures(_implMap, layerNames, filterGeom, selectionVariant, featureFilter, maxFeatures, layerAttributeFilter);
+ if (queryType == MgQueryRequestType.Tooltip)
+ return MakeTooltip(fi.GetTooltip());
+ else
+ return MakeSelectionResult(fi.GetSelection());
+ }
}
}
More information about the mapguide-commits
mailing list