Adding methods for getting geodesic measures from geometries. Assuming geometries can be transformed into Geographic/WGS84, getGeodesicLength and getGeodesicArea should return reasonable 'on the ground' metrics. Use getLength and getArea for the planar metrics. r=crschmidt (closes #1819)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@9248 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
@@ -52,5 +52,41 @@ OpenLayers.Geometry.Curve = OpenLayers.Class(OpenLayers.Geometry.MultiPoint, {
|
||||
return length;
|
||||
},
|
||||
|
||||
/**
|
||||
* APIMethod: getGeodesicLength
|
||||
* Calculate the approximate length of the geometry were it projected onto
|
||||
* the earth.
|
||||
*
|
||||
* projection - {<OpenLayers.Projection>} The spatial reference system
|
||||
* for the geometry coordinates. If not provided, Geographic/WGS84 is
|
||||
* assumed.
|
||||
*
|
||||
* Returns:
|
||||
* {Float} The appoximate geodesic length of the geometry in meters.
|
||||
*/
|
||||
getGeodesicLength: function(projection) {
|
||||
var geom = this; // so we can work with a clone if needed
|
||||
if(projection) {
|
||||
var gg = new OpenLayers.Projection("EPSG:4326");
|
||||
if(!gg.equals(projection)) {
|
||||
geom = this.clone().transform(projection, gg);
|
||||
}
|
||||
}
|
||||
var length = 0.0;
|
||||
if(geom.components && (geom.components.length > 1)) {
|
||||
var p1, p2;
|
||||
for(var i=1, len=geom.components.length; i<len; i++) {
|
||||
p1 = geom.components[i-1];
|
||||
p2 = geom.components[i];
|
||||
// this returns km and requires lon/lat properties
|
||||
length += OpenLayers.Util.distVincenty(
|
||||
{lon: p1.x, lat: p1.y}, {lon: p2.x, lat: p2.y}
|
||||
);
|
||||
}
|
||||
}
|
||||
// convert to m
|
||||
return length * 1000;
|
||||
},
|
||||
|
||||
CLASS_NAME: "OpenLayers.Geometry.Curve"
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user