2015-10-22 4 views
1

J'utilise OpenLayers 3 et je n'ai besoin de montrer que les sommets d'une polyligne. Pour voir cette image exemple:OpenLayers 3 - dessiner des sommets de polylignes seulement

enter image description here

Je veux être en mesure de montrer que les carrés rouges (ils peuvent être autre chose que des carrés, comme des cercles). L'utilisation de marqueurs n'est pas une option pour les problèmes de performances, mes lignes peuvent être énormes (500 000 sommets).

Actuellement, j'ai un code de travail:

// Define the style for vertex polyline : 
var yellowVertexPolylineStyle = [ 
    new ol.style.Style({ 
     image: new ol.style.Circle({ 
      radius: 1.5, 
      fill: new ol.style.Fill({ 
       color: 'yellow' 
      }) 
     }), 
     geometry: function(feature) { 
      return new ol.geom.MultiPoint(feature.getGeometry().getCoordinates()); 
     } 
    }) 
]; 

// Create the line : 
var lineLayer = new ol.layer.Vector({ 

    zIndex: 1000, 
    source: new ol.source.Vector({ features: [new ol.Feature({ geometry: myLine })] }), 
    style: yellowVertexPolylineStyle 
}); 

// Add the layer : 
map.addLayer(lineLayer); 

Mais cela crée des problèmes de performances lorsque le polyligne est assez grand (> 10 000 points). L'utilisation d'une géométrie ol.geom.MultiPoint est encore pire.

Est-ce que quelqu'un sait un meilleur moyen?

EDIT: J'essaie maintenant:

// Define the style for vertex polyline : 
var yellowVertexPolylineStyle = [ 
    new ol.style.Style({ 
     image: new ol.style.Circle({ 
      radius: 1.5, 
      fill: new ol.style.Fill({ 
       color: 'yellow' 
      }) 
     }), 
     geometry: function(feature) { 

      var geom = feature.get('stylegeom'); 
      if (!geom || (geom && geom.getCoordinates().length !== feature.getGeometry().getCoordinates().length)) { 

       geom = new ol.geom.MultiPoint(feature.getGeometry().getCoordinates()); 
       feature.set('stylegeom', geom); 
      } 

      return geom; 
     } 
    }) 
]; 

Je reviendrai ici pour dire si cela fonctionne ...

Répondre

0

Vous devez mettre en cache la géométrie de style, sinon il sera calculé pour chaque trame rendue, p.ex.

geometry: function(feature) { 
    var geom = feature.get('stylegeom'); 
    if (!geom) { 
    geom = new ol.geom.MultiPoint(feature.getGeometry().getCoordinates()); 
    feature.set('stylegeom', geom); 
    } 
    return geom; 
} 

Si vos modifications de géométrie de fonction, vous devez mettre à jour la géométrie de style aussi:

source.on('changefeature', function(evt) { 
    feature.set('stylegeom', undefined); 
}); 
+0

Merci, je vais essayer d'accepter votre réponse si ça aide! Je suis en train de mettre à jour la géométrie une fois par seconde, donc j'ai ajouté un test dans l'instruction if pour vérifier si la longueur de la géométrie de l'objet est différente de celle du style (voir ma modification). –

+0

J'ai mis à jour ma réponse pour vous montrer une meilleure façon d'effacer la géométrie de style lorsque la fonction change. Votre méthode actuelle de vérification et de longueur sera très lente, car 'geom.getCoordinates()' construit un tableau de coordonnées à partir de la structure de coordonnées interne plate à chaque appel. – ahocevar