banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Thu 05 November 2015 17:27

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

[OpenLayers 3] projection d'un point sur une droite

Bonjour

connaissant une ligne (composée de ses 2 coordonnées) et un point A n'appartenant pas à cette ligne
je voudrais trouver le point projeté de A sur cette ligne (projection orthogonale)
les coordonnées étant exprimées en degrés

y-a-t'il une librairie qui permet d'obtenir ce point projeté ?

merci d'avance pour vos pistes

Jean-Marie

Hors ligne

 

#2 Sun 08 November 2015 22:08

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 946
Site web

Re: [OpenLayers 3] projection d'un point sur une droite

Salut,

Il y a des cas où ce n'est pas possible de projeter othogonalement le point sur la ligne (sachant qu'en fait votre ligne est une courbe, rotondité de la terre oblige...) Pour cela, voir l'illustration en pièce jointe.

A priori, ce qui se rapproche le plus de votre besoin,  c'est le module de Turf "Point on line" (une bibliothèque JavaScript de traitement de données) http://turfjs.org/static/docs/module-tu … -line.html

Quel est la question qu'il faut résoudre concrètement au final?


Cordialement

Thomas


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#3 Mon 09 November 2015 15:41

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [OpenLayers 3] projection d'un point sur une droite

bonjour

merci pour cette librairie

la figure ci-jointe explique mon besoin :

je connais un point A [-1,47.25] et je veux connaitre le point projeté (en vert)

sur une ligne dont les 2 points extrêmes ont pour coordonnées [-3,48.5] et [4.5,45.6]

il s'agit d'une projection "orthogonale"

si je cherche ce point projeté en java avec la méthode line.nearestColinearPoint(pt) de la librairie GeoTools,
celle-ci me donne un résultat correct soit  [-0.83966,47.66466]

si j'utilise Turf.js (exp :http://jsfiddle.net/p5x3qe0h/6/) j'obtiens un point très éloigné de la ligne soit [-3.46824,47.59465]

je dois faire une erreur quelque part mais je ne vois pas où

Jean-Marie


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#4 Mon 09 November 2015 22:39

Dof
Participant assidu
Lieu: Grenoble
Date d'inscription: 28 Oct 2009
Messages: 317
Site web

Re: [OpenLayers 3] projection d'un point sur une droite

Bonjour,
Il me semble que "point on line" de turf.js donne le noeud de le ligne le plus prohe du point. Si cette ligne ne possède que deux  points, il va en choisir un des 2...

Hors ligne

 

#5 Mon 09 November 2015 22:58

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 946
Site web

Re: [OpenLayers 3] projection d'un point sur une droite

Bonjour,

Honnêtement, je n'ai pas creusé avec Turf.js pour ce cas précis. La bibliothèque Turf.js est globalement bien mais dans certains cas, elle montre ses limites. Il vaut peut être mieux s'appuyer sur son alternative, JSTS, plus avancée (plus lourde à utiliser également)
Personnellement, j'arrive à obtenir un résultat probant avec JSTS avec la fonction `jsts.operation.distance.DistanceOp.nearestPoints`.
je vous laisse explorer maintenant que vous avez les cartes en main.

Cordialement

Thomas

Hors ligne

 

#6 Tue 10 November 2015 14:28

Jean-Marie64
Participant actif
Lieu: Pau
Date d'inscription: 6 Nov 2007
Messages: 131

Re: [OpenLayers 3] projection d'un point sur une droite

Bonjour

merci beaucoup pour vos réponses et pour l'orientation sur JSTS

ce que j'ai fait en attendant est de reprendre le code source relatif à la méthode nearestColinearPoint  de GeoTools en java
et de le porter en javascript (voir ci-dessous)

cordialement

Jean-marie


/**
* classe permettant de créer une ligne à partir de  2 points et de retourner le point projeté
* source : http://opensourcejavaphp.net/java/geoto … .java.html
*/
Line = function () {
    this.slope=Number.NaN; // slope
    this.x0=Number.NaN; // longitude
    this.y0=Number.NaN; // latitude
   
  /**
   * Sets a line through the specified point. The line will continues
   * toward infinity after the point.
   *
   * @param x1 Ordinate <var>x</var> of the first point.
   * @param y1 Ordinate <var>y</var> of the first point.
   * @param x2 Ordinate <var>x</var> of the second point.
   * @param y2 Ordinate <var>y</var> of the second point.
   *
   * @see #setLine(Point2D,Point2D)
   * @see #setLine(Line2D)
   */
  this.setLine=function(x1, y1, x2, y2) {
    this.slope = (y2-y1)/(x2-x1);
    this.x0    = x2 - y2/this.slope;
    this.y0    = y2 - this.slope*x2;
    if (isNaN(this.x0) && this.slope==0) {
        // Occurs for horizontal lines right on the x axis.
        this.x0 = Number.POSITIVE_INFINITY;
    }
    if (isNaN(this.y0) && Double.isInfinite(this.slope)) {
        // Occurs for vertical lines right on the y axis.
        this.y0 = Number.POSITIVE_INFINITY;
    }
  }
  /**
   * Returns the nearest point on this line from the specified point.
   *
   * @param  point An arbitrary point.
   * @return The point on this line which is the nearest of the specified {@code point}.
   */
  this.nearestColinearPoint=function(x,y) {
    if (Number.isFinite(this.slope)) {
        x = ((y-this.y0)*this.slope + x) / (this.slope*this.slope+1);
        return [x, x*this.slope+this.y0];
    } else {
        return [this.x0, point.getY()];
    }
  }
}

Hors ligne

 

Pied de page des forums

Powered by FluxBB