web-dev-qa-db-fra.com

OpenLayers 3: Comment calculer la distance entre 2 points?

Avec OpenLayers 3, comment puis-je déterminer la distance entre deux points de la projection de Mercator sphérique (SRID: 3857)?

Je sais que distanceTo a été utilisé dans OpenLayers 2

point1.distanceTo(point2)

J'ai parcouru le OpenLayers 3 docs , mais je ne trouve rien de semblable ...

13
sfletche

Vous pouvez utiliser l'objet Sphere pour calculer la distance entre deux coordonnées comme celle-ci:

var distance = ol.sphere.WGS84.haversineDistance([0,0],[180,0]); 
//20037508.34 meters 

Sphere fournit également divers algorithmes permettant de calculer la distance, tels que cosinus, équirectangulaire, etc. Vous pouvez également créer l’objet Sphère avec le rayon d’un ellipsoïde différent.

Je ne sais pas pourquoi les documents ne sont pas en ligne, mais vous pouvez vérifier les méthodes disponibles à partir du code source de l'objet sphère: https://github.com/openlayers/ol3/blob/master/src/ol/ sphere.js

Personnellement, je pense que consulter le code source est le meilleur moyen de trouver des réponses à propos de OpenLayers3;)

17
markov00

J'utilise une solution assez simple. J'instancie un objet ol.geom.LineString entre les deux points et calcule la longueur de la ligne:

        this.distanceBetweenPoints = function(latlng1, latlng2){
            var line = new ol.geom.LineString([latlng1, latlng2]);
            return Math.round(line.getLength() * 100) / 100;
        };

Vous pouvez ensuite obtenir une valeur lisible en utilisant une certaine mise en forme:

        this.formatDistance = function(length) {
            if (length >= 1000) {
                length = (Math.round(length / 1000 * 100) / 100) +
                ' ' + 'km';
            } else {
                length = Math.round(length) +
                ' ' + 'm';
            }
            return length;
        }

EDIT: Nouvelle méthode de calcul

En réalité, la distance peut être fausse en ce qui concerne la projection que vous utilisez. Nous avons eu une assez longue discussion à ce sujet sur le github de ol3, vous pouvez le voir ici: https: // github. com/openlayers/ol3/numéros/3533

Pour résumer, vous devez utiliser cette fonction pour obtenir le calcul exact:

/**
 * 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;
}
5
Alexandre Mélard

Juste pour ajouter une option supplémentaire. Ce n'est pas ol3 dépendant.

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;
}
2
Jonatas Walker

J'ai écrit celui-ci pour moi-même. J'espère que ça vous sera utile.

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;
}
1
MSS