Nach den positiven Worten über den OpenLayers-Player hatte ich ihn mir in den letzten Tagen angeschaut und mir einen ersten Überblick verschafft:
Der Funktionsumfang ist beachtlich. Allerdings kommen wohl nur hartgesottene JavaScript-Programmierer auf die Idee, eine Funktion als Konstruktor (was ja logisch ist) und
gleichzeitig als Container für weitere Funktionen zu benutzen (Layer, Control, ...).
Aufgefallen ist mir, daß (standardmäßig) kein Capturing der Maus stattfindet - das Verschieben der Karte wird also sofort beendet, sobald der Cursor die Karte verläßt. Das ist im Google Maps
API besser gelöst.
Desweiteren rendern einige OSM-Server die Karten fehlerhaft (gerade Striche quer über ganze Kontinente). Entweder sind da sie Vektordaten fehlerhaft oder die Renderengines enthalten Bugs. OSM-Karten sind in Deutschland erstaunlich genau, halten ohne Probleme mit Google Maps mit und sind sogar teilweise genauer und enthalten mehr Details. Schaut man aber ins Ausland - z.B. Südamerika - fehlen sogar größere Fernverkehrsstraßen - von kleineren Objekten ganz zu schweigen.
Trotzdem hat mich das Ganze neugierig gemacht und so sind die ersten 1000 Zeilen an Wrapper-Objekten für das OpenLayers-
API entstanden.
Damit habe ich dann den ersten Versuch gewagt,
dieses Beispiel in Delphi umzusetzen (natürlich wieder ohne eine einzige Zeile JavaScript).
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
const
HTML = '
<html>'+sLineBreak+
'
<head>'+sLineBreak+
'
<script src="http://openlayers.org/dev/OpenLayers.js"></script>'+sLineBreak+
'
</head>'+sLineBreak+
'
<body style="margin: 0">'+sLineBreak+
'
<div id="map" style="width: 100%; height: 100%"></div>'+sLineBreak+
'
</body>'+sLineBreak+
'
</html>';
var
Map: TMap;
ol_wms, dm_wms: TLayer;
begin
WebBrowser1.Navigate('
about:blank');
with TScript.Create(WebBrowser1)
do //Skript-Objekt erstellen
begin
LoadBrowserFromSource(WebBrowser1,
HTML,true);
//warten, bis die Seite komplett geladen wurde
Caption:=Caption+'
- '+OpenLayers.VersionNumber;
Map:=OpenLayers.Map('
map');
//Karte anlegen
ol_wms:=OpenLayers.Layer.WMS('
OpenLayers WMS',
'
http://vmap0.tiles.osgeo.org/wms/vmap0',
TJScriptObject.Create(['
layers: basic']));
dm_wms:=OpenLayers.Layer.WMS('
Canadian Data',
'
http://www2.dmsolutions.ca/cgi-bin/mswms_gmap',
TJScriptObject.Create(['
layers: bathymetry,land_fn,park,'+
'
drain_fn,drainage,prov_bound,'+
'
fedlimit,rail,road,popplace',
'
transparent: true',
'
format: image/png']),
TJScriptObject.Create(['
isBaseLayer: false',
'
visibility: false']));
Map.AddLayers([ol_wms,dm_wms]);
Map.AddControl(OpenLayers.Control.LayerSwitcher);
Map.ZoomToMaxExtent;
end;
end;
Es wird also wirklich nur das
API geladen und ein Container für die Karte angelegt. Der Rest geschieht wie bei den Google-Wrappern in einer (nahezu) eins-zu-eins Umsetzung des JavaScript-Codes in Delphi:
Code:
var map = new OpenLayers.Map("map");
var ol_wms = new OpenLayers.Layer.WMS(
"OpenLayers WMS",
"http://vmap0.tiles.osgeo.org/wms/vmap0",
{layers: "basic"}
);
var dm_wms = new OpenLayers.Layer.WMS(
"Canadian Data",
"http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
{
layers: "bathymetry,land_fn,park,drain_fn,drainage," +
"prov_bound,fedlimit,rail,road,popplace",
transparent: "true",
format: "image/png"
},
{isBaseLayer: false, visibility: false}
);
map.addLayers([ol_wms, dm_wms]);
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToMaxExtent();
Anmerkung: Das kanadische Overlay funktioniert weder im Original noch in der Delphi-Umsetzung - wahrscheinlich liefert der Server keine Daten mehr (keine Ahnung, wie alt diese Demo ist). Dadurch sieht man allerdings schön den Aufbau und die Größe der Bildkacheln.
Da der Quelltext des Beispiels momentan nicht compilierbar ist (ich habe einige Erweiterungen an den Units des Frameworks vorgenommen), hänge ich einfach die fertige Demo an.