x

Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt.


  1. Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · lakul (Gast) · 15.02.2013 10:32 · [flux]

    Hallo,

    ich bin mir nicht ganz sicher, ob ich mit meiner Frage hier richtig bin, aber ich versuche es einfach mal.

    Ich habe einen Tile Server aufgesetzt und mit osm2psql (inkl. hstore) Sachsen eingelesen. Jetzt rendere ich die Karten mit Mapnik. Das funktioniert auch alles wunderbar.
    Jetzt malträtiere ich gerade die XML Dateien, welche für die Farbgestaltung bei Mapnik verantwortlich sind, denn wir möchten gerne die Gebäude der TU Dresden farblich hervorheben. Soweit klappt das auch recht gut. Du meisten Gebäude fange ich über den Tag "operator" ab und dort wo der Tag nicht vorhanden ist, oder der "operator" nicht die TU Dresden ist (z.B. bei angemieteten Gebäuden), nutze ich z.B. addr:housename oder andere markante Tags.
    Mein Problem ist, dass es Gebäude gibt, welche Gebäudeteile haben, wie z.B. das Hauptgebäude der TU Dresden, der Beyer-Bau. Die Multi Relation konnte ich problemlos einfärben. Aber, der Turm welcher nur aus building:part = yes und roof:shape = dome besteht bleibt im ursprünglichen OSM braun. Diese Tags sind einfach zu allgemein um sie zum Einfärben zu nutzen, ich würde ja quasi alle anderen Polygone, welche ebenfalls die Tags besitzen ebenfalls einfärben. Somit kommen wir zu meiner ersten Frage. Ich brauche diese Gebäudeteile eigentlich gar nicht. Wie kann ich erreichen, dass Mapnik diese ganz und gar ignoriert, oder kann ich sie doch irgendwie einfärben?
    Ich habe in meiner bisherigen google Suche herausgefunden, dass Mapnik derartige Dinge ignoriert. Diese Aussage ist zumindest in der Default Config von Mapnik korrekt. Allerdings kann man Mapnik eigentlich mit allem füttern, vorausgesetzt die Daten sind in der PostgreSQL DB vorhanden und man hat die SQL Abfragen in Mapnik entsprechend ergänzt. So habe ich z.B. den Tag operator hinzugefügt und kann diesen jetzt auch für die Einfärbung nutzen. Ich weiß aber einfach bei den Gebäudeteilen nicht mehr weiter.
    Weiterhin ist mir bekannt, das osm2psql keine Site Relationen kennt, was ebenfalls ein Problem ist, denn somit kann ich diese Gebäude ebenfalls nicht über markante Tags ansprechen. Die markanten Tags wie operator oder addr:housname oder name sind eben der Site Relation zugeordnet und daher für mich nicht ansprechbar. Die einzelnen Gebäudeteile haben meist nur building = yes und das reicht natürlich nicht.
    Meine erste Lösungsidee ist es osm2pgsqlumzuschreiben und der Software das beizubringen, was ich will (vermutlich aufwändig) und löst auch das Problem mit den Gebäudeteilen nicht. Site Relationen kann ich osm2pgsql sicher beibringen, aber die Gebäudeteile bekommen ja nicht plötzlich mehr Informationen durch die Anpassung.
    Meine zweite Idee wäre es osm2pgsql zu sagen, dass es bestimmten Polygonen, Relationen etc. einen zusätzlichen Tag (z.B. color_rendering = yes) beim Import verpasst an wenn das Polygon in einem bestimmten Koordinatenbereich liegt. Ist ebenfalls sehr aufwendig, weil ich alle Koordinaten für jedes einzelne Gebäude raussuchen und übergeben müsste, denn es kann durchaus mal passieren, dass auf dem Campus Gebäude liegen, die nicht eingefärbt werden soll. Weiterhin würde ich ja sonst auch Straßen etc. erwischen.

    So genug Brainstorming für mich alleine gemacht 😉.
    Hat jemand von euch bereits Erfahrungen auf dem Gebiet sammeln können und einen Tipp für mich?

    Vielen Dank!

    lakul


    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · fx99 (Gast) · 15.02.2013 16:25 · [flux]

      Warum die Karte komplett neu berechnen?

      Ich würde es mit einem Overlay machen, siehe z.B. http://overpass-turbo.eu/ :

      <!--␣Script␣für␣TU␣Dresden␣-->
      <osm-script>
      <query␣type="relation">
      <has-kv␣k="operator"␣regv="TU␣Dresden"/>
      <bbox-query␣s="50.95"␣n="51.15"␣w="13.6"␣e="13.8"/>
      </query>
      
      <!--␣added␣by␣auto␣repair␣-->
      <union>
      <item/>
      <recurse␣type="down"/>
      </union>
      <!--␣end␣of␣auto␣repair␣-->
      <print/>
      </osm-script>
      

      oder OpenLayer :

      <html>
      <head>
      <meta␣http-equiv="content-type"␣content="text/html;␣charset=utf-8"␣lang="en"></meta>
      <title>Uni␣Dresden:␣OSM3S␣on␣Mapnik␣via␣Open␣Layers</title>
      <script␣src="http://openlayers.org/api/OpenLayers.js"></script>
      <script␣src="http://openstreetmap.org/openlayers/OpenStreetMap.js"></script>
      <script␣src="http://overpass-api.de/overpass.js"></script>
      <script␣type="text/javascript">
      var␣lat␣=␣51.0509;␣␣var␣lon␣=␣13.7189;␣␣␣var␣zoom␣=␣13;␣//␣Andermatt
      var␣map;
      
      function␣init(){
      map␣=␣new␣OpenLayers.Map␣("map",␣{
      controls:[
      new␣OpenLayers.Control.Navigation(),␣␣␣␣new␣OpenLayers.Control.PanZoomBar(),
      new␣OpenLayers.Control.LayerSwitcher(),␣new␣OpenLayers.Control.Attribution(),
      new␣OpenLayers.Control.Permalink()␣␣␣␣␣],
      maxExtent:␣new␣OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
      maxResolution:␣156543.0399,
      numZoomLevels:␣19,␣␣␣␣␣␣␣␣␣␣␣␣␣␣units:␣'m',
      projection:␣new␣OpenLayers.Projection("EPSG:900913"),
      displayProjection:␣new␣OpenLayers.Projection("EPSG:4326")
      }␣);
      
      layerMapnik␣=␣new␣OpenLayers.Layer.OSM.Mapnik("Mapnik");
      map.addLayer(layerMapnik);
      
      var␣lonLat␣=␣new␣OpenLayers.LonLat(lon,␣lat).transform(new␣OpenLayers.Projection("EPSG:4326"),␣new␣OpenLayers.Projection("EPSG:900913"));
      
      map.setCenter␣(lonLat,␣zoom);
      map.addLayers([make_large_layer("http://overpass-api.de/api/interpreter?data=[timeout:1];(way[%22operator%22=%22TU␣Dresden%22](bbox););(._;>;);out␣skel;",␣"green",␣9)]);
      map.addLayers([make_large_layer("http://overpass-api.de/api/interpreter?data=[timeout:1];(relation[%22operator%22=%22TU␣Dresden%22](bbox););(._;>;);out␣skel;",␣"red",␣9)]);
      }
      </script>
      </head>
      <body␣onload="init()">
      <div␣id="statusline"␣style="font-size:24pt;␣font-weight:bold;␣font-family:sans-serif">No␣status␣set␣yet.</div>
      <div␣id="map"␣style="height:90%"␣class="smallmap"></div>
      
      </body>
      </html>
      

    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · Amiga4000 (Gast) · 15.02.2013 17:32 · [flux]

      Moin

      nach dem simple OSM 3D tagging schema sollte der Turm aber auch ein building=yes haben. Und wenn er zur TU gehört, halt auch zur Relation/name/... dazu gehören.
      Also was ned korrekt getaggt sozusagen.

      Amiga


    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · Netzwolf (Gast) · 15.02.2013 18:55 · [flux]

      Nahmd

      lakul wrote:

      [...]
      Meine erste Lösungsidee ist es osm2pgsqlumzuschreiben und der Software das beizubringen, was ich will (vermutlich aufwändig) und löst auch das Problem mit den Gebäudeteilen nicht. Site Relationen kann ich osm2pgsql sicher beibringen, aber die Gebäudeteile bekommen ja nicht plötzlich mehr Informationen durch die Anpassung.

      Meine zweite Idee wäre es osm2pgsql zu sagen, dass es bestimmten Polygonen, Relationen etc. einen zusätzlichen Tag (z.B. color_rendering = yes) beim Import verpasst an wenn das Polygon in einem bestimmten Koordinatenbereich liegt. Ist ebenfalls sehr aufwendig, weil ich alle Koordinaten für jedes einzelne Gebäude raussuchen und übergeben müsste, denn es kann durchaus mal passieren, dass auf dem Campus Gebäude liegen, die nicht eingefärbt werden soll. Weiterhin würde ich ja sonst auch Straßen etc. erwischen.

      Ich habe eine dritte Idee:

      Du spielst die Daten ganz normal ohne irgendeine Manipulation in die Datenbank ein. Denn sobald sie drin sind, kannst Du alle SQL-Register ziehen und die Daten beliebig manipulieren.

      Wenn es also irgendeine Möglichkeit gibt, aus den gegebenen Daten die für Dich wichtigen abzuleiten, bekommst Du es so auf jeden Fall hin. Wenn man die Zugehörigkeit eines Objektes zur Uni aus den Daten nicht ableiten kann, dann schafft es auch kein Verfahren der Welt.

      Wenn die Schwierigkeit der Zuordnung darauf beuht, dass offizielle OSM-Tags fehlen, kannst Du die natürlich auch in die OSM-Datenbasis einpflegen. Aber bitte kein “uni:color=green”.

      Just my 2.38¢

      Gruß Wolf


    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · reneman (Gast) · 15.02.2013 19:31 · [flux]

      Wenn es über ein Overlay umgesetzt wird und man keine einheitlichen Erkennungmerkmale hat, kann immernoch einmalig eine kleine Liste der betroffenen way's erstellt werden. Die ID der way's ändert sich i.d.R. nicht so schnell. Diese können dann farbig hervorgehoben werden.


    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · !i! (Gast) · 15.02.2013 20:11 · [flux]

      Herzlich willkommen bei OSM und hier im Forum lakul 🙂

      Vielleicht verstehe ich das Problem auch falsch. Du willst doch nur alle 2D Umrisse aller Uni Gebäude bekommen, um diese hervorzuheben? Ich verstehe gerade nicht, wieso du da building:part benötigst bzw. warum dieser dich dabei stört?
      Ein weiterer Lösungsansatz wäre auf jeden Fall, alle Uni-Gebäude in eine Relation zu packen und darüber anzusprechen:
      http://wiki.openstreetmap.org/wiki/Rela … posed/Site

      Wie fx99 aber schon sagte, ist ein komplett eigener Rendering-Style vielleicht eine ein wenig überdimensionierte Lösung? Sag doch sonst einfach mal, was dir/euch so vorschwebt, vielleicht finden wir zusammen dann was einfacheres? Hier sind zum beispiel mal drei hübsche Campus Karten auf OSM Basis:
      http://map.epfl.ch
      http://maps.rdms.udel.edu/map/
      http://m.ox.ac.uk/places/oxpoints:23232520/

      Nur Mut, das wird schon!

      P.S. Aber Absätze und Hervorhebungen machen es allen einfacher deinen Ausführungen zu folgen 😉


    • Re: Mapnik:Individuelle Einfärbung einzelner Gebäude gelingt nur begrenzt. · maxbe (Gast) · 15.02.2013 21:38 · [flux]

      Ich würde es auch machen wie Wolf sagt: Es ist Deine Datenbank, da darfst Du auch reinkritzeln.
      Nimm dir irgendeine Spalte in deinem Import-Schema, die du nicht brauchst (service oder population z.B.), oder bau dir eine neue Spalte dazu. Und dann trag einfach dort "TU Dresden" ein, wenn das Gebäude zur TU gehört.

      Nach jedem Update (oder vor jedem Rendern) gibts dann ein Script, das dieses Feld füllt. Vieles ganz einfach:

      update␣polygon␣set␣service='TU␣Dresden'␣where␣operator='TU␣Dresden';"
      

      und manches ein bisschen komplizierter, weil du Kuppeln in 100m Umkreis um (13.72944,51.0297) suchst

      update␣polygon␣set␣␣service='TU␣Dresden'␣where
      tags->'building:part'='yes'
      and␣tags->'roof:shape'='dome'
      and␣way␣&&␣ST_Expand(ST_Transform(ST_GeometryFromText('POINT(13.72944␣51.0297)',4326),900913),100);
      

      Beim Rendern wertest Du dann dieses service-Feld aus und färbst damit deine Gebäude (und passt auf, ob du dieses Feld nicht doch irgendwo verwendest)

      Grüße, Max