Ich wurde gebeten, die technische Seite zur
Nutzung interaktiver Karten etwas zu erklären.
An dieser Stelle fange ich mal an... bei Fragen, fragen.
Zunächst mal: Ich verwende
LeafletJS.
Wie man sehen kann, ist die
Dokumentation ziemlich gut und vollständig, es gibt
Tutorials und falls nötig auch
Plugins.
Eine Beispiel-Implementierung mit etlichen Funktionen findet man
hier.
HTMLEs handelt sich bei meinen Ansätzen jeweils um eine ganz simple HTML-Seite, in die erstmal nur ein div-Element für die Karte eingebunden wird.
Der Rest passiert im JavaScript.
KarteAls Basis nutze ich eine
nicht-geographische Karte - aus offensichtlichen Gründen (falls es nicht offensichtlich ist: Ich habe hier keine geographische Karte, sondern eher den Ausschnitt einer solchen).
Die Ausgangsgröße setze ich anhand der tatsächlichen Bilddatei. Das ist dann die Maximalgröße - man kann nicht weiter herauszoomen.
Die Marker sind als normale Popups eingebunden und werden je nach Typ einer Ebene (Layer) zugeordnet. So kann man dann alle Marker gleichen Typs ein- oder ausblenden, indem man den Layer ein- oder ausblendet.
Custom IconsUm verschiedenartige Typen von Markern andersfarbig darzustellen, hole ich mir die entsprechenden Icons von außerhalb, z.B.
grün.
Dazu wird ein
Schatten-Icon verwendet, damit es nicht so platt aussieht.
Beides zusammen wird in einer Klasse zusammengefasst:
var coloredIcon = L.Icon.extend({
options: {
shadowUrl: 'https://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.7/images/marker-shadow.png',
iconSize: [25, 41],
shadowSize: [41, 41],
iconAnchor: [12, 41],
popupAnchor: [1, -34]
}
});
var greenIcon = new coloredIcon({iconUrl: 'https://cdn.rawgit.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png'});
Linien und FlächenLeaflet bietet dafür Bordmittel, die letztlich nichts anderes als SVG sind. Siehe
Polyline und
Polygon.
Die Daten dafür hole ich aus JSON-Arrays, die als Array an Polyline oder Polygon übergeben werden. Eine Linie oder Fläche kann dabei auch aus mehreren Teilen bestehen (unterbrochene Linie bzw. mehrere Flächen, die inhaltlich zusammengehören). Dazu übergibt man einfach ein Array von Arrays an Polyline oder Polyon.
var line = [];
if (data.ways[i].show){
for (wp in data.ways[i].waypoints) {
line.push(data.ways[i].waypoints[wp]);
}
L.polyline(line, {color: "black"}).bindTooltip(name).addTo(legionWay);
}
DatenWie geschrieben kommen die Daten aus simplen JSON-Dateien.
Die baue ich je nach Bedarf der Karten (nicht jede Karte benötigt Linien oder Flächen). Einfache Informationen werden flach abgelegt.
Im JavaScript lese ich sämtliche Daten und baue sie nach Bedarf zusammen. Einige werden zur Anzeige von Elementen genutzt (z.B. die Wegpunkte einer Linie), andere dienen der Anzeige-Steuerung (z.B. "show":true), andere werden direkt als auszugebender Text verwendet und an der entsprechenden Stelle beispielsweise als Tooltip zu einer Fläche eingebunden.
{
"name":"Assault Mission",
"opponent":"",
"addinfo":"",
"positionLat":20,
"positionLng":850,
"type":"legend",
"missiontype":"assault",
"missionpriority":"",
"outcome":""
}
Gelesen werden die Daten mittels AJAX (XMLHttpRequest).
HostingDerzeit hoste ich die Karten noch auf einem lokalen Tomcat. Ich betreibe keinen Webspace und habe auch keinen eingekauft.
Wenn wir online spielen können die Mitspieler derzeit also noch nicht selbst darauf zugreifen. Das regeln wir aber, wenn ich soweit mit der Alpha-Version zufrieden bin.
Fehlende FunktionenDa ist noch einiges zu tun, aber am wichtigsten ist wohl, daß man die Daten nicht manuell in den JSON-Dateien anlegen muß.
Dafür fehlt mir aber noch ein vernünftiges Konzept zur Eingabe der verschiedenen Arten von Informationen.
Soweit erstmal als Einstiegsübersicht...
Eine komplette Beispiel-Implementierung zeige ich hier jetzt mal nicht - ist ja kein Entwickler-Forum und ich bin kein Web-Entwickler (komme aus der Datenbank-Ecke und daher sieht mein Quellcode für Profis wahrscheinlich wie Hühnergescharre aus)
Wenn es konkrete Fragen gibt, kann ich gern detaillierter darauf eingehen.