Est-il possible de continuer à dessiner à partir du dernier point de LineString après que 'drawend' ait été levé à partir du double clic? Chaque exemple que j'ai trouvé en ligne commence un autre tirage à partir de zéro.Openlayers 3: Continuer à dessiner la ligne initiale, après que le drawend a été déclenché avec un double clic
Répondre
Vous pouvez combiner une interaction Dessiner avec une interaction Modifier. Cela ne vous permettra pas de continuer à dessiner la première ligne, mais vous permettra au moins de modifier les existants et d'ajouter de nouveaux sommets à la ligne tracée. Mais si vous ajoutez également une interaction Snap au mixage, vous pouvez continuer là où vous êtes parti, bien qu'une nouvelle LineString soit démarrée. Tout ce que vous devez faire ensuite est de concaténer les LineStrings dessinés en un seul, ou de créer un MultiLineString à partir de tous les LineStrings. Vous pouvez tester cela avec l'exemple http://openlayers.org/en/v4.3.1/examples/draw-and-modify-features.html.
Après avoir lutté deux jours avec cette question, voici ce que je fait en utilisant la bibliothèque JSTS (example de l'intégration de la bibliothèque sur OL3):
var vectorSource = new ol.source.Vector();
var map = new ol.Map({
layers: [
new ol.layer.Vector({
source: vectorSource
})
],
target: document.getElementById('map'),
view: new ol.View({
center: ol.proj.fromLonLat([126.979293, 37.528787]),
zoom: 15
})
});
var draw = new ol.interaction.Draw({
source: vectorSource,
type: 'MultiLineString'
});
var modify = new ol.interaction.Modify({source: vectorSource});
var snap = new ol.interaction.Snap({source: vectorSource});
var select = new ol.interaction.Select({source: vectorSource});
map.addInteraction(draw);
map.addInteraction(modify);
map.addInteraction(snap);
var ol3Parser = new jsts.io.ol3Parser();
//listen to drawend
draw.on('drawend', function (evt) {
mergeLineString(evt.feature);
});
//listen to modifyend
modify.on('modifyend', function (evt) {
mergeLineString(evt.features.getArray()[0]);
});
function mergeLineString(currentFeature){
var features: vectorSource.getFeatures();
var feature, currentGeo, featureGeo, union, i;
// loop forward because we have to remove the merged features
for (i = features.length - 1; i >= 0; --i) {
feature = features[i];
// convert data with JSTS
currentGeo = ol3Parser.read(currentFeature.getGeometry());
featureGeo = ol3Parser.read(feature.getGeometry());
// check intersection with another feature already on the vector
if (currentGeo.intersects(featureGeo)) {
// create union
union = currentGeo.union(featureGeo);
// set the new geometry to the last feature added
currentFeature.setGeometry(ol3Parser.write(union));
// remove the feature which was merged
vectorSource.removeFeature(feature);
}
}
}
Toute amélioration de ce code est vraiment bienvenu si nécessaire, parce que je Je suis assez nouveau avec OL3 - et j'ai beaucoup besoin de cette fonctionnalité! Avec ce code, n'utilisez pas dessiner et modifier en même temps que suggéré - ou vous ne pourrez pas continuer à dessiner à partir d'une ligne existante (le clic n'écoutera pas)). Vous devez lier deux actions différentes: dessiner + accrocher sur un bouton de dessin, puis modifier + accrochage sur un bouton d'édition.
Ok disons que je vais avec la première option (Modifier). Pouvez-vous développer un peu plus? Comment ajouter des sommets dans LineString initial? Pouvez vous donner un exemple? – Jimi
N'est-il pas possible d'obtenir une telle fonctionnalité sans utiliser de modification? Cela a du sens puisque je veux "prolonger" le dessin précédent. Ce que je veux, c'est au lieu de réinitialiser et redémarrer à partir de Vertex 1, garder initial et ajouter le sommet n + 1 (et le bord correspondant). – Jimi