ThinkGeo.com    |     Documentation    |     Premium Support

LineShape Constructor(Generic IEnumerable) Example

I'm looking for an example of creating a LineShape using the following constructor:


LineShape  Constructor(Generic IEnumerable)


I'm hoping that I can pass in a collection of vertices and have a multi-point LineShape created.  I can't get it to work, so I either don't understand this constructor or I've got more issues.


Pulling relevant parts of the code (and somewhat simplifying):


Definition:


public Collection<Vertex> trackHistory;


Adding vertices:


trackHistory.Add(new Vertex(latitude, longitude));


Adding to layer:


if (trackHistory.Count > 2) {
Feature feature = new Feature(new LineShape(trackHistory));
trackInMemoryFeatureLayer.InternalFeatures.Add("Test", feature);
}



Update:  Just realized that I had the lat/long reversed.  Still can't get it to work, but I'm debugging down a different path now.


I'm new.



Nate,


Thanks for your input and post. Following code snippets shows you three ways to create a line shape based on constructor:



LineShape lineshape1 = new LineShape();
lineshape1.Vertices.Add(new Vertex(0.2, 0.5));
lineshape1.Vertices.Add(new Vertex(0.8, 60.2));
lineshape1.Vertices.Add(new Vertex(1.8, 70.1));
double length1 = lineshape1.GetLength(GeographyUnit.Meter, DistanceUnit.Meter);


Collection<Vertex> verteices1 = new Collection<Vertex>();
verteices1.Add(new Vertex(0.2, 0.5));
verteices1.Add(new Vertex(0.8, 60.2));
verteices1.Add(new Vertex(1.8, 70.1));
LineShape lineShape2 = new LineShape(verteices1);
double length2 = lineShape2.GetLength(GeographyUnit.Meter, DistanceUnit.Meter);


Vertex[] verteices2 = new Vertex[3];
verteices2[0] = new Vertex(0.2, 0.5);
verteices2[1] = new Vertex(0.8, 60.2);
verteices2[2] = new Vertex(1.8, 70.1);
LineShape lineShape3 = new LineShape(verteices2);
double length3 = lineShape3.GetLength(GeographyUnit.Meter, DistanceUnit.Meter);

Any more questions just feel free to let me know.


Thanks.


Yale

 



I like the second option for my case, but I’m getting an exception that I don’t understand.  I tried searching the forum for the error message, but I keep getting a forum error. :D 
  
 “The given key was not present in the dictionary.” 
  
 I believe this is happening at the layer refresh call. 
  
 Is there something obvious that this usually means?

Nate, 
  
 This exception is always showing you are trying to get an object which has already been removed from the collection. 
  
 Could you show me a comparatively complete sample to recreate your problem? It would be very convenient to find and fix the problem. 
  
 Any more questions just feel free to let me know. 
  
 Thanks. 
  
 Yale 


Since this thread has taken a turn, I’ll repost under a new title.  See you there…

Nate, 



I also cannot reproduce your problem exactly, here is my code below: 



 
private void button1_Click(object sender, EventArgs e) 

Collection<Vertex> verteices1 = new Collection<Vertex>(); 
verteices1.Add(new Vertex(0.2, 0.5)); 
verteices1.Add(new Vertex(0.8, 60.2)); 
verteices1.Add(new Vertex(1.8, 70.1)); 
LineShape lineShape2 = new LineShape(verteices1); 
Feature feature = new Feature(lineShape2); 
InMemoryFeatureLayer inMemoryLayer = new InMemoryFeatureLayer(); 
inMemoryLayer.InternalFeatures.Add("Test", feature); 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.FillSolidBrush.Color = GeoColor.FromArgb(100, GeoColor.StandardColors.RoyalBlue); 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle.OutlinePen.Color = GeoColor.StandardColors.Blue; 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle.OuterPen = new GeoPen(GeoColor.FromArgb(200, GeoColor.StandardColors.Red), 5); 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolPen = new GeoPen(GeoColor.FromArgb(255, GeoColor.StandardColors.Green), 8); 
inMemoryLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 

LayerOverlay staticOverlay = new LayerOverlay(); 
staticOverlay.Layers.Add("InMemoryFeatureLayer", inMemoryLayer); 
winformsMap1.Overlays.Add(staticOverlay); 
winformsMap1.CurrentExtent = new RectangleShape(0, 100, 100, 0); 
winformsMap1.Refresh(); 




According to my test, it can work fine, I cannot find out any exceptions, please review your code or send us your sample so that we can reproduce this problem exactly, 



Thanks, 



Scott,