Mapnik: Umbruch bei Namen in verschiedenen Schreibrichtungen

Tag zusammen,

ich beschäftige mich mit der Frage, wie man zweisprachige Namen auf eine Karte bringt, also sowas wie “Athen (Αθήνα)”.
Dabei entstehen natürlich recht lange Namen, die beim Rendern umgebrochen werden. Solange die Schrift in eine Richtung läuft, ist das kein grosses Problem: Man bricht an jedem Leerzeichen um, oder vielleicht nochmal an der Sprachgrenze, damit die Sprachen mit etwas Glück in je einer Zeile bleiben.

Aber was macht man mit Sprachen, deren Schreibrichtung gegeneinander läuft?

Meine ersten Versuche laufen jedenfalls schief. Ich nehme den Namen in lateinischen Buchstaben, hänge den z.B. hebräischen dran und werfe das Mapnik vor. Mapnik liest von links nach rechts und bricht ohne Rücksicht auf die Schreibrichtung um. Das letzte Wort des hebräischen (also das linke) landet dann in der oberen Zeile. Aus Kirjat Schmona / קרית שמונה wird dann das da:

Dabei sollten meinen nicht vorhandenen Hebräischkenntnissen (und dem Zeilenumbruch der Wikipedia) zufolge das hier die korrekten Schreibweisen sein:

Ein Vergleich mit der Katrte der Geofabrik half auch nicht weiter, die macht wohl einen ähnlichen Fehler, nur dass sie den lateinischen Text verwürfelt. Lyrk, zumindest in dem Stil, den graphhopper verwendet, scheint auch der Geofabrik zu folgen.

Hat irgendwer eine Idee, wie man die beiden Schreibrichtungen sinnvoll unter einen Hut bringen kann? Mir fällt nur ein, den Umbruch zu verbieten oder den Fehler zu übersehen.

Grüße, Max

PS: Probleme mit Schriften, die von oben nach unten laufen, übersehe ich einfach, auch wenn es interessante Designideen dazu gäbe… :wink:

Ideen leider nicht - nur das gleiche Problem in einem anderen Umfeld :frowning:

Frage: was macht er denn, wenn da nur der hebräische oder auch arabische Name steht und nicht genug Platz vorhanden ist?
Ich vermute ja den gleichen Mist (2. Wort vor dem ersten)

Gruss
walter

Frag mal bei Stephan Knaus aus München [1] nach, der hat beim Februar Hack Weekend in Karlsruhe stundenlange mit ein oder zwei Kollegen über Transkription diskutiert im Zusammenhang mit 4 chineischen Dialekten und anderen Sprachen, da gings auch ums rendern.

viele Grüße

Dietmar

[1] http://wiki.openstreetmap.org/wiki/User:Stephankn

Das macht er richtig:

Moin,

Wenn der Renderer jetzt noch bei erst hebräisch und dann lateinisch den lateinischen vermurxt, weiß man wenigstens, wonach er sich richtet.
Kann man ihm evtl. zwei getrennte Label mit Versatz zum Fraß vorwerfen?

Gruß
Georg
(Ohne jegliche Renderkenntnisse)

Ja, so ist es

Wobei mir nicht klar ist, wer das eigentlich bestimmt. Postgis liefert " ‘(’||name||') 'name:de " und das erste der beiden Felder scheint darüber zu bestimmen, was die Schreibrichtung des gesamten Ausdrucks ist. Der erste Buchstabe, den Mapnik sieht kann es nicht sein, der ist ja eine Klammer. Kriegt man mit SQL-Mitteln irgendwie raus, was Postgresql über eine Zeichenkette sich so denkt?

Mal sehn… das wollte ich mir eigentlich sparen, weil eigentlich macht Mapnik das Umbrechen der Labels bestimmt geschickter als irgendwas von mir ausgedachtes…

Grüße,
xaM

Hab auf die Schnelle nix gefunden, glaube es allerdings auch nicht.

Hier mal ein Artikel zu dem Thema: http://symbolcodes.tlt.psu.edu/web/tips/align.html

