Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Openlayers<br />
BBOX <strong>und</strong> Ratio<br />
Das Attribut »ratio« des Objekts »OpenLayers.<br />
Strategy.BBOX« legt fest, wie groß das Verhältnis<br />
von angezeigten Punkten <strong>und</strong> geladenen<br />
Punkten ist. Das bedeutet, bei einem Ratio-Wert<br />
größer eins werden um den angegebenen Faktor<br />
mehr Daten geladen, als tatsächlich in der Karte<br />
angezeigt werden. Dies ist besonders dann sinnvoll,<br />
wenn ein Benutzer den Kartenausschnitt<br />
nur ein klein wenig verschiebt. So müssen für<br />
Strategie, die als einziges Element des<br />
Arrays <strong>mit</strong> »new()« initialisiert wird. Im<br />
nächsten Schritt wird der Parser definiert,<br />
der die Daten in Kartenpunkte umwandelt.<br />
Einen Kommunikationskanal für »Open-<br />
Layers.Layer.Vector« öffnet das Objekt<br />
»OpenLayers.Protocol.HTTP«, das als Parameter<br />
eine URL erwartet, unter der die<br />
Daten zu finden sind. Die Übergabeparameter<br />
für das aufzurufende Skript werden<br />
wie gehabt als Array von Attributen definiert:<br />
»params: {land: "DE", zeitschrift:<br />
"FreeX"}«, die intern <strong>mit</strong> »OpenLayers.<br />
Util.getParameterString()« wieder in eine<br />
Zeichenkette im bekannten Format umgewandelt<br />
werden. Besonders interessant<br />
sind die Attribute »srsInBBOX«, »read-<br />
WithPOST«, »readWithGET« <strong>und</strong> »headers«.<br />
Das Attribut »srsInBBOX« besagt,<br />
dass die Zeichenkette der Übergabeparadert.<br />
Sicherlich hat man die Möglichkeit,<br />
die Anzahl der darzustellenden POIs anhand<br />
eines Kartenausschnitts zu bestimmen.<br />
Allerdings ist der Programmieraufwand<br />
dafür sehr hoch. Openlayers bietet<br />
auch für dieses Problem eine Lösung, die<br />
dem Entwickler viel Programmierarbeit<br />
abnimmt, wie Listing 5 zeigt.<br />
In der Funktion »map_layer_http_strategy«<br />
ist zu sehen, welche Komponenten<br />
nötig sind, um die Daten voll dynamisch<br />
vom Kartenausschnitt abhängig darzustellen.<br />
Zunächst definiert das Objekt<br />
»OpenLayers.Strategy.BBOX«. Die Strategie<br />
BBOX wird <strong>mit</strong> einem Ratio-Wert von<br />
eins definiert (siehe Kasten „BBOX <strong>und</strong><br />
Ratio“).<br />
»OpenLayers.Layer.Vector« bietet die<br />
Möglichkeit, mehrere Strategien zu verarbeiten,<br />
die in einem Array zusammengefasst<br />
sind. In diesem Beispiel ist eine<br />
diese kleine Bewegung nicht neue Daten vom<br />
Server geladen werden. Die Anzeige wird dadurch<br />
flüssiger <strong>und</strong> schneller, da keine Wartezeiten<br />
entstehen. Allerdings erkauft man sich<br />
da<strong>mit</strong> auch, dass man zu Beginn eine höhere<br />
Serverlast <strong>und</strong> Ladezeit hat. Ein Ratio-Wert von<br />
eins bedeutet, dass genauso viele Daten vom<br />
Server abgerufen werden, wie auch tatsächlich<br />
zu sehen sind.<br />
meter um die Koordinaten des Kartenausschnitts<br />
inklusive der Projektion ergänzt<br />
wird. So<strong>mit</strong> erhält ein CGI-Skript immer<br />
den Kartenausschnitt <strong>und</strong> die zugehörige<br />
Projektion.<br />
Erben<br />
Die beiden Attribute »readWithPOST«<br />
<strong>und</strong> »readWithGET« definieren, ob die<br />
HTTP-Methode POST oder GET für die<br />
Datenübertragung benutzt werden soll.<br />
Wichtig ist auch wieder die Angabe »headers«,<br />
die definiert, <strong>mit</strong> welchem MIME-<br />
Type die Daten übertragen werden. Das<br />
letzte Attribut »format« wird das Objekt<br />
angegeben, welches den Parser referenziert.<br />
Das so erzeugte Objekt »OpenLayers.Protocol.HTTP«<br />
wird zusammen <strong>mit</strong><br />
dem Array der Strategien (»strategies«) an<br />
»OpenLayers.Layer.Vector« übergeben.<br />
Um die Beschreibung dieses Code-Abschnitts<br />
abzuschließen, ein paar Worte<br />
zum Parser-Objekt. Die Code-Zeile<br />
»OpenLayers_FreeX = OpenLayers.<br />
Class(OpenLayers.Format, {});« leitet<br />
vom in der Bibliothek formulierten Objekt<br />
»OpenLayers.Format« das neue Objekt<br />
»OpenLayers_FreeX« ab. Das bedeutet,<br />
es erbt die komplette Funktionalität.<br />
Um CSV-Daten zu verarbeiten, muss das<br />
neue Objekt eine eigene Routine imple-<br />
Listing 6: Initialisieren der Hauptfunktion<br />
01 function map_init(mapid) {<br />
02 /* Renderer er<strong>mit</strong>teln <strong>und</strong> festlegen */<br />
03 var renderer =<br />
04 OpenLayers.Util.getParameters(<br />
05 window.location.href).renderer;<br />
06 renderer = (renderer) ? [renderer] :<br />
07 OpenLayers.Layer.Vector.prototype.renderers;<br />
08 <br />
09 /* OpenLayers an DOM‐Objekt binden */<br />
10 window.map = new OpenLayers.Map(mapid, {<br />
11 maxExtent: extent,<br />
12 projection: spherMerc,<br />
13 displayProjection: epsg4326,<br />
14 maxResolution: 'auto',<br />
15 numZoomLevels: 14,<br />
16 units: 'm',<br />
17 controls : [<br />
18 new OpenLayers.Control.PanZoom(),<br />
19 new OpenLayers.Control.Navigation(<br />
20 {zoomWheelEnabled: false}),<br />
21 new OpenLayers.Control.LayerSwitcher()<br />
22 ]});<br />
23 <br />
24 /* Basiskarte erstellen */<br />
25 var base = new OpenLayers.Layer.OSM("FreeX‐Karte",<br />
26 ["http://a.tile.openstreetmap.org/${z}/${x}/${y}.png",<br />
27 "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png",<br />
28 "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png"],<br />
29 {<br />
30 wrapDateLine: false,<br />
31 isBaseLayer: true,<br />
32 displayOutsideMaxExtend: true,<br />
33 tileOptions: {crossOriginKeyword: null}<br />
34 });<br />
35 /* Ebenen erzeugen <strong>und</strong> an Basiskarte & DOM‐Objekt binden */<br />
36 freex = map_layer(window.map, "FreeX‐Layer (normal)");<br />
37 freex_o_r_p = map_layer_request_post(window.map,<br />
38 "FreeX‐Layer (POST‐Request)");<br />
39 freex_l_h_s = map_layer_http_strategy(window.map,<br />
40 "FreeX‐Layer (HTTP <strong>und</strong> Strategy)");<br />
41 if (base && freex && freex_o_r_p && freex_l_h_s) {<br />
42 window.map.addLayers(<br />
43 [base, freex, freex_o_r_p, freex_l_h_s]);<br />
44 }<br />
45 /* Karte zentrieren <strong>und</strong> Zoomfaktor festlegen */<br />
46 window.map.setCenter(<br />
47 new OpenLayers.LonLat(11, 48).<br />
48 transform(epsg4326, spherMerc), 9);<br />
49 }<br />
www.admin-magazin.de<br />
Admin<br />
Ausgabe 06-2012<br />
111