Polygone in OpenStreetMap zeichnen und in einer Datenbank speichern.

Hallo.

Ich möchte OpenStreetMap-Unterstützung in meine Anwendung integrieren. Ich würde gerne Polygone auf einer OpenStreetMap-Karte zeichnen und diese in einer Datenbank speichern. Es soll ebenfalls möglich sein, die gespeicherten Polygone wieder auf der Karte darstellen zu können.
Habt ihr vielleicht ein kleines Beispiel für mich?

Gruß Djon

Es bedarf weiterer Erläuterungen was mit deiner Anwendung gemeint ist. Insbesondere solltest du die verwendeten Komponenten nennen.

Unter der Annahme, dass HTML+JavaScript die Basis bilden:
Wir haben einen Editor als Ergänzung zu OpenLayers entwickelt mit dem sich unter anderem Polygone zeichnen lassen. Demo mit Zeichnen auf OSM unter http://ole.geops.de/
Speichern der Polygone kann zum Beispiel per WFS oder eine der anderen OpenLayers-Strategies erfolgen. Beispielcode mit WFS-Sever: https://github.com/geops/ole/blob/master/client/examples/wfs.html

Nahmd,

Zum Gucken:

  1. OpenSeaMap:

unter “Werkzeuge” den Törnplaner aktivieren, sodann mit Click-Click-Click eine Strecke zusammenklicken (Doppelclick beendet). Das Ergebnis kann man downloaden – das lässt sich wohl umbauen zu Speichern auf einen Server.

  1. Geschichtskarte:
    Du kannst oben rechts das Flächenmalwerkzeug auswählen, und dann per Click-Click-Click eine Fläche zusammenklicken. So ich weiss, gibts da weder Speichern noch Runterladen; Du kannst aber gucken, ob das Look+Feel in die richtige Richtung geht.

Gruß Wolf

Edit: Typo

Vielen Dank für die Hinweise. Die Beispiele gehen schon in die richtige Richtung. Für meine Applikation setze ich das PlayFramework ein, wobei ich dabei die Sprache SCALA verwenden. Für die Darstellung der Map wird aber Html und JS verwendet. Ich würde gerne die gezeichnete Fläche als eine Liste von Koordinaten neben der Map darstellen. Die Liste soll nach jedem Verschieben des Polygons aktualisiert werden. Zusätzlich soll dem Anwender die Möglichkeit gegeben werden, die Koordinaten per Hand zu aktualisieren und die Darstellung des Polygons auf der Karte muss dann automatisch aktualisiert werden.

Gruß Djon

Sowas gibt es hier auch für die Wanderrouten: http://hiking.waymarkedtrails.org/de/

Moins,

Das ist alles machbar.

Ich kenne allerdings keine Anwendung, die das bereits so macht und aus der man einfach kopieren könnte.

Gruß Wolf

Ich hab jetzt dieses Beispiel hier http://openlayers.org/dev/examples/vector-formats.html gefunden. Eigentlich zeigt es genau das was ich suche.

Gruß Djon

snip

Edit: hat sich nach der Vorstellung des Editors erledigt.

Gruß Wolf

Ich finde diesen Editor einfach Klasse. Welche OpenLayers-Strategien außer WFS gibt es eigentlich noch? Prinzipiell würde mir dieser Editor vollkommen reichen, nur müssen die gezeichneten Polygone irgendwie in die Datenbank überführt werden.

Gruß Djon

Play und Scala ist eine gelungene Kombination. Speichern von Geometrien musst du allerdings relativ händisch machen weil ebean (bei Play zum Persistieren dabei) sich nicht leicht um Geometrie-Support erweitern lässt. Eventuell ist aber PostGIS über JDBC anbinden eine gangbare Option für dein Szenario: http://postgis.refractions.net/documentation/manual-2.0/ch06.html#id573790

Danke für die Komplimente bezüglich OLE. Einbinden zum einbinden in Play reichen die kleinen Downloads von http://dl.geops.de/ole/ weil es keine zwingenden serversetitigen Abhängigkeiten gibt.

Es stellt sich nun die Frage wie du die Geometrien in eine Datenbank bekommst. Die kurzfristig einfachste Variante dürfte ein einfaches Datenformat und selber in die Datenbank schreiben sein. Empfehlenswert ist aber GeoServer serverseitig laufen zu lassen und damit Laden und Speichern von Geometrien zu realisieren. Man gewinnt damit eine rudimentäre Rechteverwaltung und vor allem standardisierte Datenformate und Protokolle.

Für die einfachere Variante bietet es sich an das bereits genannte Beispiel zu WFS anzupassen. Grundsätzlich bedarf es mindestens eines Vektor-Layers um darauf zeichnen zu können. Der Layer bekommt eine Strategie um Daten vom Server zu laden – BBOX und Fixed dürften für dich passen. Dann braucht es noch ein Protokoll um zu definieren wie die Daten vom und zum Server kommen – wobei sich WFS und HTTP hier anbieten. Ergänzt werden muss die Kommunikation um die Representation von Geometrien – hier gibt es einige Möglichkeiten aber GeoJSON, WKT und WFS wären die gängigeren.

