länderfläche mit osmarender

Hi

ich versuche aktuell einzelne länder osm-dateien von geofabrik in eine svg grafik umzuwandeln. zum selberrendern bin ich quasi gezwungen weil die karten speziell angepasst sein müssen.

mein problem sind nun die länderflächen. ich hab versucht am beispiel andorra (kleine osm datei, geht schnell zu rendern) die länderfläche komplett auszufüllen.
hierzu hab ich in der angepassten xml-regel datei ganz oben folgendes eingefügt

und
.natural.country {
fill: #FF0000;
}

also vorbild nahm ich die regel aus der map-feature xml datei im stylesheet ordner des osmarender svn
dort steht



also ziehe einfach linien entlang der ländergrenzen. so weit klappt das auch.

allerdings füllt er mir mit dem area nicht das ganze land sondern immer nur vierecke um die einzelstücken der landesgenzen.
siehe

hab ich irgendwas falsch verstanden? gibt es einen anderen weg länderflächen komplett mit osmarender “füllen” zu lassen?
ich wäre für jede hilfe oder denkanstoß dankbar

cd311

Moin,

ich habe zwar überhaupt keine Ahnung von Osmarender, aber ich sehe hier ein logisches Problem.

Bei einer Linie kann der Renderer problemlos einzelne Stücke als Linie rendern.

Aber wie soll der Renderer von sich aus erkennen, welche einzelnen Wegstücke zusammen eine geschlossene Fläche ergeben?
Der Renderer verbindet sichtlich Anfang und Ende der einzelnen Wegstücke linear zu einer Fläche.

Prinzipiell müsste er erstmal aus allen Wegstücken der Grenze von Andorra über die hoffentlich vorhandene Multipolygon-Relation einen in sich geschlossenen Pseudo-Weg erzeugen - nur den kann er dann als Fläche rendern.

Man müsste sich also als Vorlage angucken, wie der Renderer Flächen (area class, z.B. forest, farmland, residential u. a.) aus Multipolygonen (mehrere Wegsegmente) verarbeitet - nicht , wie er Linien zeichnet.

Du solltest vielleicht mal nach

<rule e="relation" k="landuse"

suchen Ist hinfällig, nach einem kurzen Blick ins svn ... die Styles unterstützen natürlich nur ways und nodes.

Gruß
Georg

Möglicherweise ist das Polygon auch nicht geschlossen.

In der OSM-Datenbank ist es “rund”, eventuell ist die Grenze des Geofabrik-Extraktes zu eng gesetzt.

EDIT: Wenn man einfach alle Staatsgrenzen als Polygonrand nimmt, kann das nicht klappen, weil auch die grenze Frankreich-Spanien noch teilweise im Extrakt drin hängt. So kriegt man nie “ein” geschlossenes Polygon.

Mapnik baut sich aus den Grenzrelationen zusätzliche Wege zusammen. Irgendwie müsste das in osmarender auch gemacht werden.

Gruß,
ajoessen

… oder eins zu viel. Mich irritiert der Fortsatz oben links …
Auf jeden Fall muss das aber irgendwie via Relation verarbeitet werden.
Da ich nie über was dazu im Style stolperte, dürfte da was im Hintergrund für Wälder etc. laufen. Bloß ob das genauso automagisch für Grenzen läuft oder ob man da weitere Zauberwörter braucht …

Ich hab mich mal vor zwei Jahren mit osmarender rumgeplagt, um Radrouten darzustellen:

<rule e="relation" k="type" v="route" layer="4">
        <rule e="relation" k="route" v="bicycle" layer="4">
			<rule e="relation" k="network" v="lcn" layer="4">			
				<line class="relationroute-way relationroute-blue" smart-linecap="no"/>
				<circle class="relationroute-blue relationroute-stop" r="0.35px"/>
			</rule>
			<rule e="relation" k="network" v="rcn|ncn" layer="4">			
				<line class="relationroute-way relationroute-green" smart-linecap="no"/>
				<circle class="relationroute-green relationroute-stop" r="0.35px"/>
			</rule>
			<rule e="relation" k="operator" v="Münsterland Tourismus" layer="4">			
				<line class="relationroute-way relationroute-red" smart-linecap="no"/>
				<circle class="relationroute-red relationroute-stop" r="0.35px"/>
			</rule>
        </rule>

</rule>

und kann mich noch vage daran erinnern, dass man am Anfang der xml
showRelationRoute=“yes”>
setzen musste, um überhaupt was zu sehen.

Gruß,
ajoessen

Ich denke mal, hier in der osmarender.xsl liegt der Schlüssel:

<xsl:template name=“generateAreaPath”>
<xsl:variable name=‘relation’ select=“key(‘relationByWay’,@id)[tag[@k=‘type’ and @v=‘multipolygon’]]”/>
xsl:choose
<xsl:when test=‘$relation’>
<!-- Handle multipolygons.

Da wird nur type=multipolygon verarbeitet. Die Grenze hat nun aber mal leider type=border.

Also müsste man das dort ergänzen.

Gruß,
ajoessen

