2017-08-23 4 views

Répondre

1

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.

+1

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

+1

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

0

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.