ThinkGeo.com    |     Documentation    |     Premium Support

GetLineOnALine issue

I am using MapSuite Desktop Edition 5.0.  I have a multiline shapefile that is UTM.  I have set the MapUnit to Meter.


When I invoke the GetLineOnALine(StartingPoint.LastPoint,percentage) I get the correct returned result.  


If I invoke GetLineOnALine(StartingPoint.LastPoint,<pointshape>), the result starts from the end of the line correctly, but once the <pointshape> is reached, it adds coordinates to the returned line that are NOT part of the original. 


I get the same results if I invoke the function passing two point shapes, one being the end point of the original line.


This issue appears sporatically at the beginning of the line, but always occurs at the end of the line.


This did not appear to be an issue prior to 4.5.168.  Is this a new bug?


Thanks.


Elisa



When I entered the previous message, the upload did not display the quote properly - GetLineOnALine(StartingPoint.LastPoint,pointshape) and GetLineOnALine(endpointshape,pointshape) 
  
 Thanks. 
  
 Elisa

Dear Elisa, 
  
 Yes, we have changed some logic in GetLineOnALine method before we release Map Suite 5.0, but we didn’t meet the problem you mentioned. 
  
 If you didn’t mind, could you please upload a sample with data? That will help us to find the root cause quickly. 
  
 I’m appreciate for your help. 
  
 Any more questions please feel free to let me know. 
  
 Thanks, 
  
 Gary 


I do not have a small sample to upload. This was working prior to 4.5.168.  Passing in a percentage works as before, but passing in a coordinate does not.  It is like the function does not recognize the coordinate.  I have tried passing in the endpoint and my pointshape, and also passing in the pointshape and the endpoint, both of which result in the same incorrect returned result. 
  
 I have been unable to trace where the extra coordinates come from, as there is no line in the file with these coordinates. 
  
 Elisa

Dear Elisa, 
  
 Your situation is possible, because when you pass in a percentage, it’s easy to return the line, but if you pass in a coordinate, we need considered if this point is in the line’s extension cords, if so, we will scale up the line to get the real position of the point and return the result. 
  
 But if without your data or sample, that mean we need use the data we had to tested it, and I’m not sure we can recreate the problem you meet. 
  
 Any more questions please feel free to let me know. 
  
 Thanks, 


I have verified through ArcMap that the pointshape is in fact falls along the line. It is not possible at present to cut out just that area for you to test with.  I suggest you get a point on a line, and then try the function.  It should fail as mine did. 
  
 Elisa

Dear Elisa,  
  
 OK, I will test as you suggestion, and tell you what I find.  
  
 Thanks,  
  
 Gary

Gary: 
  
 Additionally I found that passing in two coordinates that are definitely on the line, can also result in a line that does not pass the SimpleValidation. 
 It would appear that the GetALineOnALine for a MultilineShape does not work at all when passed a coordinate, whether with the StartPoint and a coordinate or with two coordinates. 
  
 This is a critical function in my program and it is a real issue that it was working prior to 4.5.168 and it is no longer working.  Also there was NO documentation in the change log/bug fixes that the logic for this function had been changed, other than to state that “Fixed a bug that the GetLineOnLine method doesn’t work correctly for some cases”.  Should the change log not list of all functions where the logic has changed from the previous version so that users can check that their programs that depend on any of these function still work as expected? 
  
 Elisa

Gary: 
  
 For further clarification: 
  
 visitA is a PointShape, visitB is a PointShape, lineshape2 is a MultilineShape, and visitA and visitB are along lineshape2. 
 The fact that the points are on the lineshape2 has been verified in ArcMap.  MapUnit is Meter. 
  
 The following code results in an line that does not pass SimpleValidation: 
 MultilineShape newshape1 = (MultilineShape)lineshape2.GetLineOnALine(visitA, visitB); 
  
 The following code results in a line that starts at the end of lineshape2, goes to visitB, and then adds additional  
 coordinates to the line that are not part of lineshape2: 
 MultilineShape newshape1 = (MultilineShape)lineshape2.GetLineOnALine(StartingPoint.LastPoint,visitB); 
  
 The following code results in a line that starts at the start of lineshape2, goes to visitA, and then adds additional  
 coordinates to the line that are not part of lineshape2: 
 MultilineShape newshape1 =(MultilineShape)lineshape2.GetLineOnALine(StartingPoint.FirstPoint,visitA); 
  
 If I use GetLineOnALine passing in a distance or percentage, all works as expected. 
  
 Elisa

Dear Elisa, 
  
 Thanks for you post and clarification. 
 I have tested the situation you mentioned: 
 1. NO, I can get the right line. 
 2. Yes, Looks like there is a problem to calculate the distance. I have reported to our product team and will let you know what they find. 
 3. NO, I can get the right line. 
  
 Thanks, and I will let you know as soon as we find the root cause. Please subscribe this post. 
  
 Gary

Dear Elisa, 