da stehen Tips drin und gdazu der Hinweis “The Unicode specification includes a directionaly specification for each character depending on its script. Many including Latin A,B,C, etc are encoded as LTR (left to right), but characters from RTL scripts such as Arabic, Hebrew and others are encoded as being RTL.”

Also kann man bei jedem Zeichen feststellen, wie er “gestrickt” ist.

Wäre doch mal ein Ansatz.

In Postgresql würde ich das mit einer Funktion erledigen, die den gemischten Namen so umbaut, daß Mapnik das richtig rendert. Ist aber keine leichte Sache, wenn man noch nie PG/SQL-Funktionen geschrieben hat. Ich grübel mal ein wenig. Blöd nur, daß ich kein Mapnik am laufen habe.

Gruss
walter

gerade im israelischen Forum gefunden: http://forum.openstreetmap.org/viewtopic.php?id=13333 Daher ist das Flickwerk mit Postgresql wohl nicht der richtige Weg.

Moins,

Der LTR-Algorithmus bearbeitet Druck- oder Anzeigezeilen und “spiegelt” nicht einzelne Wörter, sondern möglichst lange Zeichenfolgen. Deshalb sind LTR-Algorithmus und Zeilenumbruch nicht kommutativ.

Beweis durch Beispiel:

(A) Nehmen wir an, Griechisch würde von rechts nach links geschrieben:

(1) Zuerst Umbruch, dann LTR-Algorithmus:

Quelltext enthält die Zeichen in Sprech/Sinn-Reihenfolge:

Kirjat Schmona Κιριατ Σχμωνα

Nach Umbruch:

Kirjat
Schmona
Κιριατ
Σχμωνα

Nach LTR-Algorithmus

Kirjat
Schmona
ταιριΚ
ανωμχΣ

OK.

(2) Zuerst LTR-Algorithmus, dann Umbruch:

Quelltext enthält die Zeichen in Sprech/Sinn-Reihenfolge:

Kirjat Schmona Κιριατ Σχμωνα

Nach LTR-Algorithmus (Gruppe aus beiden Wörtern gespiegelt)

Kirjat Schmona ανωμχΣ ταιριΚ

Nach Umbruch:

Kirjat
Schmona
ανωμχΣ
ταιριΚ

HMPF!

(B) Die hebräischen Zeichen habe ich in “x” geklammert, da sonst der LTR-Algorithmus im Browser startet und meine Beispiele verunstaltet:

(1) Zuerst Umbruch, dann LTR-Algorithmus:

Quelltext enthält die Zeichen in Sprech/Sinn-Reihenfolge:

·K·i·r·j·a·t ·S·c·h·m·o·n·a· xקxרxיxיxתx xשxמxוxנxהx

Nach Umbruch:

·K·i·r·j·a·t
·S·c·h·m·o·n·a·
xקxרxיxיxתx
xשxמxוxנxהx

Nach LTR-Algorithmus

·K·i·r·j·a·t
·S·c·h·m·o·n·a·
xתxיxיxרxקx
xהxנxוxמxשx

OK.

(2) Zuerst LTR-Algorithmus, dann Umbruch:

Quelltext enthält die Zeichen in Sprech/Sinn-Reihenfolge:

·K·i·r·j·a·t· ·S·c·h·m·o·n·a· xקxרxיxיxתx xשxמxוxנxהx

Nach LTR-Algorithmus (Gruppe aus beiden Wörtern gespiegelt)

·K·i·r·j·a·t· ·S·c·h·m·o·n·a· xהxנxוxמxשx xתxיxיxרxקx

Nach Umbruch:

·K·i·r·j·a·t·
·S·c·h·m·o·n·a·
xהxנxוxמxשx
xתxיxיxרxקx

HMPF!

Merksatz:
“Bricht er nach der LTR um, schaut der Programmierer aus dumm.”

Gruß Wolf (Denker und Dichter)

Btw.: mit Transkriptionen hat die Problemstellung nichts zu tun.

Im mapnik harfbuzz branch wurde in der Richtung wohl einiges verbessert, der soll wohl seit ~ 9. Feb. 2014 im aktuellen master sein.