Ganz konkret sieht es für eine möglichst primitive Variante so aus:


var saveStrategy = new OpenLayers.Strategy.Save({
  // automatisch Speichern sobald eine Geometrie gezeichnet ist
  auto:true
});
var editLayer = new OpenLayers.Layer.Vector("Test Polygons", {
  strategies: [
    // Alles im angezeigten Bereich der Karte laden
    new OpenLayers.Strategy.BBOX(),
    // Oben definiertes automatisches Speichern nutzen
    saveStrategy
  ],
  // Einfache Übertragung (für Laden und Speichern) 
  protocol: new OpenLayers.Protocol.HTTP({
    // Teil deiner Anwendung der Daten liefert und Speichert, am einfachsten Requests in Firebug anzeigen
    url: "/route/in/deiner/Anwendung",
    // Einfaches Textformat nutzen
    format: new OpenLayers.Format.WKT()
  }),
  // Eventuell weitere Optionen
  […]
});

Sinnvoll wäre es auch die Liste der Verfügbaren Werkzeug in Geometrien aus dem Beispiel deutlich zu kürzen. Falls du später danach suchst, es stünde alles zur Verfügung was Dateien in client/lib/Editor/Control/ entspricht.

Zum Weiterlesen bitte die Dokumentation zu OpenLayers beachten. Die Links in Fettschrift lassen sich aufklappen. Die Punkte unter Format, Protocol und Strategy dürften für dich interessant sein: http://dev.openlayers.org/releases/OpenLayers-2.12/doc/apidocs/files/OpenLayers-js.html
Leider ist die Dokumentation von OpenLayers sehr löchrig was des öfteren Lesen deren Quellcodes erfordert.

Es gibt auch noch einen älteren Blog-Artikel, vom dem ein kleiner Teil beschreibt wie auf das Bearbeiten von Geometrien reagiert werden kann. http://www.geops.de/blog/80-ole-und-mapfish-zum-bearbeiten-von-geodaten dann Absnitt „Getting Persistence for OLE“.

Die Umsetzung der Koordinatenliste inklusive Editieren durch manuelle Eingabe wird etwas schwieriger werden. Zumindest die Anzeige könnte man mit getVertices aus OpenLayers.Geometry realisieren. Für weiteres empfehle ich den Code bei dragVertex in https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Control/ModifyFeature.js zu lesen.

Wenn der Sinn des manuellen Editierens sein soll, lückenlos zu zeichnen, dann könntest du auch einen Objektfang auf WFS-Daten machen. Das hätte den Vorteil bereits fertig verfügbar zu sein. Das Editieren per manueller Eingabe solltest du hinten anstellen weil das ein ziemlicher Brocken zum selbst implementieren wird.

Vielen Dank für die ausführliche Beschreibung! :smiley:
Ich habe mir meine Anforderungen noch ein wenig überdacht. Wenn ich den von euch entwickelten Editor einsetze, dann muss der Anwender nicht mehr die Koordinaten per Hand anpassen, der kann es ziemlich bequem mit Hilfe des Editors erledigen. Somit fällt die Problematik der Rückumwandlung schon mal weg.
Danke für den Vorschlag mit dem GeoServer. Würde es reichen nur diesen alleine zu installieren oder muss ich noch eine zusätzliche Datenbank aufsetzen? Die Applikation wird auf einem Ubuntu Server 12.04 laufen.

Im Prinzip reicht es einen GeoServer zu haben. Dort muss dann eine Datenquelle (Store) und eine Ebene (Layer) definiert werden um Geometrien zu lesen und zu speichern. Der Layer legt dabei fest wie von außen zugegriffen werden kann (Projektionen und Name), der Store bestimmt wo gespeichert wird (Datei oder Datenbank).
Wenn auf die Datenbank verzichtet werden soll, könnte man einen Shapefile-Store verwenden. Allerdings wirst du es beim Zugriff von Scala deutlich einfacher haben wenn die Daten in einer Datenbank liegen. PostgreSQL mit PostGIS bietet sich hier an weil einfach die Qualität der Datenbank stimmt und sich auch sehr komplexe Abfragen entwickeln lassen.

Der Vollständigkeit halber sei noch erwähnt, dass GeoServer nicht der einzige Server ist, der mit WFS umgehen kann.

Vielen Dank für die Erklärung. Ich werde morgen GeoServer und PostGIS auf meinem Ubuntu-Server installieren und versuchen das erwähnte Beispiel https://github.com/geops/ole/blob/master/client/examples/wfs.html zum Laufen zu bringen.

Gruß Djon

Hallo.

Ich habe jetzt wieder an meine Projekt ein bisschen gespielt und postgis und geoserver auf meinem Ubuntu 12.10 installiert. Ich konnte die Datenquelle erfolgreich im geoserver definieren. Leider konnte ich kein Layer hinzufügen. Muss ich dafür spezielle Attribute definieren?

Gruß Djon

Sieht ja schon ganz hübsch aus! Lob!

Gibt es dazu schon irgendwas im OSM-Wiki?