eigene Tiles hosten

In der April-Ausgabe der iX gibt es einen ausführlichen Artikel über “OSM-Daten in eigenen Karten nutzen”:
http://www.heise.de/ix/inhalt/2012/04/136/

mdk

Hab zwar keine Erfahrung damit, aber aus einer von TileMill erzeugten MBTiles Datei müsste sich mit mbutil auch ein Tile-Verzeichnis exportieren lassen, siehe FAQ.

polytiles.py aus dem Standard-Mapnik-Paket scheint sowas auch zu machen. Habs nur noch nie probiert.

Gruß,
ajoessen

  1. Metatile wird auf die Platte geschrieben und später wieder von anderem Tool weiterverarbeitet
  2. Metatile wird nur im Speicher gerendert und gleich in Einzelkacheln gespeichert, Metatile taucht auf Platte nie auf
  1. Nein.
  2. Entsprechendes Python Skript.

Nein, das Eine hat mit dem Anderen nichts zu tun.

Um die Beschriftung zu erhalten wird normalerweise ein zusätzlicher Rand von 1/2 Tile mitgerendert und verworfen. Das kann man auch für einzelne Tiles machen. Umgekehrt kann man auch Metatiles ohne Rand rendern.

bye
Nop

Danke für den Tipp. Das wär ja top wenn das geht. Hatte mich gerade in Mapnik ein bißchen eingelesen. Das scheint ja ne Quälerei zu sein damit zu arbeiten.

Weiß jemand wie ich dieses mbutil zum laufen bekomme? Python habe ich installiert aber ich habe keine Ahnung was ich da starten oder ob ich das Ding noch installieren muss.

Am Anfang stehen einige Bibliotheken, die er laden möchte:


import sqlite3, uuid, sys, logging, time, os, json, zlib, glob, shutil

Die musst du erst mal an der richtigen Stelle installiert haben, sonst läuft da nix.

Der Vorteil von Mapnik ist halt, dass alle Abhängigkeiten gut dokumentiert sind. Bei Exoten wie mbutil kommt man nicht drum herum, den Entwickler danach zu fragen :frowning:

Gruß,
ajoessen

Ich habe jetzt doch mal TileMill ausprobiert und auch gleich das mbutil. Eine Installation ist nicht notwendig, hätte nur den Vorteil, dass mb-util direkt als Kommando verwendet werden kann.

Bei mir hat folgender Aufruf funktioniert (Pfade und Dateiname anpassen):


python C:\Tools\mbutil\mb-util --scheme=osm open-streets-dc.mbtiles D:\tmp\tiles

Habs gestern auch noch hinbekommen. Ich rufe es so auf:

python mb-util test.mbtiles /tmp

Jetzt muss ich nur noch eine passende openlayers oder leaflet Vorlage finden. Weiß jemand zufällig wie man die eigenen tiles einbindet? Hatte gestern schon mit der Anleitung im Wiki http://wiki.openstreetmap.org/wiki/OpenLayers_Local_Tiles_Example getestet aber das schein nicht ganz das richtige zu sein.

Edit: Was machste du denn mit dem Schalter --scheme ?

http://wiki.openstreetmap.org/wiki/User:Ajoessen/Osmviewer_und_GPXviewer

Und die dort verlinkte zip-Datei studieren :wink:

Weitere Nutzungsmöglichkeiten siehe hier:
http://wiki.openstreetmap.org/wiki/User:Ajoessen/eigene_Tiles#Verwendung_der_Tiles

Gruß,
ajoessen

Das schaut gut aus. Habs grad mal getestet und wie nicht anders zu erwarten geht es nicht. Ich habe mein Verzeichnis auf dem Webspace eingebunden und meine Karte wird nicht angezeigt. Habe das dann mal mit Chrome untersucht. Meine Verzeichnisstruktur nach dem Export mit mbutil stimmt soweit. Er findet aber die einzelnen Kacheln nicht. Er sucht nach dateien die bspw. so heißen: http://www.blabla/tiles/14/8801/5291.png bei mir heißen die Tiles nach dem Export aber http://www.blabla/tiles/14/8801/11092.png. Die Dateien haben also den falschen Dateinamen. Ich hatte irgendwo gelesen das das mbtiles Format spherical Mercator benutzt. Kann ich das bei der Projektion in der karten.js des gpx viewers irgendwo einstellen?

Man alles schwerer als gedacht. Wenn ich das zum laufen bekomme muss ich wohl ein dickes Tutorial dafür schreiben.

