ich bin nach etwas Sucherei auf die schöne Komponente LazMapViewer gestoßen, die fast alles kann was ich benötige.
Es hat eine Weile gedauert, bis ich alle ergänzend benötigten Komponenten zusammen hatte. Es wäre schön eine Liste davon zu haben, was, von wo und in welcher Reihenfolge zu Laden und zu Installieren ist

Das "fast alles kann" bezieht sich auf die Option, lokale Dateien (also auf der eigenen Festplatte, Netzlaufwerk etc) verwenden zu können.
Es gibt das Projekt Maperitive (http://maperitive.net/), welches es erlaubt eigene OSM-Tiles im eigenen Layout zu rendern und so für höhere Zugriffszahlen auf eigene Ressourcen zu setzen. Diese dort generierten Tiles wollte ich gerne einlesen.
Ich war in der Lage, das zu realisieren.
Dazu war es nötig eine abgeleitete Klasse zur vorhandenen Download-Engine zu erstellen, die erkennt, ob eine lokale Datei anstelle einer Datei aus dem Internet zu laden ist.
Diese Klasse heißt jetzt der Nomenklatur des Projektes folgend TMVDLEFFPCTFR, die komplette Datei ist angehängt. Die einzige Methode die überschrieben wurde ist die Methode "DownloadFile":
Code: Alles auswählen
procedure TMVDLEFFPCTFR.DownloadFile(const Url: string; AStream: TStream);
const
FILE_SCHEME : String = 'FILE:///';
var
fs : TFileStream;
fn : String;
s : String;
begin
s := UpperCase(Copy(Url,1,Length(FILE_SCHEME)));
if s <> FILE_SCHEME then
begin // The URL-Scheme is not file, try the default loading stuff
inherited;
Exit;
end;
{$IFDEF LOG_URL}
DebugLn(Url);
{$ENDIF}
fn := Copy(Url,Length(FILE_SCHEME)+1,MaxInt); // Extract the file-path
if not FileExists(fn) then Exit; // If the file does not exists, exit
fs := Nil;
try
try
fs := TFileStream.Create(fn,fmOpenRead); //Open the Tile-File
AStream.CopyFrom(fs,fs.Size); //Copy the contentn into the strem
AStream.Position := 0;
except
end;
finally
if Assigned(fs) then
fs.Free;
end;
end;
Zusätzlich muss noch ein weiterer "MapProvider" erzeugt werden, der den Zugriff auf die Dateien enthält.
Im Wesentlichen beschränken sich die Änderungen auf das "FormCreate"-Event. Die Datei ist ebenfalls angefügt.
Code: Alles auswählen
FMvDlEFileReader := TMVDLEFFPCTFR.Create(Nil);
MapView.DownloadEngine := FMvDlEFileReader;
// Read from Files, generated by Maperitive (http://maperitive.net/)
MapView.Engine.AddMapProvider('OpenStreetMap Maperitive-Files', ptEPSG3857, 'file:///C:/Program_Files/Maperitive/Tiles/%z%/%x%/%y%.png', 0, 19, 3,Nil);
Schönen Sonntag.