Gérer les fonctionnalités qui se chevauchent dans OpenLayers

14

Si les utilisateurs créent une entité surfacique qui chevauche complètement une autre, comme celle-ci…

… Il n'y a aucun moyen de sélectionner la fonction intérieure, c'est-à-dire celle qui se chevauche. J'utilise actuellement un simple SelectFeaturecomme celui-ci:

var select = new OpenLayers.Control.SelectFeature(
  [this.annotationLayer, this.controlPointsLayer], { 
    hover: true,
    renderIntent: "temporary"
    }
);
this.map.addControl(select);
select.activate();

Mais évidemment, je ne peux l'obtenir que pour sélectionner la fonction extérieure. Quelle est la manière typique de gérer cela? Comment puis-je permettre à l'utilisateur de sélectionner également la fonction interne?

La solution la plus simple serait probablement de rendre la fonction externe uniquement sélectionnable dans la zone qui reste en soustrayant la fonction interne - mais je n'ai aucune idée de la façon de procéder.

slhck
la source
1
Vous devez créer un z-index (commande) - voir openlayers.org/dev/examples/ordering.html
Mapperz
Ouf, cela signifie que je devrais vérifier manuellement toutes les combinaisons possibles de fonctionnalités pour les chevauchements et attribuer un ordre z personnalisé avant de les charger? Comme… avoir une fonction qui détermine si une caractéristique est complètement contenue dans une autre?
slhck
La commande z-index ne fonctionne pas
neogeomat

Réponses:

10

Peu d'options. Certains plus fous :-) que d'autres. Les stratégies de base sont

  • Fonctionnalités du cluster
  • Masquer / déplacer la fonction supérieure
  • Envoyez le clic via la fonction supérieure

==>

  1. Activer la stratégie de clustering de fonctionnalités

  2. Implémentez votre propre algorithme de clustering, donc lorsqu'un nouvel élément est ajouté ou modifié, votre algorithme se réexécute et effectue une vérification imbriquée pour la boucle et n * n (-1) vérifie ce qui chevauche ce qui - puis modifiez la propriété de la fonctionnalité pour configurer une liste de fonctionnalités qui se chevauchent, et lorsque l'utilisateur clique sur la fonctionnalité, affichez une liste de fonctionnalités qui se chevauchent et demandez à l'utilisateur de sélectionner ce sur quoi il voulait vraiment cliquer. Logique?

  3. Au lieu d'implémenter une fonctionnalité au clic, implémentez simplement un gestionnaire de clic de carte entier. Et lorsque l'utilisateur clique, vérifiez à travers votre calque toutes les fonctionnalités qui se croisent - et s'il y en a une - affichez la fenêtre contextuelle de ce gars, et s'il y en a plusieurs, affichez une liste d'invites comme au n ° 2 ci-dessus. Si aucun ne se croise, ignorez-le.

  4. Implémentez une option de clic droit pour «masquer» temporairement une fonctionnalité pour vous permettre d'accéder à la fonctionnalité masquée. Dès que le suivant est cliqué, réaffichez toutes les fonctionnalités cachées

  5. Similaire au n ° 4, à l'intérieur de la fenêtre contextuelle de la fonctionnalité supérieure, ajoutez un élément de menu / lien pour «masquer» la fonctionnalité. Et procédez comme au n ° 4.

  6. Similaire à # 4/5, implémentez un "déplacement temporaire" avec le bouton droit de la souris et cliquez sur la fonctionnalité pour la déplacer [rappelez-vous que c'est un ancien emplacement]. Ensuite, l'utilisateur clique sur la fonction inférieure et celle du haut revient à sa position d'origine.

Vadim
la source