Es gibt da verschiedene Weltanschauungen, wie man die Tiles nummeriert. Google und OSM fangen oben an (bei 85° Nord, die offizielle TMS_Spezifikation fängt unten an, bei 85° Süd.

Umrechnung: ty1=(2**zoom - 1) - ty

Du kannst dir mal probeweise maptiler anschauen. Die nummerieren auch “verkehrt herum”, und bauen eine eigene Openlayers-Anwendung, die es dann richtigherum darstellt. Oder per script umnummerieren, oder sich einfach an die Standard-Mapnik-Toolchain halten :wink:

EDIT: Hier gibts was zum Anschauen:
http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/

Das hab ich schon hinter mir :wink:

Gruuß,
ajoessen

Genau das kann man mit --scheme ändern, indem man vom Nummerierungs-Schema TMS auf Google/OSM umstellt, ajoessen hat das ja schon erklärt:

Na das muss man erstmal wissen. In der Beschreibung zu mbutil steht ja zu den Schaltern gar nichts, oder ich habe es nicht gefunden :frowning: D.h. wenn ich mb-util mit dem Schalter --scheme=osm nochmal laufen lasse geht das mit einer Standard implementierung von Openlayers?

Ich habs aus der Hilfe (mb-util -h). Ja, die mit --scheme=osm generierten Files können ganz normal mit OpenLayers.Layer.OSM verwendet werden.

Es gibt zwar auch OpenLayers.Layer.TMS, das mit der jetzigen Struktur umgehen könnte, weiß aber nicht ob das so ganz ohne Meta-Infos funktioniert.

Schade, Tante guhgel scheint es nicht zu kennen. War das nicht eventuell doch in C programmiert?

Gruß,
ajoessen

So habe es jetzt hinbekommen und die Karte funktioniert so. Danke nochmal für die Hilfe.

Nun habe ich gleich ein neues Problem: Ich lasse mir per Overpass API verschiedene Pois auf meine Karte einblenden. Die lassen sich ja an- und abschalten. Wenn ich meine Karte lade sind die aber grundsätzlich eingeschaltet, ich will das jetzt aber so das die Pois beim Laden der Karte nicht angezeigt werden. Hat dafür jemand ein Codebeispiel? Ich kann ja mal meinen Code posten mit dem ich die Abfrage mache:

arztlayer = new OpenLayers.Layer.Vector("Ärzte in NB", {styleMap: styleMaparzt,
                    strategies: [new OpenLayers.Strategy.Fixed()],
                    protocol: new OpenLayers.Protocol.HTTP({
                        url: "arzt.xapi",   
			format: new OpenLayers.Format.OSM()
                    }),
                    projection: new OpenLayers.Projection("EPSG:4326")
                });
 
                map.addLayers([arztlayer]);
				
				var options = {hover: false, onSelect: onFeatureSelect, onUnselect: onFeatureUnselect };
				selectControl = new OpenLayers.Control.SelectFeature(arztlayer, options);
				map.addControl(selectControl);
				selectControl.activate();

Man kann dann auf die angezeigten Punkte auf der Karte klicken und die Daten werden aus der Overpass Api bzw. der arzt.xapi angezeigt:

//Beginn Popuhandling
	var selectControl;
	var selectedFeature;
	function onPopupClose(evt) {
    selectControl.unselect(selectedFeature);
}
	function onFeatureSelect(feature) {
    selectedFeature = feature;
    var tags = feature.attributes;
    var infoHtml = "<table>";
    for (var key in tags) {
       infoHtml += "<tr><td>" + key + "</td><td>" + tags[key] + "</td></tr>";
    }
    infoHtml += "</table>";
    popup = new OpenLayers.Popup.FramedCloud("chicken", 
                             feature.geometry.getBounds().getCenterLonLat(),
                             null,
                             infoHtml,
                             null, true, onPopupClose);
    feature.popup = popup;
    map.addPopup(popup);
}
	function onFeatureUnselect(feature) {
    map.removePopup(feature.popup);
    feature.popup.destroy();
    feature.popup = null;
}
 //Ende Popuphandling

Kann ich die Größe des Popups beeinflußen, im speziellen die Breite?

Bei allen OpenLayers.Layer.WasAuchImmer kannst Du einen Parameter “visibility” übergeben. Übergibst Du “false”, ist der Layer per Default deaktiviert:


arztlayer = new OpenLayers.Layer.Vector("Ärzte in NB", {styleMap: styleMaparzt,
                    visibility: false,
                    strategies: [new OpenLayers.Strategy.Fixed()],
[…]

Gruß Wolf

Nahmd,

Der Konstruktor der “OpenLayers.Popup.FramedCloud”-Klasse akzeptiert als drittes Argument eine Pixelgröße. Du übergibst an der Stelle ein “null”. Du kannst da auch eine gewünschte Größe angeben:


popup = new OpenLayers.Popup.FramedCloud("chicken", 
    feature.geometry.getBounds().getCenterLonLat(),
    new OpenLayers.Size (300, 200),
    infoHtml,
[…]

Gruß Wolf

Danke Dir für den Code :slight_smile: