OpenLayers 3: Как рассчитать расстояние между 2 точками?
используя OpenLayers 3, Как я могу определить расстояние между двумя точками в сферической проекции Меркатора (SRID: 3857)?
Я знаю, что distanceTo
использовался в OpenLayers 2
point1.distanceTo(point2)
Я посмотрел через OpenLayers 3 docs, но я не нашел ничего подобного...
4 ответов
вы можете использовать объект Sphere для вычисления расстояния между двумя координатами следующим образом:
var distance = ol.sphere.WGS84.haversineDistance([0,0],[180,0]);
//20037508.34 meters
сфера также предоставляет различные алгоритмы для вычисления расстояния,такого как Косинус, равнонаправленный и т. д. Вы также можете создать объект сферы с радиусом другого эллипсоида.
Я не знаю, почему документы не в сети, но вы можете проверить методы, доступные из исходного кода объекта сферы: https://github.com/openlayers/ol3/blob/master/src/ol/sphere.js
Я лично считаю, что просмотр исходного кода-лучший способ найти ответы об OpenLayers3;)
Я использую довольно простое решение. Я создаю экземпляр ol.геометрия.Линия объекта между двумя точками и вычислить длину строки:
this.distanceBetweenPoints = function(latlng1, latlng2){
var line = new ol.geom.LineString([latlng1, latlng2]);
return Math.round(line.getLength() * 100) / 100;
};
затем вы можете получить читаемое значение, используя некоторые форматирования:
this.formatDistance = function(length) {
if (length >= 1000) {
length = (Math.round(length / 1000 * 100) / 100) +
' ' + 'km';
} else {
length = Math.round(length) +
' ' + 'm';
}
return length;
}
EDIT: новый метод расчета
на самом деле, расстояние может быть ложным относительно проекции, которую вы используете. У нас была довольно длинная дискуссия об этом на GitHub ol3, вы можете это увидеть там: https://github.com/openlayers/ol3/issues/3533
подводя итог, вам нужно использовать эту функцию, чтобы получить точный расчет:
/**
* format length output
* @param {ol.geom.LineString} line
* @return {string}
*/
export default function mapFormatLength(projection, line) {
var length;
var coordinates = line.getCoordinates();
length = 0;
for (var i = 0, ii = coordinates.length - 1; i < ii; ++i) {
var c1 = ol.proj.transform(coordinates[i], projection, 'EPSG:4326');
var c2 = ol.proj.transform(coordinates[i + 1], projection, 'EPSG:4326');
length += mapConst.wgs84Sphere.haversineDistance(c1, c2);
}
var output;
if (length > 1000) {
output = (Math.round(length / 1000 * 100) / 100) +
' ' + 'km';
} else {
output = (Math.round(length * 100) / 100) +
' ' + 'm';
}
return output;
}
просто добавить еще один вариант. Это не зависит от ol3.
function toRad(x) {return x * Math.PI / 180;}
function SphericalCosinus(lat1, lon1, lat2, lon2) {
var R = 6371; // km
var dLon = toRad(lon2 - lon1),
lat1 = toRad(lat1),
lat2 = toRad(lat2),
d = Math.acos(Math.sin(lat1)*Math.sin(lat2) + Math.cos(lat1)*Math.cos(lat2) * Math.cos(dLon)) * R;
return d;
}
Я написал это для себя, я надеюсь, что это будет полезно, он возвращает расстояние в metters:
function getCoordsDistance(firstPoint, secondPoint, projection) {
projection = projection || 'EPSG:4326';
length = 0;
var sourceProj = mapObj.getView().getProjection();
var c1 = ol.proj.transform(firstPoint, sourceProj, projection);
var c2 = ol.proj.transform(secondPoint, sourceProj, projection);
var wgs84Sphere = new ol.Sphere(6378137);
length += wgs84Sphere.haversineDistance(c1, c2);
return length;
}