#1 Thu 27 April 2017 16:29
- snike
- Participant actif
- Date d'inscription: 29 Mar 2007
- Messages: 114
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 Thu 27 April 2017 19:19
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 Thu 27 April 2017 22:16
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 Tue 02 May 2017 13:06
- snike
- Participant actif
- Date d'inscription: 29 Mar 2007
- Messages: 114
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 Wed 03 May 2017 00:25
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