2014-11-12 15 views
5

Ich muss registrieren implementieren Undo/Redo Funktionalität mit Openlayers 3 Vektorbearbeitung (nur für Openlayers in http://dev.openlayers.org/examples/modify-feature.html demonstriert mag 2).Openlayers 3 Wie Eigenschaft Modified Ereignis als „featuremodified“ in Openlayers 2

Um den Überblick über Geometrie Änderungen von Funktionen, halte ich habe einen Speicherstapel zu verwalten, die veränderten geometrischen Definitionen von Funktionen auf Benutzer-Interaktionen halten wird. Ich weiß, OpenLayers 3 bietet beobachtbare Objekte. So ol.Feature oder ol.Feature.getGeometry() können für Veränderungen beobachtet werden, aber ich bin auf der Suche für die explizite Ereignisse von ol.interaction.Modify emittiert, die mich benachrichtigen soll, wenn die Interaktion startet oder den Betrieb Vektorbearbeitung endet (wie "beforefeaturemodified" und "featuremodified" Ereignisse in Openlayers 2).

Ein Handler für beobachtet Geometrie hören oder Funktion Änderungen können für den Zweck verwendet werden, aber es ist zu teuer, weil Geometrie des Merkmals unter Modifikation mit jedem Pixel Bewegung geändert wird.

Ich habe über die offizielle documentation von Openlayers 3 gegangen, aber nicht verschiedene Veranstaltungen finden konnten, die 2. von Openlayers vorgesehen sind, in den meisten Fällen die Dokumentation Änderung nur Ereignis erwähnt. Ich frage mich, ob solche Ereignisse für die Architektur von Openlayer 3 keine Rolle spielen. Wenn es so ist, irgendwelche Vorschläge wie kann ich das vorhandene ol.interaction.Modify erweitern, um benutzerdefinierte Ereignisse zu integrieren? Vielen Dank.

+0

Momentan gibt es keine solchen Ereignisse. Daher würde ich empfehlen, Probleme in ol3 GitHub dafür zu erstellen. – erilem

+0

Sowohl OL2 als auch OL3 sind Open Source. Hast du den Quellcode angeschaut? Ich habe Lösungen für bestimmte Probleme in OL3 gefunden, indem ich Funktionen kopiert und sie für meine Zwecke modifiziert habe. –

+0

Danke @erilem und @ ander-finn. Ich habe das Problem auf [github] (https://github.com/openlayers/ol3/issues/2946) erstellt und habe auch erfolgreich die 'ol.interaction.Modify' geerbt, um das notwendige Ereignis mit 'goog.EventTarget' zu integrieren 'usw. Unser Unternehmen sucht nach zwei Antworten, um zu entscheiden, ob openlayers-3 in einem kommenden Projekt verwendet werden soll oder nicht. 1- Ist es sicher, ein benutzerdefiniertes Verhalten zu erreichen, indem "ol" -Klassen mit "goog.base" und "goog.inherits" in Bezug auf zukünftige Aktualisierungen von OL3 erweitert werden? 2- Werden Lizenzkonflikte auftreten, wenn diese Erweiterungen mit kommerziellen Produkten ausgeliefert werden? Vielen Dank. –

Antwort

2

bei Openlayers Ab 3.7.0, ol.interaction.Modify emittiert modifystart und modifyend. Dokumentation: http://openlayers.org/en/v3.7.0/apidoc/ol.ModifyEvent.html

Beispiel, die nach jeder Änderung zufällig entscheidet, ob er oder umgekehrt gehalten werden soll (http://jsfiddle.net/rbha7f83/1/):

var select = new ol.interaction.Select({ 
    style: overlayStyle 
}); 

// The modify interaction does not listen to geometry change events. 
// Changing the feature coordinates will make the modify interaction 
// unaware of the actual feature coordinates. 
// A possible fix: Maintain a collection used by Modify, so we can reload 
// the features manually. This collection will always contain the same 
// features as the select interaction. 
var selectSource = new ol.Collection(); 
select.on('select', function (evt) { 
    evt.selected.forEach(function (feature) { 
     selectSource.push(feature); 
    }); 
    evt.deselected.forEach(function (feature) { 
     selectSource.remove(feature); 
    }); 
}); 

var modify = new ol.interaction.Modify({ 
    features: selectSource, // use our custom collection 
    style: overlayStyle 
}); 

var map = new ol.Map({ 
    interactions: ol.interaction.defaults().extend([select, modify]), 
    layers: [layer], 
    target: 'map', 
    view: new ol.View({ 
     center: [0, 1000000], 
     zoom: 2 
    }) 
}); 

var originalCoordinates = {}; 
modify.on('modifystart', function (evt) { 
    evt.features.forEach(function (feature) { 
     originalCoordinates[feature] = feature.getGeometry().getCoordinates(); 
    }); 
}); 
modify.on('modifyend', function (evt) { 
    evt.features.forEach(function (feature) { 
     if (feature in originalCoordinates && Math.random() > 0.5) { 
      feature.getGeometry().setCoordinates(
      originalCoordinates[feature]); 
      delete originalCoordinates[feature]; 

      // remove and re-add the feature to make Modify reload it's geometry 
      selectSource.remove(feature); 
      selectSource.push(feature); 
     } 
    }); 
}) 

Hinweis, dass die Ereignisse vor ausgesendet werden und nach jeder Interaktion. Wenn Sie einen Stützpunkt ziehen und dann auf einen Stützpunkt klicken, um ihn zu entfernen (beide mit der gleichen Funktion), werden zwei Ereignisse ausgelöst: modifystart und modifyend.