ThinkGeo.com    |     Documentation    |     Premium Support

Measure in meters

 Hi,


I have a bug with measures in meters, I made a sample test case specially for that.


I know a line makes around 140 meters and with Google Earth mesure tool it is ok:



 


But in MapSuite it says around 217 meters wether with the measure tool or a GetLength on the line:



 


Maybe am I doing something wrong ?


I'm providing here my test case so you can check it out:



4shared.com/rar/2KUL65am/MapSuite_Basic_Project.html


Thank you for your help.



Gautier,


 You are not doing anything wrong. You are getting two different measurement values because Google Earth is using the globe and Google Map is on the Spherical Mercator projection en.wikipedia.org/wiki/Mercator_projection that greatly distorts distances (and areas). That is why the distance you find on Google Map (217 m) is far larger than what you find on Google Earth (140 m), the value from Google Earth being closer to the reality.


 This is an issue that generates plenty of debates and misundestanding for people unfamiliar with GIS and projection issues as you can read in this post for example gis.thinkgeo.com/Support/Discussion...fault.aspx


 We even created a sample in the Code Community that addresses that subject, Measurement Decimal Degrees wiki.thinkgeo.com/wiki/Map_Suite_We...on_Samples. I invite you to read the referenced post and look at this sample to understand a little bit better the situation. Thank you.



Thanks to your sample I managed to make my area calculation on the server work with the help of proj4 projection.  Now I have to make the measure tools work but they are on the client side in javascript so I don't know how to do that, here is my code:  
var OnMapCreated = function (map) {
    // Gestion des mesures
    handleMeasurements = function (feature) {
        var units = feature.units;
        var measure = feature.measure;
        measure = measure.toFixed(3);
        if (feature.order == 1) {
            html = String.format("Longueur: {0} {1}", measure.toString(), units.toString());
        }
        else {
            html = String.format("Surface: {0} {1}<sup>2<sup>", measure.toString(), units.toString());
        }
        if (feature.geometry.CLASS_NAME.indexOf('LineString') > -1) {
            var length = feature.geometry.components.length;
            lonLat = { lon: feature.geometry.components[length - 1].x, lat: feature.geometry.components[length - 1].y };
        }
        else {
            var length = feature.geometry.components[0].components.length;
            lonLat = { lon: feature.geometry.components[0].components[length - 2].x, lat: feature.geometry.components[0].components[length - 2].y };
        }
        var size = new OpenLayers.Size(450, 200);
        var popup = new OpenLayers.Popup.FramedCloud('DistancePopup', lonLat, size, html, null, true);
        popup.isAlphaImage = true; // fix IE 6.0 problem
        this.map.addPopup(popup);
    }
}
  Can you help please ?



Gautier,


 For client side Javascript programming, this is not my area of expertise either. Let me get some help on that and on monday, I will get back with you. Thank you.



Any news on this ? 
  
 Thank you.

Gautier,


  This is the suggestion I got from the Web team. They say that no more JS code is required, to get a more realistic distance when you have your map in Spherical Mercator. You need to enable the "Geodesic" property of the MeasureMapTool. The Web Edition will do the calculation based on geodetic math, not planar math.


The C# code should be:


  Map1.MapTools.MeasureMapTool.Enabled = true;


 Map1.MapTools.MeasureMapTool.Geodesic = true;


Thank you.



This works great ! 
  
 Thank you very much for your help.

Gautier,


  You are welcome. Good luck on your project.