Wie gehe ich mit der Versionierung in OpenStreetMap um?


11

Das Thema der Verwaltung von Geodaten im allgemeineren Sinne wurde hier bereits angesprochen. Dort wurde auch das Thema Versionierung erwähnt, aber nicht wirklich behandelt.

Die herkömmliche Erfassung und Wartung von Geodaten muss sich nur intern mit der Versionierung befassen, da die Datenbank nur innerhalb des Unternehmens aktualisiert wird. Dies ist bei Crowdsourcing-Geodatabases wie OpenStreetMap nicht der Fall. Dort kann jeder mitkommen und Objekte hinzufügen, ändern oder löschen. In OpenStreetMap wird dies rudimentär behandelt: Jedes Objekt hat eine ganzzahlige Versionsnummer, und nur das Objekt mit der höchsten Version wird in der Live-Datenbank verfügbar gemacht. Die Datenbank verwendet optimistisches Sperren, sodass Benutzer alle Konflikte lösen müssen, die beim manuellen Hochladen von Beiträgen auftreten.

Dies alles funktioniert ziemlich gut, solange menschliche Beiträge durch die Redakteure ( JOSM , Potlatch ) die einzige Art des Beitrags sind - aber sie sind es nicht. Zunehmend werden Importe offener Daten des öffentlichen Sektors durchgeführt. Dies führt zu komplexeren Versionsproblemen. Stellen Sie sich das folgende Szenario vor:

  1. Ein Gebäudeobjekt wird aus einem offenen Datensatz des öffentlichen Sektors importiert
  2. Das Gebäude erhält einige Änderungen durch menschliche Mitarbeiter (Attribute, Geometrie oder beides).
  3. Eine neue Version der Daten des öffentlichen Sektors wird verfügbar und importiert.

Derzeit gehen in Schritt 3 die menschlichen Beiträge verloren, es sei denn, jedes Gebäude, das Änderungen an der Community erhalten hat, wird manuell mit dem neuen Import zusammengeführt.

Wie kann OpenStreetMap mit dieser Situation umgehen? Müssen wir uns die verteilte Versionskontrolle in der Softwareentwicklung ansehen? Wie können DVC-Methoden an die verteilte Geodatenpflege angepasst werden?

Antworten:


5

Ich habe von jemandem geträumt, der zerstörungsfreie Bearbeitung für GIS-Daten implementiert. Es ist rechenintensiv, sollte aber nicht schwierig in einem RDBMS zu implementieren sein.

Beginnen Sie mit einem Schnappschuss der Daten. Alle Änderungen werden als Änderungen gespeichert, die Originaldaten bleiben unverändert. In Ihrem Beispiel stammen die Gebäude zunächst aus den Daten des öffentlichen Sektors. Wenn ein Benutzer eine Änderung vornimmt, wird die Änderung oder Differenz in einer separaten Tabelle gespeichert. Wenn jemand die Funktion anzeigt, erhält er das Original sowie alle vorgenommenen Änderungen. Nachfolgende Änderungen sind die berechnete Differenz zwischen der neuen Feature-Form und dem Original sowie alle vorherigen Änderungen.

Dies gibt Ihnen die Möglichkeit, auf einer feinkörnigen Ebene rückgängig zu machen. Es ist im Wesentlichen das, was die Versionskontrolle tut. Ein gutes Beispiel für zerstörungsfreie Bearbeitung ist Apple's Aperture. Importierte digitale Bilder in Aperture werden nicht direkt geändert. Änderungen an Ebenen, Schärfen, Unschärfe usw. werden als Änderungen gespeichert und im laufenden Betrieb angewendet, wenn Sie mit einem Bild arbeiten. Jede Änderung kann sofort entfernt werden.

Natürlich würden Sie Snapshots der Datenbank für die Verteilung und Verwendung in Produktionsumgebungen erstellen. Dies wäre nur für die Entwicklung und Bearbeitung.

In der Versionierung von PostGIS , pgVersion und Post Facto finden Sie Ideen und mögliche Lösungen. Dies sind Versionskontrollsysteme, die in PostgreSQL-Datenbanken implementiert sind.


3

OSM verwendet Postgres und Postgis, die eine Momentaufnahme der Datenbank erstellen.

So implementieren Sie dies auf Ihrem eigenen Server und Ihrer eigenen Datenbank

http://wiki.openstreetmap.org/wiki/Databases#Choice_of_DBMS

Die Datenbank (plantet.osm) wird wöchentlich aktualisiert: http://wiki.openstreetmap.org/wiki/Planet_dump

Osmose ist es gewohnt"Es enthält Komponenten zum Lesen aus der Datenbank und aus der Datei, Komponenten zum Schreiben in die Datenbank und in die Datei sowie Komponenten zum Ableiten und Anwenden von Änderungssätzen auf Datenquellen."

http://wiki.openstreetmap.org/wiki/Osmosis

Changsets: http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#Changeset_Derivation_and_Merging


0

Ich dachte über dieses Problem nach und hatte eine Idee, habe sie aber nicht getestet. Es könnte gehen:

Verwenden Sie ein Versionskontrollsystem wie Mercurial oder Git. Mercurial wird einfacher, da es einfach ermöglicht, anonyme Zweige zu erstellen.

Starten Sie nun ab der ersten Überarbeitung einen Zweig für die öffentlichen Dataset-Importe. Es wird also 2 Zweige geben:

  1. Hauptleitung (OSM)
  2. öffentlicher Datensatz X.

Ein Import aus dem öffentlichen Datensatz sollte in Zweig 2 erfolgen und dann in den OSM-Zweig zusammengeführt werden.

Ihr Szenario könnte folgendermaßen funktionieren:

  • Ein Objekt existierte nicht
  • dann wird es importiert und in Zweig 1 zusammengeführt
  • dann wird es in der Hauptlinie geändert, einschließlich der Geometrie
  • Es wird erneut in Zweig 2 importiert
  • Wenn es in Zweig 1 zusammengeführt wird, werden in Zweig 1 nur die Daten aktualisiert, die in Zweig 2 aktualisiert wurden

Dies erfordert möglicherweise die Aufteilung der Daten in mehrere Dateien, eine pro Objekt und wahrscheinlich in ein Format wie json, damit VCS problemlos Änderungen an separaten Attributen verarbeiten kann.

{
     id: 1357
     lat: 1,
     lon: 2,
     tags: {
          'building': 'entrance'
     }
     type: 'node',
}
{
     nodes: [
         1357,
         2468
     ],
     tags: {
         building: 'yes',
     }
     type: 'way',
}

Ich weiß, dass das Aufteilen von Informationen in eine Milliarde Dateien für jedes System zu viel ist. Stattdessen sollte der Kern von VCS verwendet werden und OSM-Daten sollten verarbeitet und in versionierbarer Form in VCS eingespeist werden. (Oder ein Dateisystem kann verspottet werden).

Ich kann nicht garantieren, dass dies funktioniert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.