#1 Tue 13 October 2015 16:07
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
[OpenLayers 3] appartenance d'un point à un polygone
Bonjour
je suis amené à tester l'appartenance d'un point à un polygone
est-ce possible avec ol3 (je n'ai pas trouvé de solution) ou faut-il passer par un développement tiers ?
dans ce cas la librairie turf est-elle la mieux adaptée ?
merci d'avance
Jean-Marie
Hors ligne
#2 Tue 10 November 2015 14:42
- Jean-Marie64
- Participant actif
- Lieu: Pau
- Date d'inscription: 6 Nov 2007
- Messages: 131
Re: [OpenLayers 3] appartenance d'un point à un polygone
exemple d'algorithme qui fonctionne :
/**
* teste si 1 point appartient au polygone
*
* @param lon : longitude du point en projeté
* @param lat : latitude du point en projeté
* @param coordproj : tableau de points en projeté décrivant le polygone
* @returns {Boolean}
*/
isInPolygon=function(lon,lat,coordproj) {
// recherche d'intersection avec les segments
var np=coordproj.length;
var i=0, nbinf= 0, pente=0,pente0=0;
for (var i=0;i<np-1;i++) {
if (coordproj[i+1][1] != coordproj[i][1])
if (((lat >= coordproj[i][1]) && (lat <= coordproj[i+1][1])) || ((lat >= coordproj[i+1][1]) && (lat <= coordproj[i][1]))) {
pente=(coordproj[i+1][1]-coordproj[i][1]);
if ((coordproj[i][0] + (coordproj[i+1][0]-coordproj[i][0]) * (lat-coordproj[i][1]) / pente) < lon) {
nbinf++;
if ((lat == coordproj[i][1]) && (pente*pente0 > 0)) {
nbinf++;
}
}
pente0=pente;
}
}
// recherche d'intersection avec le dernier segment
if (coordproj[0][1] != coordproj[np-1][1])
if (((lat >= coordproj[np-1][1]) && (lat <= coordproj[0][1])) || ((lat >= coordproj[0][1]) && (lat <= coordproj[np-1][1]))) {
pente=(coordproj[0][1]-coordproj[np-1][1]);
if ((coordproj[np-1][0] + (coordproj[0][0]-coordproj[np-1][0]) * (lat-coordproj[np-1][1]) / pente) < lon) {
nbinf++;
if ((lat == coordproj[np-1][1]) && (pente*pente0 > 0)) {
nbinf++;
}
}
}
// recherche sur l'ordonnee du premier point
if ((lat == coordproj[0][1]) && (coordproj[0][0] < lon)) { /* le point a deja ete compte deux fois */
if (((coordproj[0][1] - coordproj[np-1][1])*(coordproj[1][1]-coordproj[0][1])) > 0) {
nbinf++;
}
}
return(nbinf%2==1);
}
Hors ligne