Ubuntupaket für lokalen Tileserver

Jetzt bringen wir aber ein paar Dinge durcheinander :wink:
“postgres” ist nur ein “normaler” auf shell-Ebene:
$ grep postgres /etc/passwd
postgres:x:106:106:PostgreSQL administrator,:/var/lib/postgresql:/bin/bash

Der Administrator/Superuser unter linux heisst “root” bzw. eine Kennung mit UID=0

Postgres verwendet in Linux per default das “Ident” Verfahren zur Authentifizierung. Das heisst, wenn man sich als lokaler Unix user “xyz” bei postgres mit dem Benutzer “xyz” anmelden will, braucht man kein Passwort, denn man ist ja bereits als dieser im Betriebssystem angemeldet. Demzufolge legt Postgres per default auch keine Passwoerter fuer User (wie z.B. fuer den postgres super user) an. Man kann sich demzufolge auch nicht per passwort anmelden, da keines existiert. Allerdings funktioniert das Identverfahren glaube ich nur ueber lokale unix sockets und nicht ueber das netzwerk oder tcp sockets.

Es ist nicht immer ganz klar ob sich ein Programm mit postgres per unix oder tcp socket verbindet. Letzteres klappt dann meistens nicht, es sei denn man hat passwoerter festgelegt und das password authentifizierungs system in der config datei aktiviert. Manchmal hilft das “host” Feld blank zu lassen anstelle von localhost zu verwenden.

kann man eigentlich auch mehrere Bundesländer nacheinander einlesen?
Falls ja, sind die Daten an den Grenzen dann ok, oder irgendwie abgeschnitten?
Chris

Müsste mit dem Parameter “-a” wie “append” gehen. Oder man führt die Daten der verschiedenen Bundesländer vorher mit Osmosis oder osmconvert zu einer einzigen Datei zusammen. Wichtig ist aber, dass diese Extrakte vorher so ausgeschnitten wurden, dass Referenzen auf jeweils außerhalb liegende Knoten nicht gelöscht werden.

Hab’ jetzt mal mittelfranken und oberpfalz ausprobiert, sind zwar keine Länder sondern nur Regierungsbezirke aber benachbart.
Zuerst mittelfranken, dann oberpfalz => mittelfranken weg.
Nungut, dann halt mittelfranken hinzu mittels “-a” =>


Reading in file: mittelfranken.osm.pbf
Processing: Node(2343k 75.6k/s) Way(362k 3.51k/s) Relation(0 0.00/s)COPY_END for COPY planet_osm_ways FROM STDIN;
 failed: FEHLER:  doppelter Schlüsselwert verletzt Unique-Constraint »planet_osm_ways_pkey«
