ThinkGeo.com    |     Documentation    |     Premium Support

Different lineshape length after projection

Hello,


if I project a lineshape from EPSG 31467 to OpenStreetMap the length of the lineshape is different to the original length. Is this a bug of Lineshape.getLength() method?


I have attached a sample where you can see this issue. We use version 5.0.115.0.


Thomas



LineShapeLengthProj4.zip (44.1 KB)

Hello ThinkGeo,


need infos on this issue. Our customer is waiting.


Thanks



I’m not ThinkGeo, but I can answer this.   When you change projections for any geometry, the area and the length values with change to reflect the change in cartesian coordinates of the projected geometry.   In fact, even within the same projection, a geometry of exactly the same relative lon/lat coordinates will have a different length and area from it’s original projected values if the object is translocated to a different place within the projection. 
  
 For instance, if I have a geographic square that is one degree high and one degree wide, I will have one are value when using the UTM Zone 16 projection when my square is centered on 87 Degrees west than when it is centered on 90 degrees west. 
  
 Within our application, we have our own function to get Area and Length of a geometry.   In that function, we create mercator projection with its center of accuracy at the centroid of the geometry, and return the projected geometry’s length or area.   Not as handy, but a geometry of the same relative geograhic coordinates will generate the same area and length values no matter where it lies within my display projection.

Hello Ted, 
  
 thanks for information. I’m not a GIS expert and I did not understand all of your infos. Does this mean I allways have to reproject the geometry to its original projection before I use getLength() method? 
  
 Thomas

Yes, I believe that is the case.

Thomas, 
  
 I think Ted told you the exact result for your issue, under the different projections the length will be a little different, I got the EPSG string below for the project 31467: 
  
 +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs 
  
 So this project is based on a decimal degree map unit and the OpenStreetMap’s map unit is meter, the calculation is different between them for get length method. Ted told you a workaround for your issue I think you can take a try for that, 
  
 Thanks, 
  
 Scott,

 Thomas,


  I would like to add some corrections to what Scott just replied. Your projection DHDN Gauss Kruger is in meters (not in decimal degrees as Scott erroneously stated) as Open Street Map. DHDN Gauss Kruger is using Transversal Mercator and has the parameters set for the area in Germany as opposed to Spherical Mercator (projection used for Open Street Map) that has parameters for the world and presents heavy distortion at higher latitudes en.wikipedia.org/wiki/Mercator_projection. That is why to get a more accurate distance measurements, you can use the local DHDN projection when you are dealing with locations in Germany. You can see in the sample below where I use a line across Franckfort.


Your case is similar to one of our sample codes Measurements in Deciaml Degrees wiki.thinkgeo.com/wiki/Map_S...al_Degrees


I suggest you also look at that sample to better understand the issue.


 


 


 


 



//Points from Open Street Map values
LineShape lineShape = new LineShape();
lineShape.Vertices.Add(new Vertex(956258,6469464));
lineShape.Vertices.Add(new Vertex(971365,6468473));

//Distance in Spherical Mercator = 15.13 km
double dist1 = lineShape.GetLength(GeographyUnit.Meter, DistanceUnit.Kilometer);

Proj4Projection proj4 = new Proj4Projection();
//Google Map uses Spherical Mercator as Open Map Street
proj4.InternalProjectionParametersString = Proj4Projection.GetGoogleMapParametersString();
//DHDN / 3-degree Gauss-Kruger zone 3 
//spatial-reference.org/ref/epsg/31467/
//The original proj4 string is:
//"+proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=3500000 +y_0=0 +ellps=bessel +datum=potsdam +units=m +no_defs"
proj4.ExternalProjectionParametersString = Proj4Projection.GetEpsgParametersString(31469); //"+proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500140 +y_0=140 +ellps=bessel +datum=potsdam +units=m +no_defs"; 

proj4.Open();
LineShape lineShape_proj = (LineShape)proj4.ConvertToExternalProjection(lineShape);
proj4.Close();

//Distance in DHDN/ 3 degree Gauss Kruger zone 3 = 9.74 (more accurate)
double dist2 = lineShape_proj.GetLength(GeographyUnit.Meter, DistanceUnit.Kilometer);