Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoRezo vous rend service, faites un don!

Merci à tous pour votre fidélité.

L'équipe GeoRezo

#1 jeu. 27 avril 2017 16:29

snike
Membre
Date d'inscription: 29 mars 2007
Messages: 91

OpenLayers 3 ou 4 : Intersection de polygones

Bonjour,

  La fonction forEachFeatureIntersectingExtent permet de retourner l'ensemble des polygone dans l'extent, c'est à dire dans un rectangle.
  Par contre si ma sélection est un polygone, quelle fonction utiliser ?

  J'ai bien la fonction forEachLayerAtPixel qui permet de pointer un polygone, mais si je dois prendre tous les points de ma sélection (polygone) je ne m'en sortirais pas, non ?

Merci par avance.

Hors ligne

 

#2 jeu. 27 avril 2017 19:19

FlorianD
Moderateur
Date d'inscription: 22 déc. 2016
Messages: 64
Site web

Re: OpenLayers 3 ou 4 : Intersection de polygones

Bonjour,

Pour chaque type de géométrie, il existe une méthode intersectsExtent(extent).

Pour retrouver l'ensemble des objets géographiques d'une donnée vectorielle dans un polygone, on peut réaliser une boucle sur tous les objets :

        var polygone = new ol.geom.Polygon([coordinates]);
        var features = vecteur.getSource().getFeatures();

        for (var i = 0 ; i < features.length; i++){
            if(polygone.intersectsExtent(features[i].getGeometry().getExtent())){
                ...
            }
        }

En espérant que cela vous aide.

Florian

Hors ligne

 

#3 jeu. 27 avril 2017 22:16

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 sept. 2005
Messages: 792
Site web

Re: OpenLayers 3 ou 4 : Intersection de polygones

Bonjour,

OpenLayers 3 & 4 n'incluent pas de fonctions pour faire une sélection de polygones par le dessin d'un autre polygone. Il va vous falloir vous appuyer sur JSTS. J'ai une démo avec ce cas https://rawgit.com/webgeodatavore/ol3-e … anced.html mais avec des points. Il vous faudra l'adapter pour choisir quelle règle choisir c'est à dire si les polygones sont sélectionnés si ils sont entièrement inclus dans celui(ceux) dessiné(s), s'il les recouvrent,...
Selon la complexité de vos polygones (nombre de vertex en particulier) et leur nombre, il peut être plus intéressant de faire cette opération via un serveur cartographique ou un service côté serveur que vous avez crée.

Je peux me tromper mais "polygone.intersectsExtent(features[i].getGeometry().getExtent())" proposé en réponse ne permet de récupérer que l'intersection de rectangle englobant à rectangle englobant.


Cordialement

Thomas

Hors ligne

 

#4 mar. 02 mai 2017 13:06

snike
Membre
Date d'inscription: 29 mars 2007
Messages: 91

Re: OpenLayers 3 ou 4 : Intersection de polygones

Bonjour,

  Je confirme que pour moi intersectsExtent permet de connaitre les parcelles dans un rectangle (extent). J'ai vérifier avec un simple ligne, il y a pas mal de parcelles en trop.
  Mais cette fonction peut m'aider pour faire ce que je veux. Mon idée :
1. je récupère les parcelles de l'extent, ce qui permet de limiter mes calculs
2. je retire de cette sélection les parcelles qui ne répondent pas à :
  2a. un des sommet au minimum est dans mon polygone de sélection (fct forEachFeatureAtPixel)
  2b. un des segment au minimum croise un segment de mon polygone de sélection (fct à faire)

A votre avis ça peut fonctionner ou j'oublie quelque chose ?

Cordialement

Hors ligne

 

#5 mer. 03 mai 2017 00:25

FlorianD
Moderateur
Date d'inscription: 22 déc. 2016
Messages: 64
Site web

Re: OpenLayers 3 ou 4 : Intersection de polygones

Bonjour Snike et Thomas,

Effectivement, intersectsExtent correspond bien aux données comprises dans un rectangle et ce n'est donc pas précis pour la sélection d'objets par le dessin d'un polygone.

Snike, je ne sais pas exactement quel est ton objectif, mais comme le suggère Thomas, il est préférable d'utiliser JSTS pour considérer les intersections de données.

Si tu veux absolument suivre ton raisonnement, après vos premiers messages, je me suis amusé à réaliser quelques tests. Si tu dessines un polygone, tu peux obtenir les coordonnées de cette géométrie via getCoordinates(). Cette fonction retourne les coordonnées dans plusieurs arrays d'un array. Fais un premier loop pour récupérer les arrays des coordonnées de ton polygone.

Ensuite, pour chaque objet de l'extent intersecté, tu vérifies que les coordonnées du polygone (via un second loop) intersectent la géométrie de chaque objet : feature.getGeometry().intersectsCoordinate(coordpolygone[i])

Si plusieurs points de ton polygone dessiné intersectent le même objet, ce dernier sera retourné plusieurs fois. L'idée est de les stocker dans un array et de nettoyer les doublons.

Cette démarche fonctionne mais elle n'est pas adaptée à tous les types de dessins (cercles, lignes, etc). Et l'utilisation de JSTS est bien plus simple (cf exemple de Thomas).

Snike, je n'ai malheureusement pas le code sous la main mais n'hésite pas à me demander plus de détails. Je tâche de t'envoyer tout cela la semaine prochaine.

Florian

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |