ThinkGeo.com    |     Documentation    |     Premium Support

Recommended approach for user directed custom drawing

I have a requirement to allow the user to annotate our map after rendering all the normal shape file and in memory layer data.  Basically, at a minimum this would allow them to click-drag a “ink” type line to surround items, draw a rambling directional path, whatever.  The drawing effect is not a polyline such as available with multiple clicks in the track interactive overlay.  Rather this should look on the screen about like it would look if the user printed the map, and used an ink pen to draw lines around stuff of interest, and weaving wavy lines indicating an approximate route or order of operations on that printed map. 



Not sure it would be relevant, but I also need to be able to make these persistent (file system), and it must print along with the map (haven’t even tested printing base map yet).



Bonus points for having extra features like “line ends” (arrows, cross bar, whatever), and perhaps a tool box to select from free form ink style drawing to perhaps constrained circle/ellipse, square/rectangle, perhaps others.  



Given the focus of many of your samples, I was a bit surprised that I found no sample that included this.  I also found no reference searching the board, though that could be due to not knowing the proper search terms.  So, can you point me to or provide a sample that will get me started?  Maybe an article or video?



If no samples or other support exists for such customer user directed drawing, then perhaps a recommendation on approach?  Extend the existing EditInteractiveOverlay or TrackInteractiveOverlay?  Or just a custom drawing layer doing all my own data tracking and drawing?  Or perhaps a common InMemoryFeatureLayer with custom data and custom Line/Area styles, and just handling mouse click/move/etc to build my data dynamically?  



Still searching on my own, but have to get productive work done too.  If I find something relevant, I’ll update here, or if not I’ll await your assistance.  Thanks for all your help.

Hi Russ,



If what I understand is correct, you want to “paste” some pre-defined shapes on the map when we click or drag a shape from a toolbox. Like the insert shapes function in “Word”:



If yes, I think we can try to define some shape features like Rectangle or Circle but this shapes can be generated dynamically by a target point like mouseup point. Then, after the click or drag, we can add this shape feature into  TrackOverlay.TrackShapeLayer or an InmemoryFeatureLayer.



If the shape feature is a kind of image, we also can add the target point as the image feature and then change the TrackOverlay.TrackShapeLayer or an InmemoryFeatureLayer point style as this image.



For instance, if the shape is rectangle, when we click the rectangle button: 

winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(“rectangle”, new Feature(new RectangleShape(65, 30, 95, 15)));

winformsMap1.Refresh(new Overlay[] {winformsMap1.TrackOverlay });



If the shape is image like arrow image,

winformsMap1.TrackOverlay.TrackShapeLayer.InternalFeatures.Add(“arrow”, new Feature(targetpoint));

winformsMap1.TrackOverlay.TrackShapeLayer.DefaultPointStyle = new pointstyle(new geoimage(“arrow.png”));

winformsMap1.TrackOverlay.TrackShapeLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

winformsMap1.Refresh(new Overlay[] { winformsMap1.TrackOverlay });



Please feel free to correct me if any thing misunderstood.

Thanks,

Troy


Sorry for slow reply, I've been off and busy with holiday vacation.


I'm afraid that's not it at all.  Please feel free to reread the initial post.  This is not about placing predefined images on the map.  Rather, the user needs to be able to annotate the map with "hand drawn" indicators, much like a primitive drawing application like MS Paint.  Rectangles and Ellipses and other things as show in your image might be quite well received.  But the requirement is to be able to free-hand draw complex lines on the map.


I've attached an image that shows what I mean.  This was done in Paint Shop by simply clicking at the tail of the arrow, holding the button down as I drag roughly along the path of the arrow, and it puts an arrow "line end" on when I finally release the button.  Paint Shop even smoothed out the jaggies from my unsteady hand dragging the mouse along the path.  The smoothing and even the arrow termination is not a hard requirement, though definitely nice, but the arbitrary customer drawn lines IS required.  


It must also be possible to persist this drawing somehow (file system is the expectation) for future reference. Since it is for short term user reference/context, it is not stored as part of our map data.  Think of it as if you had a map of a city, and you wanted the user to be able to denote a recommended route for a friend to take from  hotel to stadium parking by clicking and dragging along the streets from source to destination.  They then want to be able to bring it up later for reuse, and it must print with the map (to hand to the friend to take with).  


I haven't seen a sample with this functionality, and was also unable to find anything in the forum, or general searching.  And of course the help files don't begin to explain how this might be done.  Can you please provide a sample to get me started?



Hi Russ, 
  
 I see, you want to let customer draw random line on map, that’s should looks like the “Brushes” function on “mspaint” utility. 
  
 If that’s what you want, I think we haven’t met same requirement before but I think we can implement that like this: 
  
 Write code to MouseDown MouseMove and MouseUp event, when mouse down on map, build a line in a inmemoryFeatureLayer, when mouse move, append vertex to this line, when mouse up, release this line and draw it on map. 
  
 Do you think that’s helpful? 
  
 Regards, 
  
 Don

Apparently all I needed to do for the minimal feature requirement is set TrackInteractiveOverlay TrackMode to FreeHand.

Hi Russ, 
  
 Yes you’re right, set TrackMode to FreeHand can draw custom line on map, you can also use trackStarting and trackEnded event to do something for example add a arrow in mouse, adjust what’s the tracked shape and modify it or save it to other layer. 
  
 Because your requirement is like professional service projects so you haven’t found a complete solution in our samples, but if you can split that to some separated technology points, I think you can find related code in our samples. 
  
 Any question please let us know. 
  
 Regards, 
  
 Don

Thank you for the suggestion.  My minimal requirement is that the user can add drawn lines to provide instruction on the map for printing.  This satisfies that requirement.  Additional wish list items include nice arrows or other features on the terminal ends, and possibly other drawing structures such as ellipse/rectangle.  But those are not required for my current deadline, so I’ll circle back to this when there is an opportunity or a requirement to do so.

Hi Russ, 
  
 I think if you want to make the arrow point the direction when mouse move in future, it’s will be a hard feature. 
  
 So please feel free to discuss about your requirement with us, maybe we can give some suggestion about them. 
  
 Regards, 
  
 Don 
  


I haven’t tried, but was thinking along the lines of the “Simplify” functionality.  Use that, take the last 2 points to determine directionality, an place the arrow.  But now still working on requirements, wish list will come later.

Hi Russ, 
  
 Yes that looks viable, it looks you have already thought about how to implement that, so we can talk about them after you complete your requirement. 
  
 Regards, 
  
 Don