Hi

Erstmal danke für die Antworten

Was bedeute “dort ergänzen”? Ich bin beim besten Willen kein xsl-Experte.
macht es sinn den/die osmarender-Dev darauf aufmerksam zu machen?

cd311

btw. sollte nicht “subscribe to this topic” bedeuten ich werde per mail über neue antworten informiert? hab nur heute durch zufall nochmal vorbeigeschaut und siehe da 5 antworten aber keine mail.

Du kannst mal multipolygon durch border ersetzten und schauen, ob es dann besser aussieht. Du musst das Multipolygon der Grenze Andorras verwenden, nicht pauschal alle Grenzlinien.

ja, aber nur, wenn du auch dein e-mail-Konto für Mailempfang freigeschaltet hast. kann man oben im Profile unter privacy einstellen.

gruß,
ajoessen

Moin,

Sorry für den Widerspruch, aber es heißt type=boundary - nicht border!
Und nicht wundern, dass dann erstmal alle anderen Multipolygon-Flächen verschwunden sind. :wink:

Aber werden die Einzel-Segmente nicht trotzdem noch berücksichtigt - und somit das Renderergebnis nicht korrekt aussehen?
Könnte man das vermeiden, indem man zusätzlich type=boundary der Relation in der Flächen-rule mit auswertet?

Edit:
Etwa so:


<rule e="way" k="admin_level" v="2" layer="5">
  <rule e="way" k="type" v="boundary" >
    <area class="natural country" />
  </rule>
  <else>
    <line class="boundary boundary-level-2-casing no-bezier" layer="5"/>
    <line class="boundary boundary-level-2-core no-bezier" layer="5"/>
  </else>
</rule>

NB:
Was hat der layer da zu bedeuten?

Ansonsten höre ich schon Frederik ob dieser Problematik mit den Hufen scharren … :wink:

Gruß
Georg

Wenn ich http://wiki.openstreetmap.org/wiki/Layer richtig verstanden haben sind das halt 11 schichten von -5 bis 5 (oberste).
normalerweise arbeitet der osmarender die regeln der reihe nach ab und legt spätere flächen über früher. es sei denn man gibt ihm dieses layer-parameter mit.

problematisch ist nur wenn die länderfläche in layer 5 landet überdeckt sie alle anderen features der karte.

cd311

ps: danke für den mailhinweis. ich dachte der übernimmt die wie das login automatisch vom openstreetmap-login.

ich hab jetzt die zwei vorschläge einfach mal durchlaufen lassen.

  1. angepasste osmarender.xsl von ajoessen
    multipolygon durch boundary ersetzt

selbes ergebnis wie vorher. “kästen” um die einzelstücken des polygons

  1. angepasste feature xml von GeorgFausB
    die boundary rule in die feature xml eingefügt

die border wird eingezeichnet aber die boundary rule scheint keine auswirkungen zu haben.

soweit scheint nichts geholfen zu haben bei dem problem

cd311

Moin,

Hätte ich auch so erwartet, allerdings mit komplett gefülltem Innenleben.

also die angepasste xml hat zumindest schonmal dafür gesorgt, dass die Einzel-ways nicht mehr als area behandelt werden - das sehe ich schonmal als Erfolg an, denn nur das war damit beabsichtigt. :wink:

Hast Du die Änderungen nur einzeln oder auch zusammen versucht?

Wenn ich das richtig gesehen habe, kann man im XSLT die Abfrage auch ver-ODERn
siehe z. B. die Zeile
tag[@k=‘area’ and (@v=‘no’ or @v=‘false’)]

also analog
<xsl:variable name=‘relation’ select=“key(‘relationByWay’,@id)[tag[@k=‘type’ and (@v=‘multipolygon’ or @v=‘boundary’)]]”/>

Vielleicht noch einen Versuch mit beiden Änderungen (xsl und xml) wert?

Gruß
Georg

Hallo cd311

Mapnik-Layer ist etwas anderes als das Layer-Tagg in OSM.

Das ist leider nirgendwo im OSM-Wiki (wo ich bisher nachgesehen habe) explizit beschrieben.
Lediglich in http://wiki.openstreetmap.org/wiki/Mapnik_Example gibt es einen Satz dazu:
OpenStreetMap layer tagging is converted by Osm2pgsql into a z_order
parameter in the PostGIS/PostgreSQL database. When retrieving
planet_osm_polygon data below you will see that an ‘order by z_order’
instruction can be used, which ensures layers are rendered in the correct order.

(Umbruch von mir)

Kurz gesagt gibt es in Mapnik (und ähnlich in anderen Renderern) Layer für Eigenschaft wie landuse, highway, buildings usw. Dabei kann es durchaus mehrere Render-Layer für z.B. unterschiedliche highway-Klassen (wie motorway, primary, …, path) geben. Die Zahl in der Mapnik-Definition gibt dabei die Reihenfolge vor, in der die Mapnik-Layer gerendert werden.

Edbert (EvanE)

