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 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

 

Pied de page des forums

Powered by FluxBB