ThinkGeo.com    |     Documentation    |     Premium Support

GetPointOnALine and DecimalDegree issue

Hello,


I think there is a bug in GetPointOnALine() method when the line is in DecimalDegree unit. If I try the following code I get different distance informations ( 0,05 <> 0.0627)


 Any ideas?



        Dim oPShape As ThinkGeo.MapSuite.Core.PointShape = oLineShapeGleisstrecke.GetPointOnALine(ThinkGeo.MapSuite.Core.StartingPoint.FirstPoint, 0.050000000000000003, ThinkGeo.MapSuite.Core.GeographyUnit.DecimalDegree, ThinkGeo.MapSuite.Core.DistanceUnit.Kilometer)
        Dim odist As Double = oLineShapeGleisstrecke.GetLineOnALine(ThinkGeo.MapSuite.Core.StartingPoint.FirstPoint, oPShape).GetLength(ThinkGeo.MapSuite.Core.GeographyUnit.DecimalDegree, ThinkGeo.MapSuite.Core.DistanceUnit.Kilometer)

 



Thomas,


Thanks for your post and questions.


As my understanding, we probably should try the following code snippet to verify as the 0.05 is decimal degrees and the 0.0627 is Kilometer, please feel free to let me know if anything I am wrong.




Dim oPShape As ThinkGeo.MapSuite.Core.PointShape = oLineShapeGleisstrecke.GetPointOnALine(ThinkGeo.MapSuite.Core.StartingPoint.FirstPoint, 0.050000000000000003, ThinkGeo.MapSuite.Core.GeographyUnit.DecimalDegree, ThinkGeo.MapSuite.Core.DistanceUnit.Kilometer)


Dim odist As Double = oLineShapeGleisstrecke.GetLineOnALine(ThinkGeo.MapSuite.Core.StartingPoint.FirstPoint, oPShape).GetLength(ThinkGeo.MapSuite.Core.GeographyUnit.Kilometer, ThinkGeo.MapSuite.Core.DistanceUnit.Kilometer)


Any more questions please feel free to let me know.


Thanks.


Yale

 



Yale, 
  
 from your question I can see my error. I think I have to convert the distance parameter I pass into GetPointOnALine() method from Meter to DecimalDegree. Is there a method I can do this? 
  
 Thomas

Yale, 
  
 it is confusing. I made some test and still can’t explain the result. 
  
 OK, Lets try again: 
  
 1. I have a Lineshape in DecimalDegree 
 2. I get a Point on that Lineshape at the distance of 0.5 km using the GetPointOnALine() method 
 3. I get a line section of my Lineshape starting point is the first point and end point is the point at distance of 0.5 km I get in step 2 
 4. I check the length of my line section I get in step 3. Expecting a length of 0.5 km but getting a length of 0.06273 km 
  
 What’s the problem? 
 Thomas

Yale, 
  
 it is confusing. I made some test and still can’t explain the result. 
  
 OK, Lets try again: 
  
 1. I have a Lineshape in DecimalDegree 
 2. I get a Point on that Lineshape at the distance of 0.5 km using the GetPointOnALine() method 
 3. I get a line section of my Lineshape starting point is the first point and end point is the point at distance of 0.5 km I get in step 2 
 4. I check the length of my line section I get in step 3. Expecting a length of 0.5 km but getting a length of 0.06273 km 
  
 What’s the problem? 
 Thomas

Thomas,


Thanks for your post and question.


I tried the following code snippet and it seems work fine, am I misunderstanding anything?



LineShape shape = new LineShape();
shape.Vertices.Add(new Vertex( 0, 0));
shape.Vertices.Add(new Vertex( 1, 1));
PointShape  p= shape.GetPointOnALine(StartingPoint.FirstPoint, 0.5, GeographyUnit.DecimalDegree, DistanceUnit.Kilometer);
LineShape segLine = (LineShape)shape.GetLineOnALine(new PointShape(0,0),p);
double distance = segLine.GetLength(GeographyUnit .DecimalDegree, DistanceUnit.Kilometer);

Any more questions please feel free to let me know.


Thanks.


Yale

 



Yale,


I have attached a small sample where you can see the difference between input and output distance. The difference is 38,5m on a length of 500m.


Thomas



GetDistanceInDG.zip (82.9 KB)

Thomas, 
  
 Thanks for your sample, I understand your mean fully, according to my tests, obviously the result has a difference distance 38.5m from the 500m. I have added this to our issue list and our development team will fix the problem soon, if there are any updates I will let you know, 
  
 Thanks, 
  
 Scott,

Thomas, 
  
   We are taking a look at this as Scott mentioned but I have a feeling it has to do with measuring lines in decimal degrees.  Decimal degree lengths and areas are somewhat meaningless and it is always risky to try and do calculations in feet or meters without first projecting the the decimal degree shapes first.  Even though both the line and the get point on line might use the same math the calculate the distance the results can be different.  We need to see how the routing is calculating things.  There are scenarios that I can think of that would return strange results like the ones you see.  In any event we will see what is going on but I do suggest that you consider switching to a projection that uses feet or meters if you concerned about being accurate when dealing with lengths and areas of shapes. 
  
 David

Thomas, 
  
 Sorry for the inconvenience, right now we still don’t have a perfect way to solve this issue. Somehow, we are able to make the result more acceptable by modifying the GetAPointOnLine method when DecimalDegree is set to MapUnit, in this case, the difference of length we get between the input and output is lowered from 0.3 to 0.000001 after this modification.  
  
 Please get the latest version from the DailyBuild of Development branch to try again, 
  
 Any more questions please let me know, 
  
 Thanks, 
  
 Scott,