26.02.2014 Aufrufe

ADMIN Magazin Gestapelt - Schneller und sicherer mit RAID (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!