Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Openlayers<br />
Webbrowser<br />
Generierte<br />
HTML-Seite<br />
Content-Type:<br />
text/plain<br />
dynamischer Landkarten auf der eigenen<br />
Webseite.<br />
Zugang über Layer<br />
OpenLayers.Request.POST<br />
OpenLayers.Request.GET<br />
Callback zu<br />
OpenLayers.Request.POST<br />
OpenLayers.Request.GET<br />
Webseite <strong>mit</strong><br />
JavaScript<br />
Parameter auswerten<br />
Datenbank abfragen<br />
HTML-Code genieren<br />
CGI-Skript für Datenbankzugriff<br />
Die in einer Landkarte eingetragenen geografischen<br />
Punkte werden in einer Ebene<br />
durch das Objekt »OpenLayers.Layer.Vector«<br />
zusammengefasst. Darin sind zwei<br />
interessante Schnittstellen integriert, die<br />
einen Zugriff auf externe Datenbestände<br />
Datenbank<br />
Abbildung 2: Zugriff auf Datenbankinhalte <strong>mit</strong>tels der Methoden »OpenLayers.Request.GET« <strong>und</strong><br />
»OpenLayers.Request.POST«.<br />
Listing 1: Initialisierung<br />
01 /* Projektion definieren */<br />
02 var spherMerc = new OpenLayers.<br />
Projection('EPSG:900913');<br />
03 var epsg4326 = new OpenLayers.<br />
Projection('EPSG:4326');<br />
04 var zoom = 14;<br />
05 <br />
06 /* Kartenausschnitt definieren */<br />
07 var l = new OpenLayers.LonLat(8, 53).<br />
transform(epsg4326, spherMerc);<br />
erlauben <strong>und</strong> die Ausgabe steuern. Die<br />
Funktionsweise ist komplexer als bei<br />
den Objekten der Gruppe »OpenLayers.<br />
Request«. Kartenausschnitte lassen sich<br />
per Maus vergrößern, verkleinern <strong>und</strong><br />
verschieben. Jeder dieser Aktionen generiert<br />
ein Ereignis (Event), das Openlayers<br />
<strong>mit</strong>teilt, einen neuen Kartenausschnitt zu<br />
laden. Diese Events werden an alle Ebenen<br />
(Layer) über<strong>mit</strong>telt, um eine Neuberechnung<br />
der Position auf der Karte zu<br />
08 var r = new OpenLayers.LonLat(14, 43).<br />
transform(epsg4326, spherMerc);<br />
09 var extent = new OpenLayers.Bo<strong>und</strong>s(l.lon,<br />
l.lat, r.lon, r.lat);<br />
10 <br />
11 /* allgemeine Variablen */<br />
12 var freex, freex_o_r_p, freex_l_h_s;<br />
13 var <strong>mit</strong>Transformation = true;<br />
14 var ohneTransformation = false;<br />
15 ...<br />
erzwingen. Wenn viele POIs eingetragen<br />
sind, erfordert das viel Rechenleistung<br />
<strong>und</strong> viel Zeit aufseiten des Clients. Das<br />
lässt sich reduzieren, indem man nur<br />
die Objekte neu darstellt, die im Kartenausschnitt<br />
auch wirklich zu sehen sind<br />
oder neu hinzukommen. Diese Strategie<br />
realisiert das Objekt »OpenLayers.Strategy.BBOX«.<br />
Um analog die Positionsangaben der<br />
einzelnen POIs zu erhalten, bedient<br />
man sich eines Kommunikationskanals<br />
<strong>mit</strong> dem Objekt »OpenLayers.Protocol.<br />
HTTP«. Es über<strong>mit</strong>telt den aktuellen Kartenausschnitt<br />
an ein CGI-Skript <strong>und</strong> gibt<br />
als Ergebnis eine Liste <strong>mit</strong> POIs zurück,<br />
die im neuen Kartenausschnitt zu sehen<br />
sind. Die neuen Angaben werden an<br />
»OpenLayers.Layer.Vector« zurückgegeben<br />
<strong>und</strong> dargestellt, die nicht mehr sichtbaren<br />
POIs automatisch gelöscht. Das<br />
reduziert nicht nur den Speicherbedarf,<br />
sondern gleichermaßen die Rechenzeit.<br />
Abbildung 3 stellt den Ablauf nochmals<br />
grafisch dar.<br />
Einen weiteren Vorteil bietet diese Methode<br />
bei großen Mengen von POIs: Es<br />
lässt sich angeben, wie viele Punkte maximal<br />
dargestellt werden sollen. So kann<br />
man beispielsweise erst eine Grobübersicht<br />
über die wichtigsten POIs anzeigen.<br />
Je kleiner der Kartenausschnitt gewählt<br />
wird, umso mehr verfeinert man dann<br />
die Übersicht. Auch hier sei Abbildung 1<br />
nochmals als Beispiel herangezogen. Es<br />
gibt in den USA circa 3100 Wetterstationen<br />
als POIs. Um diese große Anzahl anzuzeigen,<br />
braucht ein durchschnittlicher<br />
Webbrowser etwa zwanzig Sek<strong>und</strong>en.<br />
Die Darstellung nach der eben beschriebenen<br />
Methode dauert im Vergleich nur<br />
noch eine Sek<strong>und</strong>e, weil nur er noch<br />
etwa 160 Stationen verarbeiten muss.<br />
Nach diesen theoretischen Betrachtungen<br />
Listing 2: Layer <strong>mit</strong> statischen POI<br />
01 function map_poi(layer, lon, lat, label,<br />
farbe) {<br />
02 var l = new OpenLayers.LonLat(lon, lat).<br />
03 transform(epsg4326, spherMerc);<br />
04 var point = new OpenLayers.Geometry.<br />
Point(l.lon, l.lat);<br />
05 var pf = new OpenLayers.Feature.<br />
Vector(point);<br />
06 if (pf) {<br />
07 pf.attributes = {text: label, color:<br />
farbe};<br />
08 layer.addFeatures([pf]);<br />
09 }<br />
10 }<br />
11 <br />
12 function map_layer(map, layer_name) {<br />
13 var layer = new OpenLayers.Layer.<br />
Vector(layer_name, {<br />
14 projection: map.displayProjection,<br />
15 renderers: map.renderer,<br />
16 displayInLayerSwitcher: true,<br />
17 wrapDateLine: false,<br />
18 displayOutsideMaxExtend: true,<br />
19 isBaseLayer: false,<br />
20 styleMap: new OpenLayers.StyleMap(style)<br />
21 });<br />
22 <br />
23 map_poi(layer, 9.00448, 48.68750,<br />
24 "FreeX‐Verlag", "#FFEE00");<br />
25 map_poi(layer, 11.80008, 47.85878,<br />
26 "FreeX‐Leser", "#FFEE00");<br />
27 map_poi(layer, 11.55735, 48.14042,<br />
28 "FreeX‐Leser", "#FFEE00");<br />
29 <br />
30 return layer;<br />
31 }<br />
108 Ausgabe 06-2012 Admin www.admin-magazin.de