User:Qbit/DiffDB

From OpenStreetMap Wiki
Jump to: navigation, search

Ziel ist es, einen Webservice zu erstellen, der folgende Anfrage beantwortet: Welches Changeset hat an Knoten oder Wegen, die im Bereich BB liegen, Änderungen vorgenommen?


In Mengenschreibweise hätten wir folgendes:

{Changesets c | 
         (es existiert ein Knoten k | k ist Element von c UND k ist in BB)   //Knoten wurde verschoben
         ODER
         (es existiert ein Weg w | w ist Element von c UND es existiert ein Knoten k' mit (k' ist Element von w und k' ist in der BB)) //Weg mit Knoten in BB wurde verändert
}

Nun bezeichne k(i) den Knoten k in der Version i.

{Changesets c | 
         (es existiert ein Knoten k(i) | k(i) ist Element von c UND k(i-1) ist in BB)
         ODER
         (es existiert ein Weg w(j) | w(j) ist Element von c UND es existiert ein Knoten k'(l) mit
                                                                    (k'(l) ist Element von w(j-1) UND k'(l) ist in der BB [UND l ist maximal]))
}

Das [UND l ist maximal] bewirkt, dass nur Änderungen an Wegen infrage kommen, bei denen der Weg JETZT einen Knoten in der BB hat.

Nicht erfasst werden Wegen, die durch die BB gehen, aber innerhalb der BB keinen Knoten haben.

In SQL skizziert: ohne Berücksichtigung der Version:

SELECT changesetID from Changeset, Node, Way where
      (Changeset.element=='node' AND Node.nodeID==Changeset.nodeID                             AND IsInBB(Node.lon,Node.lat,BB)
      OR
      (Changeset.element=='way'  AND Way.wayID  ==Changeset.wayID  AND Node.nodeID==Way.nodeID AND IsInBB(Node.lon,Node.lat,BB)

mit Version

SELECT changesetID from Changeset, Node as NodeAlt, Node as NodeNeu, Way as WayNeu, Way as WayAlt where
         (Changeset.element=='node' AND NodeNeu.nodeID==Changeset.nodeID AND NodeNeu.nodeVersion==Changeset.nodeVersion AND NodeAlt.nodeVersion==NodeNeu.nodeVersion-1
                             AND ((NodeAlt.nodeID==NodeNeu.nodeID AND IsInBB(NodeAlt.lon,NodeAlt.lat,BB))
                                  OR
                                  (IsInBB(NodeNeu.lon,NodeNeu.lat,BB))
                                 ))
          OR
         (Changeset.element=='way' WayNeu.wayID==Changeset.wayID AND WayNeu.wayVersion==Changeset.wayVersion AND WayAlt.wayID==WayNeu.wayID-1
                             AND NodeNeu.nodeID==WayAlt.nodeID AND IsMax(NodeNeu.nodeVersion) AND IsInBB(NodeNeu.lon,NodeNeu.lat,BB)