also jetzt beide einmal die angepasste xsl und die rule in der xml datei
ergebnis ist erschreckend unspannend. grenze wird gezeichnet wie vorher aber keine füllung.

hat noch irgendjemand eine idee?

oh sorry war der falsche link. ich meinte http://wiki.openstreetmap.org/wiki/Osmarender/Layers
da steht auch drüber, dass es verschiedene bedeutungen für layer gibt aber weiter geht es mit der erklärung, dass osmarender die regeln der reihe nach abarbeitet und nur wenn man den layer parameter setzt diese extra anpasst.

cd311

Mich irritiert weiterhin der rote “Speer” oben links.
Das sieht danach aus, als wenn Du alle Grenzstücke “flächig” malst, aber eben nicht alle (und nur diese) Mitglieder der Andorra-Relation, denn da gehört er Speer nicht dazu.

Andorra: http://www.openstreetmap.org/browse/relation/9407
“Speer”: http://www.openstreetmap.org/browse/way/83094965

uff. das kann ich dir nicht sagen.
ich hab die osm datei von http://download.geofabrik.de/osm/europe/andorra.osm.bz2 zum rendern verwendet.
der download ist allerdings schon ein paar tage her.
vielleicht ging da beim osm-zu-länder-zurechtschneiden bei geofabrik was schief.

cd311

Moin,

Schade.

Da Andorra nach Stichproben keine entsprechenden Multipolygon-Relationen zu enthalten scheint,
würde ich jetzt erstmal mit einer ganz kleinen OSM-Testdatei probieren, ob man überhaupt auf dem richtigen Weg ist.

3 aus Segmenten bestehende Relationen:

  • multipolygon landuse forest
  • multipolygon admin_level=2
  • boundary admin_level=2
    alles ganz normal getaggt, wie man es sonst vorfindet.

und dann alle Tests von vorne, mit bereits ergänzter xml.

Normale xsl: Werden die beiden Multipolygone gefüllt, aber boundary nicht?
Ersetzung xsl: Wird die boundary gefüllt, aber die Multipolygone nicht?
Ergänzung xsl: Werden alle gefüllt?

Für boundary erwarte ich jetzt nicht unbedingt Erfolge - aber ich würde wissen wollen, ob es mit den Multipolygonen überhaupt so stimmt, sonst ist der ganze Ansatz ja schon verkehrt.

Gruß
Georg

Der Reihe nach:

Wenn du eine MP-Relation rendern willst, musst du natürlich
e=“relation” k=“type” v=“multipolygon” nehmen.
Um eine Fläche zu rendern, muß es eine Linie sein, die natürlich geschlossen ist.
Bei mapnik übernimmt osm2pgsql diese Vorverarbeitung, osmarender macht das irgendwo in der osmarender.xsl.

Layer haben osmarender-intern die Aufgabe, alles nacheinander zu zeichnen.
Layer -1 bis 2 entsprechen den osm-Layerangaben, layer 5 ist m.W. der textlayer.

Es ist sinnvoll, im ersten Versuch nur die Grenzen zu extrahieren:

osmosis.bat --read-pbf D:\Karten\osm\Geofabrik\nordrhein-westfalen.osm.pbf --tf accept-relations admin_level=6 --used-way --used-node --write-xml admin6.osm

Mit dieser Regel


    showRelationRoute="yes">


    <!-- Select all nodes and ways (unless they have an osmarender:render=no tag) -->


    <!-- Relation/Routes SDW -->

    <rule e="relation" k="type" v="multipolygon" layer="4">
                    <line class="relationroute-way relationroute-blue" smart-linecap="no"/>
                    <circle class="relationroute-blue relationroute-stop" r="2px"/>
    </rule>
    

bekomme ich schon mal die Grenzrelationen als Linien hin, mit folgender Modifikation der xsl-Datei


 <!-- Draw lines for a relation -->
  <xsl:template match="relation" mode="line">
    <xsl:param name="instruction"/>
    <xsl:param name="layer"/>

    <xsl:variable name="relation" select="@id"/>

    <xsl:if test="(tag[@k='type']/@v='multipolygon') and ($showRelationRoute!='~|no')">
      <!-- Draw lines for a RelationRoute -->
      <xsl:for-each select="$data/osm/relation[@id=$relation]/member[@type='way']">
        <xsl:variable name="wayid" select="@ref"/>

        <xsl:for-each select="$data/osm/way[@id=$wayid]">
          <!-- The current <way> element -->
          <xsl:variable name="way" select="."/>

Als Fläche habe ich es leider noch nicht hinbekommen :frowning:

Irgendwo in der xsl müsste aber auch stehen, wie Wald-MPs als area gerendert werden sollen.

HTH,
ajoessen

Mal ne ganz andere Frage:

wie soll denn dein Polygon an Meeresanrainerstaaten aussehen?

Da gehen in OSM die Meinungen auseinander, ob die Küstenlinie die Grenze ist, oder eine bestimmte Seemeilenzone.
Eventuell brauchst du dann auch noch die Küstenlinien. Die gibts als shapefiles für mapnik zum runterladen.

Gruß,
ajoessen