terrestris GmbH & Co. KG

Boundless

OpenLayers Workshop

Inhalt

Vorheriges Thema

3.4. Vektorlayer

Nächstes Thema

4. Benutzerinteraktion (control & interaction)

3.5. Statische Vektoren (ImageVector)

Wenn sowohl die Daten als auch deren Ausgestalten nicht dynamisch, sondern im Grunde fix sind, kann es aus Perfomancegründen Sinn machen, dass ol3 ein Bild der Vektordaten berechnet.

Im vorherigen Beispiel wurde ein ol.layer.Vector verwendet, der ständig die Features neugerendert hat; dies ist etwa daran erkennbar, dass die Größe der Marker auch während des Zoomens konstant blieb. Dies führt zu einer sehr konsistenten aber natürlich auch aufwendigeren Darstellung.

Alternativ kann dieses ständige Neurendern während der Aninmationen mittels ol.source.ImageVector umgangen werden.

Das nächste Beispiel verwendet einen ol.layer.Image mit einer ol.source.ImageVector. Im konkreten Falle ist die Anzahl an Daten gering, so dass der Effekt vermutlich fast unmerklich ist. Im Falle von einer großen Menge weitgehend statischer Daten ist der gezeigte Ansatz vermutlich am performantesten.

3.5.1. Die Klasse ol.source.ImageVector

Unsere Beispielkarte soll nun zunächst auf einen Stand zurückversetzt werden, in welchem die Erdbebendaten auf der Weltkarte angezeigt werden.

<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="ol3/ol.css" type="text/css">
    <style>
      #map {
        height: 256px;
        width: 512px;
      }
    </style>
    <title>OpenLayers 3 example</title>
    <script src="ol3/ol.js" type="text/javascript"></script>
  </head>
  <body>
    <h1>My Map</h1>
    <div id="map"></div>
    <script type="text/javascript">
      var map = new ol.Map({
        target: 'map',
        layers: [
          new ol.layer.Tile({
            title: "Global Imagery",
            source: new ol.source.TileWMS({
              url: 'http://maps.opengeo.org/geowebcache/service/wms',
              params: {LAYERS: 'bluemarble', VERSION: '1.1.1'}
            })
          }),
          new ol.layer.Vector({
            title: 'Earthquakes',
            source: new ol.source.GeoJSON({
              url: 'data/layers/7day-M2.5.json'
            }),
            style: new ol.style.Style({
              image: new ol.style.Circle({
                radius: 3,
                fill: new ol.style.Fill({color: 'white'})
              })
            })
          })
        ],
        view: new ol.View({
          projection: 'EPSG:4326',
          center: [0, 0],
          zoom: 0,
          maxResolution: 0.703125
        })
      });
    </script>
  </body>
</html>

Tasks

  1. Öffnen Sie die Datei map.html in einem Texteditor und fügen Sie obigen Code ein.

  2. Speichern Sie ihre Änderungen in der Datei map.html und testen Sie das Ergebnis im Browser: http://localhost/ol3-ws/map.html

  3. Ändern Sie dann den Vektorlayer wie folgt:

    new ol.layer.Image({
      title: 'Earthquakes',
      source: new ol.source.ImageVector({
        source: new ol.source.GeoJSON({
          url: 'data/layers/7day-M2.5.json'
        }),
        style: new ol.style.Style({
          image: new ol.style.Circle({
          radius: 3,
            fill: new ol.style.Fill({color: 'white'})
          })
        })
      })
    })
    
  4. Reload http://localhost/ol3-ws/map.html in the browser

Bemerkung

Wenn alles korrekt ist, sehen Sie die gleichen Daten wie zuvor, selbst feature detection (aus einer Zusatzaufgabe) sollte noch funktionieren. Allerdings sollten die Daten weniger scharf gerendert werden. Effektiv haben wir Perfomance zu Gunsten der Qualität des Renderings gewonnen.

3.5.1.1. Details des Beispiels

Wir werfen einen erneuten Blick auf die Erzeugung des ol.layer.Image.

new ol.layer.Image({
  title: 'Earthquakes',
  source: new ol.source.ImageVector({
    source: new ol.source.GeoJSON({
      url: 'data/layers/7day-M2.5.json'
    }),
    style: new ol.style.Style({
      image: new ol.style.Circle({
      radius: 3,
        fill: new ol.style.Fill({color: 'white'})
      })
    })
  })
})

Wir verwenden ol.layer.Image statt ol.layer.Vector, trotzdem können wir nach wie vor, mittels ol.source.ImageVector, auf die zuvor verwendete source vom Typ ol.source.GeoJSON zurückgreifen.

Anders als zuvor wird die Ausgestaltung als style nicht dem Layer sondern der ol.source.ImageVector mitgegeben.

Zusatzaufgabe

  1. Funktioniert unser singleclick-Handler aus dem vorherigen Abschnitt noch?

    Zur Erinnerung:

    Registrieren Sie eine Funktion, die bei jedem singleclick-Event, welcher auf der ol.Map gefeuert wird, die Funktion forEachFeatureAtPixel der map aufruft und gegebenenfalls weitere Erdbebeninformationen ausgibt.