Frage bezüglicher Map + Layer und reiner Stadtdarstellung

Hoffe man kann mir hier weiterhelfen :slight_smile:

Also:
Für ein fotografisches Projekt versuche ich eine Stadtübersicht Aachens zu erstellen, die aber auch wirklich nur aus Aachen besteht. Andere Umgebungen sollen nach Möglichkeit weiß dargestellt werden, plus Begrenzungsrahmen entsprechend der kommunalen Grenze.

Zusätzlich hierzu, möchte ich Marker setzen können, die mit Bilder in einem Layer präsentiert werden (ähnlich Panoramio).
Habe versucht das ganze über Wordpress irgendwie hinzubekommen (möchte nur ungerne auf eine statische Lösung zurückgreifen, da sich in Aachen doch hin und wieder etwas tut und der Datenbestand entsprechend aktuell dargestellt werden sollte), samt OSM Plug In, jedoch erscheint das ganze nicht gerade komfortabel - um es mal so zu sagen.

Hat jemand hier ein paar Tipps für mich, bzw. Lesestoff, wie ich idealerweise an diese Sache rangehen kann?

Hallo Grunpfnul,

Stichworte dürften Maperitive und OSM Daten aus Download.geofabrik.de (und da Du nur eine Stadtauszug haben willst, wahrscheinlich auch osmosis) sein, damit Du Dein eigenes Kartenmaterial erstellen kannst. Das WP OSM-Plugin zeigt die Openstreetmap Kacheln an, da ist eine weise Umgebung von Aachen nicht besonders erwünscht :slight_smile: .

Mit freundlichen Grüßen Georg V.

P.S.: Willkommen im Forum. edit Tippfehler im Namen korrigiert

Für das Problem mit dem Ausblenden von allen Gebieten außer Aachen fallen mir spontan 3 Lösungen ein:

  1. Die schönste aber auch komplizierteste Variante wäre es einen eigenen Tileserver aufzusetzen. Für einen kleinen Bereich wie Aachen dürfte das eigentlich auch nicht viel Rechenleistung benötigen. Allerdings wäre ein Tileserver dafür etwas übertrieben und der Aufwand nicht gerechtfertigt.

  2. Selber rendern mit Maperitive ist zwar recht leicht, dann müsstest du aber immer wieder neu rendern und hochladen, wenn du die aktuellste Karte haben willst. Bestimmt kann man das auch irgendwie automatisieren, aber damit kenne ich mich garnicht aus.

  3. Ich denke am sinnvollsten wäre es einfach einen Layer über die Karte zu legen, der überall weiß ist und nur bei Aachen durchsichtig. Wie man das macht kann ich dir aber leider auch nicht sagen.

Hatte fast gehofft, dass es eine einfache Lösung über Openlayers gibt. Das ganze sollte schon dynamisch sein, also entsprechend aktueller Datenbestand, zoombar etc. - wird etwas Arbeit, wie ich sehe :wink:

Das wollte ich schon länger mal mit OpenLayers testen und hab das jetzt zum Anlass genommen:

http://bl.ocks.org/nrenner/5349821

Das Prinzip ist, ein Multipolygon (also Polygon mit Loch) als Schablone darüber zu legen. Als outer ein Rechteck außerhalb der Karten-Begrenzung und als inner die Boundary. Leider ist die Performance - zumindest auf meinem alten Rechner - nicht so toll. Dasselbe müsste aber auch mit Mapnik oder Maperitive gehen.

Gruß,
Norbert

Beispiele zum Fotos einbinden wären:
Commons on OSM
GeoRSS from Flickr in OpenLayers

Welche Einschränkungen es beim Wordpress Plug-in gibt, weiß ich allerdings nicht.

Das hilft mir sehr, sehr weiter - vielen Dank :slight_smile:

@ikonor:
Darf ich dich fragen wie man zu einem gültigen json-File kommt, das sich nicht in D befindet? Auf welches Koordinatensystem muss ich da umrechnen bzw mit welchem (eventuell perl)-Tool kann man das bewerkstelligen?

Ich finde nämlich diese Darstellung der Karte sensationell gut!

Nominatim liefert auch Polygone als Json. Der Syntax ist zwar minimal anders, aber wenn man dort den ganzen Polygon-Block rauskopiert und in die Beispieldatei einfügt sollte man zum gewünschten Ergebnis kommen.

http://nominatim.openstreetmap.org/search/Aachen?format=json&polygon=1&limit=1

Edit: Ok, ich sehe grad, dass die Koordinaten in der Beispieldatei völlig anders aussehen. Wie man das umrechnen kann, da bin ich dann auch überfragt.

Da fragst du besser misterboo, wie er die GeoJSON Dateien auf http://ags.misterboo.de erstellt. Es gibt sicher Konverter von OSM zu GeoJSON, da müsste ich jetzt aber auch suchen.

Ich hab mir da ehrlich gesagt nicht viel Gedanken gemacht, sondern bei Grenzen zuerst an diese Karte gedacht und praktischerweise dort auch den Download gefunden.

GeoJSON ist normalerweise wie OSM Daten in WGS84 (EPSG:4326). In diesem Fall ist es aber bereits in Web Mercator (EPSG:3857), das spart die Umrechnung in OpenLayers, siehe die crs Angabe in der json Datei:


