#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
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
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
Hors ligne
#4 Mon 09 November 2015 22:39
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
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