openlayers ol3 linestring getLength 未返回预期值

openlayers ol3 linestring getLength not returning expected value

我正在使用 getLength 检索线串长度。

对于同一细分: 1- 使用 google 地图测量工具时,我得到 228m 2- 使用 IGN geoportail 测量工具时,我得到 228m 3- 当我使用 e.feature.getGeometry().getLength() 时,我得到 330m

平面坐标如下: e.feature.getGeometry().getFlatCoordinates() : [571382.4214041593, 5723486.068714521, 571593.8175605105, 5723741.65502785]

在 4326 中: [5.132815622245775、45.644023326845485、5.134714626228319、45.64562844964627]

当我检查 ol3 或 google 地图上的坐标位置时,我得到了相同的点。差异必须来自计算...

我是不是错过了什么,我不应该使用 getLength 方法?如果您认为这不是问题,请给我一些指导。

geometry.getLength() returns 地图视图投影中的长度,通常为球面墨卡托投影。球形墨卡托距离以 1/cos(latitude) 的速率拉伸;在你的例子中:228/330 ~ cos(45.64).

获取真实球面距离:

var geometry = feature.getGeometry();

alert (geometry.getLength());

// get points of geometry (for simplicity assume 2 points)
var coordinates = geometry.getCoordinates();

// transform points from map projection (usually spherical mercator) to WGS84
var mapProjection = map.getView().getProjection();
var t1 = ol.proj.transform(coordinates[0], mapProjection, 'EPSG:4326');
var t2 = ol.proj.transform(coordinates[1], mapProjection, 'EPSG:4326');

// create sphere to measure on
var wgs84sphere = new ol.Sphere(6378137); // one of WGS84 earth radius'

// get distance on sphere
var dist = wgs84sphere.haversineDistance(t1, t2);

alert (dist);

为了获得更高的精度,您必须在 WGS84 椭球体而不是球体上进行测量。

上面的答案是正确的,尽管如果你试图获得具有多个位置的 LinePoint 的长度,它只会在第一个位置之间计算。

这里是关于使用具有多个位置的 LinePoints 的一个小补充:

var geometry = feature.getGeometry();


// get points of geometry (for simplicity assume 2 points)
var coordinates = geometry.getCoordinates();

// transform points from map projection (usually spherical mercator) to WGS84
var mapProjection = map.getView().getProjection();

// create sphere to measure on
var wgs84sphere = new ol.Sphere(6378137); // one of WGS84 earth radius'

var dist = 0;
//loop through all coordinates
for(var i = 0; i < coordinates.length -1; i++) {
    var t1 = ol.proj.transform(coordinates[i], mapProjection, 'EPSG:4326');
    var t2 = ol.proj.transform(coordinates[i+1], mapProjection, 'EPSG:4326');
    // get distance on sphere
    dist += wgs84sphere.haversineDistance(t1, t2);
}
alert(dist);