CONTEXT:  COPY planet_osm_ways, Zeile 1549: »4361184    {26262442,294294135,26262443,294294552,26582221,26582222,26582223,299352747,26582224,2658222...«

Error occurred, cleaning up

Ciao,
Frank

Tipp von Frederik:


Vermutlich kannst Du es austricksen, wenn Dir das die Muehe wert ist, indem Du aus dem .osm ein .osc machst.
Du musst das PBF erst nach XML konvertieren und dann statt
<osm>..</osm>
ein
<osmChange><modify>...</modify></osmChange>
drum setzen. 

Cool, funktionokelt! Auch optisch an den Grenzübergängen überprüft.

Leider wird es dadurch schnecken-langsam:

$ LD_LIBRARY_PATH=/usr/local/lib osm2pgsql -U postgres -s -a kleines_mittelfränkisches_dorf_nahe_oberpfalz.osm

Processing: Node(5k 0.3k/s) Way(0k 0.08k/s) Relation(68 3.40/s) parse time: 46s

Ciao,
Frank

Sorry, das mit der Änderung des Dateityps hatte ich vergessen. :frowning:

osm2pgsql kann in diesem Fall kein SQL-Insert verwenden, weil ja damit gerechnet werden muss, dass das betreffende Objekt schon existiert. SQL-Update läuft leider deutlich langsamer.
Wenns ZU langsam ist, dann kannst du noch den Trick mit dem Mergen der Dateien versuchen. Bei Extrakten von Geofabrik sollte das gehen:

./osmconvert mittelfranken.osm oberfranken.osm unterfranken.osm >franken.osm

Mmh, es ist nicht nur ein bischen langamer, es ist (bei mir) ca. 200x langsamer (75.6k/s <=> 0.3k/s)!

In meiner Naivität hab’ ich
bin/osmosis --rxc file=mittelfranken.osc --write-pbf file=mfr.pbf
probiert (um anschließend das pbf wieder einzuspielen), was aber nicht funzt:
SCHWERWIEGEND: Execution aborted.
org.openstreetmap.osmosis.core.OsmosisRuntimeException: Task 2-write-pbf does not support data provided by default pipe stored at level 1 in the default pipe stack.

Wenn ich nun über Weg 2 gehe (mergen der (osm-)Dateien, Einspielen des merger in die Datenbank, Aufbewahren
der osm-Dateien, später: droppen der Datenbank, mergen der osm-Datei mit einem Update, Einspielen)
erschließt sich mir der Sinn einer Datenbank nicht mehr, da kann man ja gleich die (osm-)Dateien benutzen :wink:

Ciao,
Frank

Nein kannst du aus performance gründen beim rendern größerer Gebiete nicht. Denn dafür musst du die Daten komplett vorhalten oder jedesmal wieder neu einlesen. Gerade für solche Speicherplatzknauserer wie du ist das die einzige Möglichkeit auch mal ein ganze Bundesland zu rendern. Jedenfalls wenn an der Festplatte nicht auch noch gespart wurde.

Mmh, ich spreche jetzt vom nicht-ambitionierten Tileserverbetreiber, welcher mit
viel Mueh und Hingabe Dtl. sich eingerichtet hat und nach Wochen (Monaten) sein
geliebtes Mittelfranken updaten moechte.
Ihm wuerde dann gesagt: Watten? Upgraden? Viel zu lange. Dtl. neu einspielen!

:frowning:

Das verstehe ich jetzt nicht. Es gibt doch die Region Mittelfranken. Und du hast selbst festgestellt, dass ein Update offenbar deutlich länger braucht als ein neu einspielen. Bei dir waren es 200x so lange. Glaubst du wenn es um zwei oder drei Regionen geht, dass es dann wirklich noch einen zeitlichen Unterschied macht? Außerdem werden wir keinen Einschränken in seinen Freiheiten. Es scheint nur wenig sinnvoll zu sein. Eventuell könnte aber auch osm2pgsql angepasst werden und dort eine Kontrolle erfolgen, ob das Element bereits existiert und es andernfalls mit Insert einlesen. Da aber osm2pgsql geschrieben wurde um einen Planeten zu verwalten, ist das Interesse des Entwicklers möglicherweise begrenzt.

Achwo.

Du kannst bei postgresql auch mehr als eine Datenbank am Laufen halten.
Bei mir gibts osmdb, bboxdb und powerdb.
Man muß vor dem Rendern nur die datasource.inc austauschen, damit sich Mapnik bei der richtigen Datenquelle bedient. Dafür gibts bei mir entsprechende batch-Dateien.

Beim Rendern muß man noch drauf achten, dass die zu rendernden Tiles alle komplett innerhalb des Extraktbereichs leigen, sonst gibts weiße Flächen.
Deshalb rendere ich dann in ein Test-Verzeichnis, und sondere halbvolle Tiles aus, bevor ich die brauchbaren ins richtige Verzeichnis kopiere.

Gruß,
ajoessen

Hast Du 'ne Anleitung dazu?

Versteh ich jetzt nicht, wie mehrfach vorhandene Datenbanken mein Problem löst:
Einmaliges Einspielen eines etwas größeren Bereich (z. B. Dtl.) und dann in unregelmäßigen Abständen
Updaten eines wesentlichen kleineren Bereichs (z. B. Mittelfranken).

Desweitern denke ich, dass dieser Anwendungsfall für nicht-power-user häufiger auftreten wird als den Planeten minütlich up2date zu halten.

Habe heut’ früh mit Markus’ neuen osmconvert
kleines_mittelfränkische_dorf_nahe_oberpfalz.osm in pbf konviert und dann per osm2pgsql eingelesen.
Ging viel schneller ist aber dann abgebrochen.

Schade.

Ciao,
Frank

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

Wieso nicht? Du hast zwei separate Datensätze, und kannst osm2pgsql und mapnik jewelis sagen, welche sie bedienen oder benutzen sollen.
osm2pgsql löscht immer nur den Datensatz, den es anschließend neu befüllt.

Edit: Für Höhenlinien hatte ich auch eine separate Datenbank srtm2db angelegt, mit der ich mir einen transparenten Höhenlayer erzeugt habe.

gruß,
ajoessen

Also Die Aussage ist jetzt einfach, dass es günstiger ist sich das zwei oder drei Bundesländer schnell in je eine Datenbank einzulesen, anstatt ganz Deutschland und dies dann auch noch mühselig aktuell halten. Zum Beispiel könntest du dir Bayern und BaWÜ in die Datenbank legen und wärst damit wahrscheinlich schneller fertig, als wenn du dir Deutschland anlegst.
Das Problem ist, dass man dann im überscheidenden Bereich Probleme bekommt.
Das aktuell halten von lokalen Datenbanken welche nur einen Ausschnitt beinhalten ist eh schwierig. Da es diffs nur für den Planeten gibt. Damit müssen auch die Poweruser gelegentlich ihre Datenbank neuaufsetzen.

Der von dir beschriebene Weg klingt sehr interessant. Du willst quasi immer nur einen kleinen Bereich aktuell halten. Das geht meiner Meinung nach am Besten, wenn du dir das Diff selbst erstellst. Dafür brauchst du nur den Ausschnitt vom Tag an dem du ihn eingelesen hast und den aktuellen Stand gegeneiander vergleichen lassen. Dann sollte auch das Diff File viel kleiner werden und sich schneller einlesen lassen.

Ich weiß nicht, ob sich das lohnt:

0,5*0,5 Grad sind in 15 Minuten ausgeschnitten und in die Datenbank gekippt, und 2 Stunden später sind alle Tiles von Zoomstufe 8 bis 16 mit Mapnik gerendert.

Bei 0,1*0,1 Grad dauert der ganze Prozess nur noch 6 Minuten.

Also für unterhalb eines Bundeslandes lohnt sich das diff-einspielen nicht wirklich gegenüber dem neueinspielen.

Gruß,
ajoessen

Ach so,
das waere also dann ein
DB gis-germany (mit “statischen” Inhalt)
sowie eine
DB gis-mittelfranken (mit “dynamischen” Inhalt")
welche ich “update” indem ich sie komplett neu einspiele.

Mmh, dann brauch’ ich aber auch zwei URLs:
http://localhost/osm/slippymap_germany.html

http://localhost/osm/slippymap_mittelfranken.html

?
Und wie mache ich das dann mit dem renderd, kann der dann auch zweimal laufen?

Ciao,
Frank

Nö, die fertigen Tiles wirfst du ins gleiche Verzeichnis.

Den hab ich nicht. Ich rendere alles auf einmal nach dem Datenbankupdate.
Wenn du einen Datensatz aktuell hältst, muß das Rendern auf Anfrage natürlich dorthin zeigen. Darf dann aber nicht über die Grenzen des Bereichs hinausgehen.

Gruß,
ajoessen

Also du brauchst natürlich nicht zwei Slippymaps. Denn du kannst ja auch gerne in deine Map einen weiteren layer integrieren. Den zweiten kleineren Layer legst du obendrüber und fertig.

Du machst auch was ganz anderes Ajoessen. Kellerma hat hier das Serverpacket installiert, welches auf Anfrage bestimmte Tiles renderd. Du hingegen renderst alles verfügbare und stellst es dann auf dem Server aus.
Ob renderd dann zweimal laufen kann, habe ich auch schon gefragt, weil ich gerne transparente Layer oben drüber legen möchte.