x

länderfläche mit osmarender


  1. länderfläche mit osmarender · cd311 (Gast) · 19.10.2011 18:24 · [flux]

    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

    <rule e="way" k="admin_level" v="2" >
    <area class="natural country" />
    </rule>

    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
    <rule e="way" k="admin_level" v="2" layer="5">
    <line class="boundary boundary-level-2-casing no-bezier" layer="5"/>
    <line class="boundary boundary-level-2-core no-bezier" layer="5"/>
    </rule>

    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


    • Re: länderfläche mit osmarender · GeorgFausB (Gast) · 20.10.2011 11:25 · [flux]

      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


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 20.10.2011 11:38 · [flux]

      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


    • Re: länderfläche mit osmarender · Mueck (Gast) · 20.10.2011 11:59 · [flux]

      ajoessen wrote:

      Möglicherweise ist das Polygon auch nicht geschlossen.

      ... 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 ...


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 20.10.2011 12:08 · [flux]

      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


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 20.10.2011 12:36 · [flux]

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

      <!-- Generate an area path for the current way or area element -->
      <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


    • Re: länderfläche mit osmarender · cd311 (Gast) · 20.10.2011 14:17 · [flux]

      Hi

      Erstmal danke für die Antworten

      ajoessen wrote:

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

      ...

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

      Also müsste man das dort ergänzen.

      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.


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 20.10.2011 14:26 · [flux]

      cd311 wrote:

      Hi

      Erstmal danke für die Antworten

      ajoessen wrote:

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

      ...

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

      Also müsste man das dort ergänzen.

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

      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.

      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.

      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


    • Re: länderfläche mit osmarender · GeorgFausB (Gast) · 20.10.2011 14:48 · [flux]

      Moin,

      ajoessen wrote:

      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.

      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. ;)

      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 ... ;)

      Gruß
      Georg


    • Re: länderfläche mit osmarender · cd311 (Gast) · 20.10.2011 15:37 · [flux]

      GeorgFausB wrote:

      Moin,
      Was hat der layer da zu bedeuten?

      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.


    • Re: länderfläche mit osmarender · cd311 (Gast) · 20.10.2011 16:46 · [flux]

      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

      2. 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


    • Re: länderfläche mit osmarender · GeorgFausB (Gast) · 20.10.2011 17:08 · [flux]

      Moin,

      cd311 wrote:

      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

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

      cd311 wrote:

      2. 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

      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. 😉

      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


    • Re: länderfläche mit osmarender · EvanE (Gast) · 20.10.2011 18:15 · [flux]

      cd311 wrote:

      GeorgFausB wrote:

      Was hat der layer da zu bedeuten?

      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.

      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)


    • Re: länderfläche mit osmarender · cd311 (Gast) · 20.10.2011 22:36 · [flux]

      GeorgFausB wrote:

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

      ...

      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?

      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?

      EvanE wrote:

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

      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


    • Re: länderfläche mit osmarender · Mueck (Gast) · 20.10.2011 22:56 · [flux]

      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


    • Re: länderfläche mit osmarender · cd311 (Gast) · 20.10.2011 23:14 · [flux]

      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


    • Re: länderfläche mit osmarender · GeorgFausB (Gast) · 21.10.2011 06:53 · [flux]

      Moin,

      cd311 wrote:

      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.

      Schade.

      cd311 wrote:

      hat noch irgendjemand eine idee?

      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


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 21.10.2011 07:28 · [flux]

      GeorgFausB wrote:

      Moin,

      ajoessen wrote:

      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.

      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. 😉

      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 ... 😉

      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 :-(

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

      HTH,
      ajoessen


    • Re: länderfläche mit osmarender · ajoessen (Gast) · 21.10.2011 07:33 · [flux]

      cd311 wrote:

      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

      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