https://github.com/mapnik/mapnik/issues/2043

Nahmd,

Möglicherweise verwendet auch Mapnik den offiziellen Algorithmus zur Darstellung von Texten unterschiedlicher Schreibrichtung. Der berücksicht auch nicht richtungsbestimmende Zeichen wie die Klammer. Kommt auch mit arabischen Zahlen in einem lateinischen Zitat in einem hebräischen Zitat in einem lateinischen Text zurecht. Ist deshalb auch nicht ganz trivial.

Gruß Wolf

Ich habe es mal mit mapnik 2.2.0 mit dem Harfbuzz-Branch ausprobiert.

zu rendernder String ‘Nordrhein-Westfalen (נורדריין-וסטפאליה)’

ohne wrap-length

und dann mit wrap-length=50

was will man mehr.

Gruss
walter

Installation von Mapnik 2.2.0 mit Harfbuzz

git clone https://github.com/mapnik/mapnik.git
cd mapnik 
git checkout harfbuzz
./configure
make
sudo make install

Achtung: Überschreibt die alte Version Läßt sich so wieder herstellen (wenn man das unbedingt will):

git checkout v2.2.0
./configure
make
sudo make install

@max Hier noch eine Kleinigkeit, die du eventuell gebrauchen kannst:


       <Parameter name="table">
          (select st_centroid(way) way,
                  name || case 
                             when (tags->'name:he') != '' then ' ('||(tags->'name:he')||')' 
                             else '' 
                          end "name" 
             from planet_osm_polygon 
            where osm_id = -62771) as boundary
       </Parameter>

der CASE (Zeilen 3-6) verkettet den Namen “name” mit “( …hebräischer name…)” nur dann, wenn es den Tag auch gibt.

Der wird zumindest irgendwo auf der genannten Github-Seite erwähnt (siehe Post #9)

Super, danke für den Test! Funktioniert das auch so im master? Angeblich soll ja inzwischen alles dort angekommen sein.

Vielen Dank! Ich hab viel über Schriftzeichen und Computer gelernt. Man stellt sich so was ja immer sehr einfach vor, bis man plötzlich die einfachen Sachen selbst machen muss :wink:

Besonderen Dank an die Harfbuzz-Entdecker und -Probierer, das wäre wohl die Lösung. Ich kann sowas nicht selbst testen, ich bin auf dem Server auch nur zu Gast als gemeinlöschbarer User.

Ich muss da aber noch bisschen Zeit vergehen lassen… Ein wesentliches Merkmal der Karte auf osm.de ist ja, dass sie um jeden Preis exotische Namen und Schriften vermeidet. Deshalb nimmt sie falls vorhanden “name:de”, dann “name:int”, dann “name:en” und nur im Notfall “name”. Der wird aber nicht in seiner eigenen Schrift gezeigt, sondern transliteriert, falls nötig.

Führt man jetzt ein, dass hinter name:de auch noch der lokale Name stehen soll, führt das dazu, dass nur Orte, die es auch auf deutsch gibt einen einheimischen Namen in seiner einheimischen Schrift dahinter stehen haben. Orte, zu denen es keinen deutschen aber einen englischen Namen gibt, haben das nicht. Orte, die gar keine westlichen Namen haben werden transliteriert. Das wirkt dann insgesamt ein wenig uneinheitlich.

Grüße, Max

Nein, eben nicht! Sonst hätte ich die Klimmzüge doch nicht gemacht. Du musst derzeit den Harfbuzz-Branch nehmen.

Der einzige Unterschied ist, daß Texte nach UTF begutachtet und entsprechend umgebrochen werden. Übrigens für alle Sprachen.

Gruss
walter

ps: nach 1 Jahr Mapnik-Pause hat es ein wenig gedauert, aber jetzt hab ich den wieder “drin” :slight_smile:

Falls es zu dem Thema neue relevante Erkenntnisse gibt, so wäre IMHO im OSM-Wiki die Seite http://wiki.openstreetmap.org/wiki/Map_internationalization eine gute Sammelstelle, oder?