ThinkGeo.com    |     Documentation    |     Premium Support

Mouse click on a LineShape

Hi Howard,


I'm trying to implement a functionality so that the user can click on a LineShape and select it. There are a MouseLeftButtonDown and MouseLeftButtonUp events on the SimpleMarkerOverlay to click on markers. However, I could not find anything similar for lines. My implementation consists of a LayerOverlay (for all the line layers) which contains one or more InMemoryFeatureLayers and each InMemoryFeatureLayer contains individual LineShape Features in its InternalFeatures collection. There is no click event on any of those objects. Is the feature available in the current version? Or am I missing something obvious?


An alternative (aka hacked) solution I can think of would be to get the PointShape of the mouse click position from the Map click event and loop through all the layers to find which object / feature has been clicked (Yikes!).


Thanks for all your help so far. I and my team truly appreciate it!


Regards,


Nirish



Nirish,



Technically, the line shape and the point shape needs to be found by click very accuracy on the shape; it's very hard mouse action. We uto buffer the click point to a MultipolygonShape; then query the specified layer to see which feature is intersecting with the new MultipolygonShape.



I think the following method might help you.

// get the click position.
PointShape clickWorldPosition = e.Position;

// convert to screen point.
ScreenPointF clickScreenPoint = Map1.ToScreenCoordinate(clickWorldPosition);

// 5 is the radius to buffer the click point.
ScreenPointF clickNextScreenPoint = new ScreenPointF(clickScreenPoint.X + 5, clickScreenPoint.Y);

// calculate the distance is world coordinate of the radius.
double worldDistance = ExtentHelper.GetWorldDistanceBetweenTwoScreenPoints(Map1.CurrentExtent, clickScreenPoint, clickNextScreenPoint, (float)Map1.WidthInPixels, (float)Map1.HeightInPixels, GeographyUnit.DecimalDegree, DistanceUnit.Meter);

// calculate the buffer which you need.
MultipolygonShape clickArea = clickWorldPosition.Buffer(worldDistance, GeographyUnit.DecimalDegree, DistanceUnit.Meter);
Collection<Feature> features = layer.QueryTools.GetFeaturesIntersecting(clickArea, ReturningColumnsType.AllColumns);



Please let me know if you have any queries.



Thanks,

Howard



Thanks Howard.  
  
 Using your code, I can get the intersecting (clicked) feature. However, I have to loop through all the InMemoryFeatureLayers on the map and query each layer to get the intersecting feature.  
  
 Additionally, I cannot set the line style of individual lines on the layer. All the lines on the layer inherit the line style given to the layer. Our requirement is to display routes of multiple vehicles on the map. Each route should have its own colour. The user needs to be able to click on a route which should change the style of the line to give the illusion of the line being selected (unless Thinkgeo provide its own line selection logic). However, we don’t want the style of the other routes to change. For such a scenario, do you recommend we have each of those routes (lines) on its own InMemoryFeatureLayer? What is the performance impact of having multiple layers for multiple lines? Will ThinkGeo add a feature to select a line shape on the map any time soon? 
  
 Thanks, 
  
 Nirish 


Nirsh, 
  
 First of all, if we provide a query function on Overlay level, we still use loop to query all the layers in the Overlay. It has the same effect. On the other hand, I recommend adding all the lines in one layer.  
  
 Actually, we support adding different line style for the lines in one layer depending on its column values. 
  
 We have an installed sample which you can find at "\samples\styles\DrawAFeatureBasedOnAValue.xaml". For your scenario, you can use InMemoryFeatureLayer; first of all, add a FeatureSourceColumn in the layer; then set different value such as some specified color names for the column values on the line feature; set ValueStyle for the layer. Silverlight map automatically renders different line with different color depending on the value you set. 
  
 Hope it makes sense. Just let me know if you have any questions. 
  
 Thanks, 
 Howard

Thanks Howard. It works. :)

Nirish, 
  
 Great; please feel free to let us know if you have more questions. 
  
 Thanks, 
 Howard