Umgang mit überlappenden Features in OpenLayers

14

Wenn Benutzer ein Polygon-Feature erstellen, das ein anderes Feature vollständig überlappt, wie dies…

… Dann können Sie auf keinen Fall das innere Merkmal auswählen, dh dasjenige, das sich mit dem anderen überlappt. Ich benutze derzeit ein einfaches SelectFeaturewie dieses:

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

Aber natürlich kann ich nur das äußere Merkmal auswählen. Was ist die typische Art, damit umzugehen? Wie kann ich es dem Benutzer ermöglichen, auch das innere Merkmal auszuwählen?

Die einfachste Lösung wäre wahrscheinlich, das äußere Merkmal nur innerhalb des Bereichs auswählbar zu machen, der beim Subtrahieren des inneren Merkmals übrig bleibt - aber ich habe keine Ahnung, wie ich das tun soll.

slhck
quelle
1
Sie müssen einen Z-Index erstellen (Bestellung) - siehe openlayers.org/dev/examples/ordering.html
Mapperz
Puh, bedeutet das, dass ich jede mögliche Kombination von Features manuell auf Überlappungen prüfen und eine benutzerdefinierte Z-Reihenfolge zuweisen muss, bevor ich sie lade ? Wie… eine Funktion zu haben, die bestimmt, ob ein Merkmal vollständig in einem anderen enthalten ist?
Slhck
Z-Index-Bestellung funktioniert nicht
Neogeomat

Antworten:

10

Einige Optionen. Manche verrückter :-) als andere. Die Grundstrategien sind

  • Cluster-Funktionen
  • Oberste Funktion ausblenden / verschieben
  • Senden Sie den Klick durch die Top-Funktion

==>

  1. Aktivieren Sie die Feature-Clustering-Strategie

  2. Implementieren Sie Ihren eigenen Clustering-Algorithmus. Wenn ein neues Element hinzugefügt oder geändert wird, wird der Algorithmus erneut ausgeführt und eine verschachtelte for-loop-Prüfung durchgeführt. Außerdem wird n * n (-1) geprüft, um festzustellen, welche Elemente sich mit welchen überschneiden. Ändern Sie dann die Feature-Eigenschaft Um eine Liste überlappender Features einzurichten und wenn der Benutzer auf das Feature klickt, wird eine Liste überlappender Features angezeigt und der Benutzer kann auswählen, auf welche Features er wirklich klicken möchte. Macht Sinn?

  3. Anstatt Feature-On-Click zu implementieren, implementieren Sie einfach einen ganzen Map-Click-Handler. Wenn der Benutzer auf klickt, durchsuchen Sie Ihren Layer nach sich überschneidenden Features - und falls es eines gibt - und zeigen Sie das Popup dieses Typen an. Wenn es mehrere gibt, zeigen Sie eine Aufforderungsliste wie in # 2 oben an. Wenn sich keine überschneidet, einfach ignorieren.

  4. Implementieren Sie eine Rechtsklick-Option, um eine Funktion vorübergehend "auszublenden", damit Sie auf die ausgeblendete Funktion zugreifen können. Sobald Sie auf das nächste klicken, werden alle ausgeblendeten Funktionen wieder angezeigt

  5. Ähnlich wie bei # 4 fügen Sie im Popup-Fenster des Top-Features ein Menü- / Link-Element hinzu, um das Feature "auszublenden". Und fahren Sie fort wie in # 4.

  6. Ähnlich wie bei # 4/5 führen Sie einen Rechtsklick auf "Temporäres Verschieben" aus und klicken Sie auf "Ziehen", um das Feature zur Seite zu schieben. Dann klickt der Benutzer auf das untere Merkmal und das obere springt in seine ursprüngliche Position zurück.

Vadim
quelle