Here is the test sample I used. 




            winformsMap1.MapUnit = GeographyUnit.DecimalDegree;

            MultilineShape lineshape2 = new MultilineShape();
            LineShape lineShape = new LineShape();
            lineShape.Vertices.Add(new Vertex(-110.5401246, 53.3934808));
            lineShape.Vertices.Add(new Vertex(-110.539955, 53.39526));
            lineshape2.Lines.Add(lineShape);

            PointShape visitA = new PointShape(-110.540034308832, 53.394428014715);
            //PointShape visitB = new PointShape(-110.5401246, 53.3934808);
            PointShape visitB = lineshape2.GetPointOnALine(StartingPoint.LastPoint, 30);
            //MultilineShape newshape1 = (MultilineShape)lineshape2.GetLineOnALine(visitA, visitB);
            //MultilineShape newshape1 = (MultilineShape)lineshape2.GetLineOnALine(StartingPoint.LastPoint, visitA);
            MultilineShape newshape1 = (MultilineShape)lineshape2.GetLineOnALine(StartingPoint.LastPoint, visitB);

            InMemoryFeatureLayer inMemoryFeatureLayer = new InMemoryFeatureLayer();
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, GeoColor.StandardColors.DarkBlue, 12);
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Green, 8, true);
            inMemoryFeatureLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            inMemoryFeatureLayer.InternalFeatures.Add(new Feature(lineshape2));
            inMemoryFeatureLayer.InternalFeatures.Add(new Feature(visitA));
            inMemoryFeatureLayer.InternalFeatures.Add(new Feature(visitB));

            InMemoryFeatureLayer inMemoryFeatureLayer2 = new InMemoryFeatureLayer();
            inMemoryFeatureLayer2.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = LineStyles.CreateSimpleLineStyle(GeoColor.StandardColors.Red, 3, true);
            inMemoryFeatureLayer2.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
            inMemoryFeatureLayer2.InternalFeatures.Add(new Feature(newshape1));


            LayerOverlay dynamicOverlay = new LayerOverlay();
            dynamicOverlay.Layers.Add(inMemoryFeatureLayer);
            dynamicOverlay.Layers.Add(inMemoryFeatureLayer2);
            winformsMap1.Overlays.Add(dynamicOverlay);

            inMemoryFeatureLayer.Open();
            winformsMap1.CurrentExtent = new RectangleShape(-110.5421, 53.3956, -110.5377, 53.3931);
            inMemoryFeatureLayer.Close();

            winformsMap1.Refresh();



If you can provide a little date of MultiLine and point, I will very grateful. 



Thanks, 



Gary



Gary: 
  
 For the line that does not pass SimpleValidation: 
 visitA = 527409.0012,5591937.5993 
 visitB = 527409.0015,5591903.4342 
  
 lineshape2 = [527409.0029,5591743.9972],[527409.0011,5591948.9876] 
  
 Again, I have verified that both points are along the line with ArcMap. 
  
 If I use the distance from visitA to lineshape endpoint (11.38836M) , and length of 34.16506M  
 I get a line correctly between visitA and visitB. 
  
 Do I need to set some sort of tolerance for the GetLineOnALine to work properly? 
  
 Elisa 


Elisa, 
  
 Thanks for your data, with these data, some problem have appeared, we are working on it but need some time to verify it, we will let you know as soon as possible. 
  
 Any more questions please feel free to let me know.  
  
 Gary

Gary: 
  
 lineshape2: 
 [531765.5641,5587990.6887], 
 [531764.6466,5587981.6415], 
 [531765.9227,5587740.1617], 
 [531766.1198,5587724.0186], 
 [531768.0961,5587718.6375], 
 [531770.3443,5587716.7502], 
 [531773.0998,5587715.7556], 
 [531898.7660,5587716.2844], 
 [532001.0005,5587718.9883] 
  
 visitA: 531996.4820,5587718.8688 
 distance from start point: 501.7359M 
 distance from end point: 4.52014 
  
 MultilineShape newshape1 =  (MultilineShape)lineshape2.GetLineOnALine(StartingPoint.LastPoint, visitA); 
  
 I get the line, but then extra coordinates that do not exist in lineshape2 are added at the end of the line returned. 
  
 All issues seem to be related to calculations starting from the end of the line. 
  
 Elisa 


Elisa, 
  
 Thanks for more information. That will help us resolve this problem faster. 
  
 Gary

Elisa, 
  
 This issue have fixed and you can get the 5.0.28.0 to resolve this problem. 
 Please check the helpdesk 2 hours later to get the new version. 
  
 Thanks, 
 Gary

Gary, 
  
 I’ve been experiencing this problem with the WPF Desktop Edition 5.0.83.0 also, specifically this part quoted below from Elisa: 
  
 Additionally I found that passing in two coordinates that are definitely on the line, can also result in a line that does not pass the SimpleValidation.  
 It would appear that the GetALineOnALine for a MultilineShape does not work at all when passed a coordinate, whether with the StartPoint and a coordinate or with two coordinates.  
 
  
 Could you check if this fix has been applied to the WPF Desktop Edition?

Hello, Daniel 
  
 Thank you for your post, this bug is in Map Suite Core, so it changed for every products. 
  
 Could you please try my sample above? 
  
 If you still meet the problem, maybe it caused by other reason, could you please provide a sample that we can review the code? 
  
 Regards, 
  
 Gary