openlayers ol3 linestring getLength не возвращает ожидаемое значение

Я использую getLength для получения длины строки.

Для того же сегмента: 1- при использовании инструмента измерения карты Google я получаю 228 м 2- при использовании инструмента измерения геопортала IGN я получаю 228 м 3- при использовании e.feature.getGeometry().getLength() я получаю 330 м

Вот плоские координаты: e.feature.getGeometry().getFlatCoordinates() : [571382.4214041593, 5723486.068714521, 571593.8175605105, 5723741.65502785]

in 4326: [5.132815622245775, 45.644023326845485, 5.134714626228319, 45.64562844964627]

Когда я проверяю положение координат на карте ol3 или google, я получаю те же точки. Разница должна исходить из расчета...

Я что-то пропустил, и мне не следует использовать метод getLength? Пожалуйста, дайте мне какое-то направление, если вы думаете, что это не проблема.


person Alexandre Mélard    schedule 09.04.2015    source источник


Ответы (2)


geometry.getLength() возвращает длину в проекции вида карты, которая обычно представляет собой сферическую меркаторскую проекцию. Сферические меркаторские расстояния растягиваются со скоростью 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, а не на сфере.

person Community    schedule 16.04.2015

Приведенный выше ответ верен, хотя, если вы пытаетесь получить длину 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);
person larsemil    schedule 10.10.2017