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);
我正在使用 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);