2015-06-05 26 views
6

Come posso forzare ol3 a rendere ogni singolo punto in una geometria?Openlayers 3 Come rendere ogni punto di una geometria a una risoluzione alta (piccola)?

Sto riscontrando un problema con gli openlayers 3, dove sebbene sto tracciando una stringa di linee con 3000 punti su una distanza di forse 100 m, solo circa 1000 sono rendering.

EDIT: Ora - Openlayers 3 v.3.7.0

Zoom avanti abbastanza lontano su una serie di punti in OpenLayers 3 rivela che solo pochi punti vengono disegnati, in un modello di griglia. Vorrei ingrandire per vedere un centinaio di punti disegnati leggermente sfalsati l'uno dall'altro in una mappa in scala centimetrica o millimetrica.

Ciò è possibile con gli openlayer 3?

risposta

3

Il renderer semplifica le tue geometrie. Stride è fondamentalmente se hai 2, 3 o 4 valori in una coordinata, quindi ad es. XY, XYZ, XYZM.

Si vorrà osservare la modifica di ol.SIMPLIFY_TOLERANCE ma sarà necessario creare una compilazione personalizzata e modificare la definizione per quanto posso vedere (http://openlayers.org/en/v3.5.0/doc/tutorials/custom-builds.html).

/** 
* @define {number} Tolerance for geometry simplification in device pixels. 
*/ 
ol.SIMPLIFY_TOLERANCE = 0.5; 

Provare a impostare 0 o negativo.

+0

Thank you - sto ancora lavorando con la libreria ol-debug, in modo da cambiare questo numero ha ridotto il distanza tra i punti. – ryansstack

+0

Dovrò controllare i miei dati per assicurarmi che questo sia il rendering di tutti i dati, tuttavia sembra ancora una griglia quando viene ingrandito da vicino. – ryansstack

+0

Forse mi sono sbagliato. La modifica di questo valore da 0,5 a 0,001 o 0 o -0,001 non sembra fare la differenza in # di punti renderizzati. Modificandolo più in alto, tuttavia, si riduce drasticamente il numero di funzioni. – ryansstack

3

Ho lo stesso problema con una linea con solo quattro vertici. Ho modificato il numero di OL.SIMPLIFY_TOLERANCE a -1 e non sono state apportate modifiche al rendering della funzione. Se chiamo geometry.getSimplifiedGeometry (0), riavvio tutti e quattro i vertici. Tuttavia, durante il rendering, vengono restituiti solo due vertici. Mi chiedo se qualcos'altro debba essere cambiato? I poligoni sembrano rendere bene. Sono nuovo di OpenLayers 3, quindi sono sicuro che c'è un modo migliore per aggirare questo.

Posso visualizzare correttamente la linea utilizzando una funzione di stile. Ho messo un esempio del mio stile di selezione qui sotto. Ho anche creato una funzione di stile standard per il livello vettoriale. Se non avessi aggiunto la funzione di stile all'interazione di selezione, la mia funzione sarebbe passata da una linea con 4 vertici a una linea con solo i punti iniziale e finale.

var selectStyleFunction = function (feature, resolution) { 
      var styles = []; 
      var white = [255, 255, 255, 1]; 
      var blue = [0, 153, 255, 1]; 
      var width = 3; 
      var geometry = feature.getGeometry(); 
      var type = geometry.getType(); 
      if (type == 'Point') { 
       styles.push(new ol.style.Style({ 
        image: new ol.style.Circle({ 
         radius: width * 2, 
         fill: new ol.style.Fill({ 
          color: blue 
         }), 
         stroke: new ol.style.Stroke({ 
          color: white, 
          width: width/2 
         }) 
        }), 
        zIndex: Infinity 
       })); 
      } 
      if (type == 'LineString') { 
       geometry.forEachSegment(function (start, end) { 
        styles.push(new ol.style.Style({ 
         geometry: new ol.geom.LineString([start, end]), 
         stroke: new ol.style.Stroke({ 
          color: white, 
          width: width + 2 
         }) 
        })); 
        styles.push(new ol.style.Style({ 
         geometry: new ol.geom.LineString([start, end]), 
         stroke: new ol.style.Stroke({ 
          color: blue, 
          width: width 
         }) 
        })); 
       }); 
      } 

      if (type == 'Polygon') { 
       styles.push(new ol.style.Style({ 
        fill: new ol.style.Fill({ 
         color: [255, 255, 255, .5] 
        }) 
       })); 
       styles.push(new ol.style.Style({ 
        stroke: new ol.style.Stroke({ 
         color: white, 
         width: width + 2 
        }) 
       })); 
       styles.push(new ol.style.Style({ 
        stroke: new ol.style.Stroke({ 
         color: blue, 
         width: width 
        }) 
       })); 
      } 
      return styles; 
     } 

Un altro stile che ho usato per una caratteristica LineString che ho aggiunto alla mia funzione di stile utilizzato per il mio livello vettoriale. Questo aggiunge punti ad ogni vertice, ed è basato fuori del poligono esempio sul sito OpenLayers Esempi:

if (type == horizontal') { 

       var coords = geometry.getCoordinates(); 
       geometry.forEachSegment(function (start, end) { 
        styles.push(new ol.style.Style({ 
         geometry: new ol.geom.LineString([start, end]), 
         stroke: new ol.style.Stroke({ 
          color: [0, 128, 0, .9], 
          width: width + 2 
         }), 
         zIndex: 9000 
        })); 
       }); 

       styles.push(new ol.style.Style({ 
        image: new ol.style.Circle({ 
         radius: width + 2, 
         fill: new ol.style.Fill({ 
          color: [0, 128, 0, 2, 1] 
         }), 
         stroke: new ol.style.Stroke({ 
          color: [255, 255, 255, 0.75], 
          width: width 
         }) 
        }), 
        geometry: function() { 
         return new ol.geom.MultiPoint(coords); 
        }, 
        zIndex: 9000 

       })); 
      } 
+0

Probabilmente dovresti chiedere a questo come una domanda separata invece che come una risposta a questa domanda. –

+0

Ho pensato che la funzione di stile lo avrebbe aiutato a visualizzare tutti i vertici, in quanto ha risolto il mio problema. Posso fare una domanda a parte, ma potrebbe essere un duplicato in quanto è correlato al rendering di linee e alla geometria semplificata. Per visualizzare tutti i punti, anziché tutti i segmenti, è possibile creare un multipunto da geometry.getCoordinates(). Nel suo caso, il numero di punti può ancora essere ridotto. Grazie. – Azhar

+0

potresti aggiungere lo stile di selezione originale che stavi utilizzando, è un singolo stile statico? Inoltre, grazie per la pubblicazione, questo aiuta e potrei non averlo visto altrimenti. – ryansstack