"crs":{"type":"name","properties":{"name":"EPSG:3857"}}

Das ist für die Performance besser, aber OpenLayers kann auch umrechnen, wenn man die Projektion am Layer oder beim Format Konstruktor angibt.

Gruß,
Norbert

Wie Mr. Boo das macht, weiss ich nicht. Wenn die OSM-Daten aber in einer Postgresql-DB mit PostGis liegen, reicht dafür ein einfaches “select ST_AsGeoJSON(border,4326) from …” aus, wenn in der Spalte “border” die gewünschte Geometrie liegt. Ist eine Standardfunktion von PostGIS.

Gruss
walter

p.s. sollte auch mit der beliebten osm2pgsql-DB zum Rendern funktionieren. Nur in welcher Tabelle und welcher Spalte die Daten stehen, ist mir nicht bekannt.

Ich bin auch ganz begeistert von der Karte und habs mir mal für die Relation 62428 geklaut. Die Datei 62428.json wurde einfach mit

psql osm -tc "select ST_AsGeoJSON(st_transform(way,900913)) from osm_polygon where osm_id=-62428 limit 1"  > 62428.json

erzeugt. “limit 1” weil es mit Exklaven nicht funktioniert hat.

Grüße, Max

Ich habe jetzt mal noch eine Variante für Nominatim erstellt:

http://bl.ocks.org/nrenner/5370745

Bin erst davon ausgegangen, das von Nominatim sei auch GeoJSON, ist aber nicht der Fall. Es gibt aber einen Parameter “polygon_geojson=1”, mit dem ist die Geometrie im Feld “geojson” dann als GeoJSON kodiert, Beispiel-URL:

http://nominatim.openstreetmap.org/search.php?q=aachen&limit=1&format=json&polygon_geojson=1

Das hab ich mir vorhin erst überlegt, ob Enklaven/Exklaven wohl funktionieren und beim Test mit der Schweiz festgestellt, dass zumindest Enklaven nicht so ohne weiteres funktionieren. Bei Exklaven müsste man vermutlich statt components[0] alle components zum äußeren Poloygon hinzufügen. Beides müsste ich später mal noch anschauen.

Sensationell - jetzt können auch pgsql Noobs damit arbeiten :slight_smile:

Besten Dank für die Mühe!

Genau!
weil osm2pgsql beim Import aus Multipolygonen pro inner/outer einen eigenen Datensatz erzeugt. Du hast sogar Glück gehabt, den “richtigen” zu erwischen, da limit=1 einen x-beliebigen passenden Datensatz liefert.
Du könntest dir aus den 3 Datensätzen natürlich wieder ein GIS-Multipolygon machen; dann sollte st_asGeoJson() dieses auch korrekt ausgeben.

Ist aber irgendwie “von hinten durch die Brust ins Auge”.

Gruss
walter

p.s. hier mal “meine” Version erzeugt aus einen PostGIS-DB im Snapshot-Format: 62428.gjson

Dankeschön. Da bleibt erst mal alles weiss… (kleine Änderung wegen EPSG 4326, sonst ist das das gleiche Skript). Muss ich mal suchen, ob OL mit gefüllten Multipolygonen umgehen kann und ob Format.GeoJSON() die richtig einliest (mindestens ein bisschen liest er ja offensichtlich, die bbox stimmt ja).

Grüße, Max

Da musst du auf jeden Fall meinen Code anpassen. Ich nehme vom GeoJSON nur die Geometrie (Polygon) des ersten Features und daraus nur den ersten LineString. Der wird dann dem äußeren Box-Polygon hinzugefügt. Bei der Polygon Klasse ist die erste component das outer, der Rest sind inner.

Ich schau mir das auch mal an.

Gruß,
Norbert

Hier mal eine erste Variante dazu:

http://bl.ocks.org/nrenner/5371796

Ich hole aus dem Multipolygon die einzelnen Polygone, daraus jeweils den LineString und füge diese dann zum äußeren Polygon hinzu. Weiß nicht, ob das irgenwie eleganter geht. Auf jeden Fall muss man dann noch ne Unterscheidung Multipolygon/Polygon im Geo JSON machen.

aber sicher! Was meinst du wohl was die hier sind http://osm.wno-edv-service.de/residentials/?zoom=13&lat=50.12272&lon=8.09171&layers=TB00TFT ? Alle blauen Bereiche sind OSM-Relationen (type=multipolygon, landuse=residential), die im GeoJson-Format an OL übergeben werden.


var residentials = new OpenLayers.Layer.Vector("residentials", {
            baselayer:  false,
            maxResolution: resolutions[13],
            attribution: OsmDataAttribution,       
            strategies:	[new OpenLayers.Strategy.BBOX({ratio: 1, resFactor: 1.1})
                        ],
            protocol:	new OpenLayers.Protocol.HTTP({
             			url:	"getOsmResidentials",  
             			format:	new OpenLayers.Format.GeoJSON()
             	       }),            
            projection: new OpenLayers.Projection("EPSG:4326")
           ,styleMap: residentialStyleMap
      });

Gruß
walter

edit: fixed link

@Walter:
Der link von dir ist jetzt aber sehr “lokal” begrenzt… :wink: