Die Formate WKT und WKB Die Formate WKT und WKB Eine kurze Zusammenfassung von Rolf Breuer Inhaltsverzeichnis Vorwort.................................................................................................................................................4 Wer braucht so was..............................................................................................................................5 Der kleinste gemeinsame Nenner....................................................................................................5 ... und doch ein Fortschritt...............................................................................................................5 Der Aufbau des Formats.......................................................................................................................6 WellKnownText...............................................................................................................................6 Regel für alle Elemente...............................................................................................................6 Der Punkt....................................................................................................................................6 Die Linie.....................................................................................................................................6 Die Fläche...................................................................................................................................7 Die Mehfachpunkte.....................................................................................................................8 Die Mehfachlinien.......................................................................................................................9 Die Multiflächen.......................................................................................................................10 Die Geometriezusammenfassung..............................................................................................11 Der Text.........................................................................................................................................11 Extended WellKnownText............................................................................................................12 WellKnownBinary.........................................................................................................................12 Funktionsregister................................................................................................................................13 Aufbau des Funktionsregisters.......................................................................................................13 Der Funktionsname...................................................................................................................13 Parameter..................................................................................................................................13 Rückgabewert............................................................................................................................13 Fehlermeldungen.......................................................................................................................13 Definition in der Datenbank......................................................................................................14 Implementierungsunterschiede.................................................................................................14 Die Symbolik............................................................................................................................14 Funktionen nach Namen................................................................................................................14 Area()........................................................................................................................................14 AsBinary().................................................................................................................................17 AsText()....................................................................................................................................19 Boundary()................................................................................................................................20 Buffer()......................................................................................................................................25 Centroid()..................................................................................................................................30 Collect()....................................................................................................................................35 Contains()..................................................................................................................................38 ConvexHull()............................................................................................................................41 Crosses()....................................................................................................................................45 Distance()..................................................................................................................................49 Dimension()..............................................................................................................................51 Disjoint()...................................................................................................................................53 www.ronny-locht.de Seite1 Die Formate WKT und WKB Difference()...............................................................................................................................54 EndPoint....................................................................................................................................58 Envelop()...................................................................................................................................61 Equals().....................................................................................................................................63 ExteriorRing()...........................................................................................................................65 GeometryN().............................................................................................................................66 GeometryType()........................................................................................................................67 InteriorRingN().........................................................................................................................68 Intersection().............................................................................................................................69 Intersects().................................................................................................................................72 IsClosed()..................................................................................................................................74 IsEmpty()..................................................................................................................................76 IsSimple()..................................................................................................................................77 IsRing().....................................................................................................................................79 Length().....................................................................................................................................80 NumGeometries()......................................................................................................................82 NumInteriorRing()....................................................................................................................83 NumPoints()..............................................................................................................................84 Overlaps()..................................................................................................................................85 PointN().....................................................................................................................................88 PointOnSurface()......................................................................................................................88 Relate()......................................................................................................................................92 StartPoint()................................................................................................................................97 SRID().......................................................................................................................................98 SymDifference()........................................................................................................................99 Touches()................................................................................................................................102 Union()....................................................................................................................................105 Within()...................................................................................................................................107 X()...........................................................................................................................................110 y()............................................................................................................................................110 Funktionen nach Geometrien.......................................................................................................111 Funktionen die auf Punkte (Points) anwendbar sind..............................................................111 Funktionen die auf Linien (Linestrings) anwendbar sind ......................................................114 Funktionen die auf Flächen (Polygone) anwendbar sind .......................................................116 Funktionen die auf Mehfachpunkte (Multipoints) anwendbar sind .......................................119 Funktionen die auf Mehrfachlinien (Multilinestring) anwendbar sind ..................................122 Funktionen die auf Mehrfachflächen (Multipolygon) anwendbar sind .................................125 Funktionen die auf Sammlungen (GeometryCollections) anwendbar sind ...........................128 Der Datenbankzugriff.......................................................................................................................130 Einrichten einer Test-Datenbank.................................................................................................130 Beschaffung............................................................................................................................130 Erstellen der Testdatenbank....................................................................................................130 PostgreSQL/PostGIS...................................................................................................................130 Skripte.....................................................................................................................................139 Hinweise zur Installation........................................................................................................140 Backup der Datenbank............................................................................................................140 Austausch von Daten .............................................................................................................141 Performance-Tuning...............................................................................................................142 www.ronny-locht.de Seite2 Die Formate WKT und WKB Typische Fehlermeldungen.....................................................................................................144 MySQL........................................................................................................................................144 Erstellen der Datenbank..........................................................................................................145 Allgemeine Datenbankoptimierung..................................................................................................148 Index-Erstellung......................................................................................................................148 Querie-Planung.......................................................................................................................148 Programme für die Daten.................................................................................................................149 Viewer..........................................................................................................................................149 GIS-System..................................................................................................................................150 Betriebssystem-Verfügbarkeit.....................................................................................................150 Bezugsquellen..............................................................................................................................151 Die Beispiele................................................................................................................................151 www.ronny-locht.de Seite3 Die Formate WKT und WKB Vorwort Dies ist ein Buch/E-Buch, man sollte es so hinnehmen wie es ist, oder was ein anderes lesen. Es ist noch in einem unvollständigen Zustand und sollte als langsam wachsendes Werk angesehen werden. Ich versuche erst den Inhalt zu füllen und kümmere mich danach um die Rechtschreibfehler. Sollte sich jemand bemüßigt fühlen diese herauszufinden und mir zukommen zu lassen so bin ich gerne bereit sie zu korrigieren (Mail an Publikationen at ronny-locht de). Dieses Buch ist hauptsächlich durch das Arbeiten mit PostgreSQL/PostGIS und dem Editor OpenJump zustande gekommen, es ist aus der Datenbank Sicht geschrieben. Die Definitionen von dem OGC (Open-GIS-Consortium) sind eher an objektorientierten Sprachen ausgerichtet. Im Laufe der Zeit werden auch andere „frei“ zur Verfügung stehende Datenbanken hinzukommen (MySQL ist in Arbeit). Unter „frei“ verstehe ich hier, dass ich legal und kostenlos eine Version installieren und testen kann, für die Produktion muss dies nicht der Fall sein. Hierdurch war es möglich z. B. auch die Datenbank Oracle-Spatial zu testen. Viele Dinge die hier beschrieben werden sind anwendungsspezifisch bzw. datenbankspezifisch, deshalb gibt es für die einzelnen Datenbanken auch noch zusätzlich eigene Kapitel. Der Leser sollte immer beachten, dass nun von den großen Datenbankherstellern festgestellt wird, das mit solchen Anwendungen viel Geld verdient werden kann. Deshalb ist dies mittlerweile ein Boomthema gerade für Datenbank-Hersteller. Dieses Buch wird von einer einzelnen Person geschrieben, welche nebenbei noch einen VollzeitJob hat. Aus diesem Grund wird darum gebeten, Beschwerden auf Versionsunterschiede zu Prüfen. Ebenfalls möchte ich darauf hinweisen, das ich keinerlei Haftung für dieses Buch übernehmen kann. Dieses Buch für nicht kommerzielle Zwecke kostenfrei zur Verfügung gestellt. Alle irgendwie kommerziellen Nutzungen bedürfen einer gesonderten Einwilligung des Autors, wobei diese kostenfrei seien können. www.ronny-locht.de Seite4 Die Formate WKT und WKB Wer braucht so was Der kleinste gemeinsame Nenner Zur Zeit sind die Formate WellKnownBinary und WellKnownText der kleinste gemeinsame Nenner zwischen den meisten geografischen Informationssystemen. Es gibt einige Dinge die nicht mit gespeichert werden und auch nicht von den Funktionen berücksichtigt werden. Hierzu zählen zum Beispiel auch Bögen. Dies hat allerdings nicht nur Nachteile, so können Berechnungen ohne Bögen viel schneller von statten gehen. Ebenso ist die Entwicklung von Funktionen für diese wenigen Formate nicht so aufwendig. Wer sich in GI-System schon einmal versucht hat, kennt die Problematik, dass hier noch eine Ausnahme geschrieben werden muss und dort noch eine Sonderbehandlung gemacht werden muss. Der Traum jedoch, mit seinen Geometriedaten einfach von einer Plattform auf die nächste ziehen zu können, steht noch in weiter Ferne. Doch wer einmal diese einfach Mittel beherrscht, findet sich schnell in allen Systemen zurecht, welche diese verwenden. Und viele der mitgelieferten Funktionen wurden schon vom Autor selbst einmal für das ein oder andere System programmiert, weil diese nicht vorhanden waren. ... und doch ein Fortschritt Auch wenn das Konvertieren noch mühsam ist, und dies wahrscheinlich auch bleiben wird, so ist es doch ein großer Fortschritt. Nun können verschiedene System auf gleiche Datenbasen zurückgreifen. Ebenso können Programmierer Routinen einmal entwickeln und in verschiedenen Systemen nutzen. Ein Spezialist kann schnell von einem System zum nächsten Wechseln, ohne alles neu lernen zu müssen. So bleibt mehr Zeit, und natürlich auch Geld, für das was eigentlich wichtig ist, die Daten. www.ronny-locht.de Seite5 Die Formate WKT und WKB Der Aufbau des Formats WellKnownText Regel für alle Elemente Alle Elemente besitzen mindestens eine Koordinate oder sie sind eine leere Geometrie. Die leere Geometrie ist so etwas wie das Null-Element dieser Formate. Eine Koordinate besteht aus zwei oder drei (Zwei- oder Dreidimensional) rationalen Zahlen. Diese Zahlen werden durch Leerzeichen getrennt. Zuerst kommt der so genannte Rechtswert, dann der Hochwert zum Schluss eine eventuelle Höhe. Der Punkt Ein Punkt kann sowohl zur Darstellung einer Linie als auch für die Darstellung von Texten genutzt werden. Hierzu muss ihm noch ein Text und wenn für die Darstellung notwendig eine Drehung an die Seite gestellt werden. Auch nicht unüblich ist ein Abstand vom Einfügepunkt. Dies ist notwendig, wenn die Elemente, welcher er Beschriften soll, zu klein sind, um ihn aufzunehmen, muss allerdings auch vom Programm unterstützt werden. insert into test_2 (name, geom, text) values ('Punkt 3', geometryfromtext('Point(10 10)'), '212/14'); Links ein Punkt normal dargestellt, rechts als Beschriftung. Die Linie insert into beispiel_1 (name, geom) values ('Punkt 3', geometryfromtext('LINESTRING(5 5, 5 15, 15 15, 15 5, 5 5)')); www.ronny-locht.de Seite6 Die Formate WKT und WKB Die Koordinaten-Werte werden durch Leerzeichen getrennt, während die verschiedenen Koordinaten durch Kommata getrennt werden. Ein Linienzug mit vier Punkten "LINESTRING(5 5, 5 15,15 15, 15 5)" Zu beachten ist, das der Linienzug nie zu einer Fläche mutiert, unabhängig ob er geschlossen ist oder nicht. Wenn wir also dem obigen Beispiel ist der letzte Punkt gleich dem ersten Punkt (5 5) allerdings ergibt die Abfrage nach der Fläche 0, da Linien keine Ausdehnung haben. Man kann jedoch nachdem man mit der Funktion IsClosed() festgestellt hat, das der Linienzug geschlossen ist und in diesem Fall eine Fläche daraus erstellt werden. Die Fläche 'POLYGON((5 5, 5 15, 15 15, 15 5, 5 5))' 'POLYGON( (25 5, 35 5, 35 15, 25 15, 25 5), (27 7, 33 7, 33 13, 27 13, 27 7) )' Die ob stehenden Geometrien erzeugen folgende Flächen: Flächen mit und ohne "Löcher" Flächen können also einfach sein oder "Löcher" enthalten, teilweise werden diese Flächen mit www.ronny-locht.de Seite7 Die Formate WKT und WKB "Löchern" auch Donuts genannt. Jede Fläche muss geschlossen sein und mit dem Punkt enden, mit dem sie begonnen wurde. Eine Fläche besteht also aus mindestens 4 Punkten. Offensichtlich dürfen sich jedoch innere und äußere Fläche überschneiden. Ebenso darf es Selbstüberschneidungen von Flächen geben. In diesem Fall gelten die Flächen nicht mehr als Einfach (zu testen mit isSimple). Diese Flächen werden jedoch nicht in jedem Programm umsetzbar und darstellbar sein. POLYGON((5 5, 5 15, 15 5, 15 15, 5 5))')); und 'POLYGON( (25 5, 35 5, 35 15, 25 15, 25 5), (27 7, 33 4, 33 13, 27 13, 27 7))' Korrekte Fläche, welche jedoch besser durch Mehrfachflächen abgebildete werden. Die Mehfachpunkte Sollen Mehrere Punkte in einem Element abgebildete werden, so können diese im MehfachpunktObjekt abgebildet werden. Dies kann bei einer vor bestimmbaren maximalen Anzahl von Elementen auch durch mehrere Geometriespalten verwirklicht werden. Ein mögliches Beispiel könnten hier Symbole sein, welche einen Einfügepunkt haben und einen Punkt an dem Sie angezeigt werden sollen. www.ronny-locht.de Seite8 Die Formate WKT und WKB Dies kann zum Beispiel sinnvoll sein, wenn der Text zu groß für die Fläche ist, die er beschriften soll. Die Mehfachlinien Eine Mehfachlinie mit zwei Linien: MULTILINESTRING((10 10, 20 20), (15 15, 30 15)) Es wird hier jedoch ausdrücklich davor gewarnt Flächen wie unten gezeigt in einzelnen Linien zu digitalisieren. Bei dieser Form bilden die Linien keine Fläche, woraus sich natürlich ergibt, dass sich selbige nicht berechnen lässt. Wie in diesem Bild dargestellt, ist auch nicht gewährleistet, das die Punkte übereinander liegen. Eine Flächenfüllung ist natürlich nicht möglich, da die Geometrie keine Fläche ist. www.ronny-locht.de Seite9 Die Formate WKT und WKB Wenn so digitalisiert werden darf, sind hier immense Nacharbeiten nötig, um auf ein ordentliches Ergebnis zu kommen. Diese Form sollte nur gewählt werden wenn die Daten schon als Linien vorliegen und später zusammengeführt werden sollen. Eine sinnvolle Darstellung kann es jedoch sein, die eingemessenen Kanten eines Hauses in MultiLinien darzustellen. Im oberen Beispiel sind die rotbraunen Kanten eingemessen während die Fläche nur aus der RasterKarten digitalisiert ist. Hierbei gibt es in der Ebene für die Einmessungen nur ein Element für dieses Haus und in der Ebene für die Digitalisierung nur ein Element. Die Mehrfachflächen Ein Mehrfachfläche mit zwei Flächen: MULTIPOLYGON(((0 0,10 0,10 10,0 10,0 0)),((5 5,7 5,7 7,5 7, 5 5))) Es kann notwendig sein, das ein Objekt aus mehreren einzelnen Objekten besteht. Ein typisches Beispiel ist die automatisierte Liegenschaftskarte. Hier können durch Flurstückteilungen sehr schnell getrennte Flächen entstehen. www.ronny-locht.de Seite10 Die Formate WKT und WKB Oben ein Ausschnitt aus einer fiktiven ALK (automatisierte Liegenschaftskarte), die beiden Flurstücke wurden durch die graue Straße getrennt und bilden trotzdem eine Einheit. Dies wird für Plots auch durch die schwarzen Überhaken (Zugehörigkeitshaken) dargestellt. Der scheinbar einfachere Ansatz ist es, diese Flächen einzeln mit den gleichen Attributen zu erfassen. Dies kann aber sehr leicht zu Redundanzen, ich muss also immer alle Datensätze pflegen, anstatt einem. Ebenso könnte eine einzelne Fläche gelöscht werden, ohne dass die zugehörige Fläche gelöscht wird. Eine entsprechende Prozedur wäre sehr aufwendig. Daraus folgt man sollte zusammengehörige Objekte auch zusammen speichern. Die Geometriesammlung Eine Geometriesammlung, die aus zwei Punkten und einer Linie besteht: GEOMETRYCOLLECTION(POINT(10 10), POINT(30 30), LINESTRING(15 15, 20 20)) Hier muss allerdings davor gewarnt werden, die Komplexität der Anwendung zu verringern, in dem einfach alle zu einem Objekt gehörigen Element in eine Geometriesammlung gepackt werden. Die Geometriesammlungen unterstützt nur sehr wenige Funktionen. Nach kurzer Zeit wird der scheinbare Vorteil durch einen großen Programmieraufwand wieder zu Nichte gemacht. Die Geometriesammlung ist keine geordnete Struktur ist, wodurch schon einfache Tests auf die Datenintegrität nicht möglich sind. Zum Beispiel könnte die Darstellung der Flurstücke aus dem vorherigen Kapitel als Geometriesammlung darstellen. Hierbei werden die Texte jeweils durch einen Punkt dargestellt, die Zugehörigkeitshaken werden als Linien digitalisiert und die die Flächen als einzelne Polygone. Allerdings muss ich in manchen Datenbank-Systemen dann zum Berechnen der Größe zuerst die Fläche bzw. die Mehrfachfläche extrahieren. Hier fängt es dann an aufwendig zu werden. Ebenso tritt ein Problem damit auf, dass jemand natürlich auch versucht sein könnte beim einer hinzugekommenen Fläche, diese einfach als zusätzliche Linie einzufügen, ohne dass dies über einfache Tests verhindert werden könnte. www.ronny-locht.de Seite11 Die Formate WKT und WKB Der Text Also es gibt in der Definition von WKB/WKT keine explizite Definition für Texte. Meist werden die Einfügepunkte der Texte als Punkt-Geometrie abgespeichert und der eigentliche Text als Attribut. Eine weitere Variante als Multi-Point mit Einfügepunkt und Hinweislinie wurde im Kapitel MultiPunkt erwähnt. Für die meisten Menschen, die neu in GIS-Systemen sind, oder deren GIS-Systeme Texte unterstützen ist diese Variante ungewohnt. Doch sie ist schnell erlernt und sehr flexibel. Viele GI-System lassen es auch zu, z. B. für Flächen oder Linien, einen beschreibenden Text darzustellen, der aus einem Attribut genommen wird. Extended WellKnownText Der üblichen WKT-Darstellung wird noch eine SRID hinzugefügt. Dies ist eine Referenz auf eine Koordinatensystem-Definition. WellKnownBinary Im Format WellKnownBinary (kurz WKB) werden die Daten nur in ein besser für einen Computer zu lesendes Format umgewandelt. Dadurch wird zum Beispiel aus im WellKnownText POINT(10 10) der String 010100000000000000000024400000000000002440 im WellKnownBinary. www.ronny-locht.de Seite12 Die Formate WKT und WKB Funktionsregister Aufbau des Funktionsregisters Das Funktionsregister soll den Nutzer möglichst schnell zu der gewünschten Funktion führen und ihn vor der Wahl einer „falschen“ Funktion schützen. Hierfür ist zusätzlich aufgeführt, welche Funktion für welchen Geometrie-Typ definiert ist. Es versucht eine ausführliche Beschreibung der Funktionen und ihrer Verhaltensweise zu liefern. Um diese nicht für die verschiedenen Datenbanken jeweils einzeln machen machen zu müssen, wird für jede Datenbank dargestellt, wie die Funktion implementiert wurde. Der Funktionsname Ein schwarzer Funktionsname bedeutet, das diese Funktion dem Standard entspricht. Sie kann also auch bei Programmen verwendet werden, welche später eventuell auf eine andere Datenbank umgestellt werden sollen. Ein blauer Funktionsname bedeutet das diese Funktion nur in einer oder einigen Datenbanken vorhanden ist. Soll die Datenbank offen bleiben oder steht ein Portierung schon vor der Tür, so sollten diese Funktionen nicht verwendet werden oder nur in Berücksichtigung ob diese Funktionalität in beiden Datenbanken vorhanden ist oder später nach programmiert werden kann. Parameter Hier werden die nach OGC notwendigen Parameter dargestellt. Die Definitionen in der Datenbank müssen dem nicht folgen. Manchmal gibt es zusätzlich Parameter. Für Geometrien wird mit grauem Hintergrund angegeben, welche Geometrietypen sinnvolle Werte zurückgegeben werden. Mit weißem Hintergrund werden die Geometrien angegeben welche zwar einen Wert zurückgeben, aber welcher nicht sinnvoll ausgewertet werden kann. Rückgabewert Der Rückgabewert einer Funktion. Für Geometrien wird mit der buchspezifischen Symbolik dargestellt, welche grafischen Elemente von der Funktion zurückgegeben werden könnten. Dies hängt natürlich auch von der Eingabe ab, welche den Funktionen übergeben wird. Fehlermeldungen Hier werden die bekannten Fehlermeldungen und ihre Ursachen aufgeführt, dies ist natürlich von der Datenbank abhängig. Definition in der Datenbank Hier werden die Funktion so aufgeführt wie sie in der Datenbank definiert ist. Sollten mehrere Definition aufgeführt sein so soll in einem späteren Schritt auch versucht werden, die entsprechenden Unterschiede zwischen den Funktionen aufzuführen. www.ronny-locht.de Seite13 Die Formate WKT und WKB Implementierungsunterschiede Hier soll auf die Unterschiede und nicht normkonforme Implementierung von Funktionen hingewiesen werden. Jeder kennt diese Situation, das nicht das Ergebnis zurückkommt, welches erwartet wird, sondern welches einfacher zu erreichen ist. Dies ist zum Beispiel bei einigen MySQL-Funktionen der Fall, bei denen nur Berechnungen nur auf der Bounding-Box anstatt der komplexen Geometrie benutzt wird. Noch schlimmer kann die Rückgabe von null anstatt 0 sein, weil sich null immer weiter Fortpflanzt und so ganze Aussagen zu false ändert. Die Symbolik Geometrien 1. Punkt 2. Mehrfach-Punkt 3. Linie 4. Mehrfach-Linie 5. Fläche 6. Mehrfach-Fläche 7. Geometriesammlung Datenbanken 1. DB2 (noch nicht fertig) 2. MySQL 3. Oracle (noch nicht fertig) 4. PostgreSQL/PostGIS Funktionen nach Namen Area() Parameter Geometrie Rückgabewert Fließkommazahl Beschreibung Gibt die eingenommene Fläche als Skalar zurück. Ist das Element keine Fläche wird 0 oder null www.ronny-locht.de Seite14 Die Formate WKT und WKB zurückgegeben. numGeometries ∑ n=1 area Gn Beispiele select area(geometryfromtext('POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0), (2.5 2.5, 7.5 2.5, 7.5 7.5, 2.5 7.5, 2.5 2.5) )' )) [Area_102_1] Hier wird die Fläche eines 10x10 Polygons ermittelt, in dem ein 5x5 großes Polygon als 'Loch' eingebettet ist. Folgerichtig wird von 100 25 abgezogen, was 75 ergibt. select area(geometryfromtext('MULTIPOLYGON( ((0 0, 10 0, 10 10, 0 10, 0 0), (2.5 2.5, 7.5 2.5, 7.5 7.5, 2.5 7.5, 2.5 2.5) ), ((0 0, 10 0, 10 10, 0 10, 0 0)))') )) [Area_103_1] Bei Mehrfachflächen wird jede Fläche einzeln betrachtet, die Ergebnisse werden addiert. Darum ergibt die Anweisung oben 175 obwohl die eingenommene Fläche nur 100 ist. Bei Geometriesammlungen gibt es jedoch Ärger mit einer Mehrfachfläche. select (area(geometryfromtext('GEOMETRYCOLLECTION www.ronny-locht.de Seite15 Die Formate WKT und WKB ( POINT(2 3), LINESTRING(2 3,3 4), POLYGON( (0 0, 10 0, 10 10, 0 10, 0 0), (2.5 2.5, 7.5 2.5, 7.5 7.5, 2.5 7.5, 2.5 2.5) ) )' )) [Area_104_1] Die obere Anweisung ergab unter PostGIS das gewünschte Ergebnis 75, MySQL gibt null zurück. select asewkt(area(geometryfromtext('GEOMETRYCOLLECTION ( POINT(2 3), LINESTRING(2 3,3 4), MULTIPOLYGON( ( (0 0, 10 0, 10 10, 0 10, 0 0), (2.5 2.5, 7.5 2.5, 7.5 7.5, 2.5 7.5, 2.5 2.5) ), ((0 0, 10 0, 10 10, 0 10, 0 0)) ) )' ))) [Area_104_3] Die zweite Anweisung brachte nicht das erwartete Ergebnis, sondern gab 0 zurück. Dieser Test lief erst einmal nur unter der Kombination PostgreSQL/PostGIS. MySQL gibt hier konsequenterweise erneut null zurück. www.ronny-locht.de Seite16 Die Formate WKT und WKB Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION area2d(geometry) RETURNS Double precision 2. CREATE OR REPLACE FUNCTION area(geometry) RETURNS Double precision MySQL 1. Area(poly) RETRUNS 2. Area(poly) RETRUNS Implementierungsunterschiede Wird eine Geometrie übergeben, aus denen PostgreSQL keinen Wert ermitteln kann, so wird 0 zurückgegeben, bei MySQL wird null zurückgegeben. Dies ist bei einer Verwendung zu beachten, man sollte hier den SQL-Befehl "coalesce" benutzen um null. Meist kommt man mit null nicht besonders weit, deshalb ist die PostgreSQL-Variante programmiertechnisch besser handhabbar, wobei die MySQL-Variante eigentlich datenbanktechnisch korrekt ist. AsBinary() Parameter Geometrie String ByteCoding Beschreibung Gibt die Geometrie im Binär-Format WKB zurück. Bei der PostgreSQL-Funktion asewkb auch mit der angegebenen SRID. Ebenso kann man bei der PostgreSQL/PostGIS Kombination die ByteReihenfolgen angeben, damit man die Daten an andere Server weiter geben kann, welche mit einer entsprechenden Byte-Reihenfolge arbeiten. Beispiele Bei der PostgreSQL wird das Beispiel wie folgt dargestellt select asbinary( geometryfromtext('LINESTRING(50 2, 50 10)') ) [AsBinary_100_2] Ergibt 001\002\000\000\000\002\000\000\000\000\000\000\000\000\000I@\000\000\000\000\ 000\000\000@\000\000\000\000\000\000I@\000\000\000\000\000\000$@ www.ronny-locht.de Seite17 Die Formate WKT und WKB select geometryfromtext('LINESTRING(50 2, 50 10)') [AsBinary_100_3] ergibt bei PostGIS "01020000000200000000000000000049400000000000000040000000000000494000000000000 02440" allerdings by MySQL "" Nun einmal die Unterschiede in der Byte Reihenfolge, zuerst die Little-Indien-Variante select asbinary( geometryfromtext('LINESTRING(50 2, 50 10)') ,'NDR' ) [AsBinary_100_4] \001\002\000\000\000\002\000\000\000\000\000\000\000\000\000I@ \000\000\000\000\000\000\000@\000\000\000\000\000\000I@ \000\000\000\000\000\000$@ und nun die Big-Indien-Variante select asbinary( geometryfromtext('LINESTRING(50 2, 50 10)'), 'XDR' ) [AsBinary_100_5] \000\000\000\000\002\000\000\000\002@I\000\000\000\000\000\000@\ 000\000\000\000\000\000\000@I\000\000\000\000\000\000@$ \000\000\000\000\000\000 Rückgabewert Binärwert/Blob Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION asbinary(geometry, text) RETURNS bytea 2. CREATE OR REPLACE FUNCTION asbinary(geometry) RETURNS bytea 3. CREATE OR REPLACE FUNCTION astext(geometry) RETURNS text www.ronny-locht.de Seite18 Die Formate WKT und WKB 4. CREATE OR REPLACE FUNCTION asewkb(geometry) RETURNS bytea 5. CREATE OR REPLACE FUNCTION asewkb(geometry) RETURNS bytea MySQL 1. AsBinary(g) RETURNS blob 2. AsWKB(g) RETURNS BLOB AsText() Parameter Geometrie Beschreibung Gibt die Geometrie als WKT bzw. EWKT zurück. Dies ist häufig notwendig, damit man Ergebnisse kontrollieren kann, da die Darstellung als WKB, EWKB oder ein anderes OGC-Binär-Format für Menschen quasi nicht lesbar, auf jeden Fall aber nicht einfach behandelbar, ist. Beispiel Eine Geometrie ohne SRID. select astext( geometryfromtext('LINESTRING(50 2, 50 10)') ) [AsText_100_1] ergibt logischerweise "LINESTRING(50 2,50 10)" ebenso select astext(setsrid( geometryfromtext('LINESTRING(50 2, 50 10)') ,2091) ) [AsText_100_2] Bei PostGIS ist es möglich eine Geometrie mit SRID auszugeben. select asewkt(setsrid( geometryfromtext('LINESTRING(50 2, 50 10)') ,2091) ) [AsText_100_3] "SRID=2091;LINESTRING(50 2,50 10)" oder auch kürzer select asewkt( geometryfromtext('SRID=2091;LINESTRING(50 2,50 10)') ) [AsText_100_4] Allerdings ist diese Form offensichtlich nur für PostGIS lesbar. www.ronny-locht.de Seite19 Die Formate WKT und WKB Rückgabewert String Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION astext(geometry) RETURNS text 2. CREATE OR REPLACE FUNCTION asewkt(geometry, text) RETURNS text MySQL 1. AsText(g) RETURNS text 2. AsWKT(G) RETURNS text Boundary() Parameter Geometrie Rückgabewert Geometrie Beschreibung Gibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt. Das heißt aus einem Punkt wird eine leere Geometrie, aus einer Linie werden zwei Punkte und aus einer Fläche eine Linie. Tritt eine Grenz-Geometrie mehrfach auf, so hängt das Verhalten von der Anzahl des Auftretens ab. Tritt die Geometrie in gerader Anzahl auf, so wird diese entfernt. Tritt die Geometrie in ungerader Anzahl auf, so werden alle Vorkommen bis auf eins gelöscht. Man beachte hier die Definition der Dimension für diese Geometrien (siehe Abschnitt Dimension()). Beispiele Zuerst der Test mit einem Punkt SELECT asewkt(boundary(GeomFromText('POINT(100 100)'))) [boundary_99_1] Als Rückgabewert bekommen wir: "GEOMETRYCOLLECTION EMPTY" Anschließend der Versuch mit mehreren Punkten SELECT asewkt(boundary(GeomFromText('MULTIPOINT(100 100, 0 0, 0 100)'))) [boundary_105_1] www.ronny-locht.de Seite20 Die Formate WKT und WKB Jedoch mit dem gleichen Ergebnis: "GEOMETRYCOLLECTION EMPTY" Von Linien werden nur der erste und der letzte Punkt als Grenze genommen. Die Anweisung SELECT asewkt(boundary(GeomFromText('LINESTRING(100 100, 0 0, 0 100)'))) [boundary_101_3] ergibt "MULTIPOINT(100 100,0 100)" Von den drei Eckpunkten sind zwei Eckpunkte übrig geblieben. Diese werden also offensichtlich als "Grenze" der Linie genutzt, dies klingt auch erst mal logisch, daraus folgt: boundary G Linie ={startpoint Glinie , endpunkt G Linie } Dies machen auch die folgenden Abfragen deutlich: SELECT asewkt(boundary(GeomFromText('MULTILINESTRING((100 100, 0 0, 0 100), (200 200,99 100))'))) [boundary_101_4] ergibt MULTIPOINT(0 100,99 100,100 100,200 200) wobei die beiden mittleren Punkte sich überdecken, während [Boundary_101_6] www.ronny-locht.de Seite21 Die Formate WKT und WKB ergibt MULTIPOINT(100 100,200 200) Auch zu beachten ist hier die Reihenfolge der zurückgegeben Punkte. Diese scheint nicht von den Eingangsgeometrie abzuhängen. Hier wirft sich natürlich sofort die Frage auf, was bei einer sternförmigen Linienstruktur entsteht. Der Test mit 4 Linien ergibt das erwartete Ergebnis: SELECT boundary( GeomFromText('MULTILINESTRING( (100 100, 0 100), (200 200,0 100), (-100 -100,0 100), (-200 -100,0 100)) ') );[boundary_101_2] Geliefert wird: MULTIPOINT(-200 -100,-100 -100,100 100,200 200) Allerdings gibt die Abfrage mit der Linien dann entsprechend Rätsel auf: SELECT asewkt(boundary( GeomFromText('MULTILINESTRING( (100 100, 0 100), (200 200,0 100), (-100 -100,0 100))') )); [boundary_101_1] www.ronny-locht.de Seite22 Die Formate WKT und WKB Gibt folgende Multipoint-Geometrie mit vier Punkten zurück: MULTIPOINT(-100 -100,0 100,100 100,200 200) Offensichtlich werden Punkte nach der Häufigkeit ihres Vorkommens behandelt, was der Test mit 5 Linien beweist. SELECT asewkt(boundary( GeomFromText('MULTILINESTRING( (100 100, 0 100), (200 200,0 100), (-100 -100,0 100), (-200 -100,0 100), (-300 200, 0 100)) ') )); [boundary_101_5] Gibt folgende Multipoint-Geometry mit vier Punkten zurück: MULTIPOINT(-100 -100,0 100,100 100,200 200) Eine mögliche Ablauf für die Bildung dieser Menge könnte sein: 1. Hole alle Startpunkte und alle Endpunkte der Linien 2. Sortiere diese nach X und Y 3. Berechne die Anzahl der Vorkommen für jeden Punkt 4. Entferne die Punkte mit gerader Anzahl Ganz wesentlich ist, hierbei, dass eine Linie, welche geschlossen ist keine Boundary hat. select asewkt(boundary( geometryfromtext('LINESTRING(50 2,50 10, 0 0, 50 2)') www.ronny-locht.de Seite23 Die Formate WKT und WKB )) [Boundary_100_1] ergibt "MULTIPOINT EMPTY" Nachdem die Linien jetzt nun hoffentlich erschöpfend behandelt wurden, als nächstes die Flächen. select asewkt(boundary( geometryfromtext('POLYGON((0 0, 20 10, 0 20,0 0))') )); [boundary_102_1] Das Ergebnis ist logischerweise eine Dimension unter der Ursprungsnachweise und entspricht ihren Umfang. LINESTRING(0 0,20 10,0 20,0 0) Der Test des nicht überlappenden Multilinestring select asewkt(boundary('MULTIPOLYGON(((0 0, 20 10, 0 20,0 0)), ((50 50, 100,100 100, 100 50, 50 50)))')) [boundary_103_1] 50 ergibt keine Besonderheiten MULTILINESTRING((0 0,20 10,0 20,0 0),(50 50,50 100,100 100,100 50,50 50)) Es wird also ein Multilinestring daraus, welcher die zwei einzelnen Geometrien enthält. Das Überlappen von Geometrien, wird bei der Erstellung nicht berücksichtigt. select asewkt(boundary('MULTIPOLYGON(((0 0, 20 10, 0 20,0 0)), ((0 0, 100,100 100, 100 50, 0 0)))')) [boundary_103_2] 50 Das Ergebnis ist wieder ein Multilinestring MULTILINESTRING((0 0,20 10,0 20,0 0),(0 0,50 100,100 100,100 50,0 0)) Es werden also offensichtlich keine Verschneidungen zwischen den Grenzen erstellt. www.ronny-locht.de Seite24 Die Formate WKT und WKB Implementierungsunterschiede Die MySQL-Datenbank hat diese Funktion nur als Platzhalter definiert. Das Handbuch empfiehlt, diese Funktion nicht zu benutzen, der Autor auch. Fehlermeldungen PostgreSQL NOTICE: IllegalArgumentException: This method is not supported by GeometryCollection objects Diese Funktion sollte nicht mit einer Geometriesammlung aufgerufen werden. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION boundary(geometry) RETURNS geometry MySQL Hier wurde nur ein Platzhalter definiert. Buffer() Parameter Geometrie Fließkommazahl Abstand www.ronny-locht.de Seite25 Die Formate WKT und WKB [Integer] Anzahl, der Segmente auf einem Viertelkreis(Voreingestellt 8) Rückgabewert: Geometrie Beschreibung Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Der Wert für den Buffer muss >= 0 sein. Es wird immer eine Fläche zurückgegeben. Beispiele Für einen Punkt ist dies relativ einfach. select asewkt(buffer( geometryfromtext('POINT(1 1)',2) ))[Buffer_99_1] ergibt. "POLYGON((3 1,2.96157056080865 0.609819355978752,2.84775906503116 0.23463313529056,2.6629392246238 -0.111140466011207,2.41421356240484 ... 2.84775906513425,2.11114046578722 2.66293922477346,2.41421356215087 2.41421356259533,2.66293922442425 2.11114046630985,2.84775906489371 1.76536686504128,2.96157056073858 1.39018064437352,3 1.00000000035918,3 1))" oder grafisch Eine leere Geometrie gibt es zurück, wenn der Wert des Abstandes nicht größer 0 ist select asewkt(buffer( geometryfromtext('POINT(1 1)',0) ))[Buffer_99_3] ergibt dem Zufolge "GEOMETRYCOLLECTION EMPTY" www.ronny-locht.de Seite26 Die Formate WKT und WKB Die Abfrage select npoints(buffer( geometryfromtext('POINT(1 1)'),2) )) [NumPoints_99_1] ergibt in der PostgreSQL 34, es werden also wesentlich mehr Punkte erzeugt, als ursprünglich vorhanden. Wird der Buffer-Abstand größer gemacht, entstehen hierdurch nicht mehr Punkte, dieses verhalten kann nur durch die Anzahl der Segmente auf einem Viertelkreis geändert werden, welche durch den optionalen dritten Parameter gesetzt werden kann. Diese Anzahl ist also zunächst auf 8 Segmente gesetzt. select npoints(buffer( geometryfromtext('POINT(1 1)'),2,50) ) [NumPoints_99_2] ergibt "202" die zugehörige Abfrage select asewkt(buffer('POINT(1 1)',2,50)) [Buffer_99_4] erzeugt folgendes Bild Es sollte hierbei aber immer bedacht werden, dass eine hohe Anzahl Punkte die Verarbeitungsgeschwindigkeit eines Programms natürlich negativ beeinflusst. Große Mengen Punkte sollten nur für wenige große Flächen erzeugt werden, um die Antwortzeit von Abfragen sowie die Darstellungszeit von den darüber liegenden GIS-Systemen nicht unnötig zu senken. Wenn sich zwei Buffer eines Multi-Geometrie oder einer Geometriesammlung nicht überschneiden, so wird hieraus ein Multipolygon. select asewkt(buffer( www.ronny-locht.de Seite27 Die Formate WKT und WKB geometryfromtext('MULTIPOINT(0 0, 10 10)') ,2)) [Buffer_105_1] ergibt "MULTIPOLYGON(((12 10,11.9615705608087 9.60981935597875,11.8477590650312 9.23463313529056,11.6629392246238 8.88885953398879,11.4142135624048 8.58578643765865,11.1111404660859 8.33706077542609,10.7653668647924 ... 11.4142135625953,11.6629392244243 11.1111404663099,11.8477590648937 10.7653668650413,11.9615705607386 10.3901806443735,12 10.0000000003592,12 10)), ((2 0,1.96157056080865 -0.390180644021248,1.84775906503116 -0.76536686470944,1.6629392246238 -1.11114046601121,1.41421356240484 -1.41421356234135,1.11114046608587 -1.66293922457391,0.765366864792398 ... 1.41421356259532,1.66293922442425 1.11114046630985,1.84775906489371 0.765366865041277,1.96157056073858 0.390180644373524,2 3.59178066412433e-010,2 0)))" Die Bereiche werden verschnitten, wenn sie sich überlappen. select asewkt(buffer( geometryfromtext('MULTIPOINT(0 0, 10 10)') ,20))[Buffer_105_2] ergibt demzufolge nur ein Polygon: "POLYGON((-8.19059665197576 18.1905966527148,-6.62939224723572 21.1114046586188,-4.1421356253183 24.1421356221436,-1.1114046623519 26.6293922447414,2.34633135041683 28.4775906492808,6.09819355714545 ... 3.9018064384511,-18.4775906509989 7.65366864543522,-16.6293922472357 11.1114046586188,-14.1421356253183 14.1421356221436,-11.1114046623519 16.6293922447414,-8.19059665197576 18.1905966527148))" www.ronny-locht.de Seite28 Die Formate WKT und WKB Die restlichen Geometrien ergeben nichts sonderlich neues: select asewkt(buffer( geometryfromtext('MULTILINESTRING((1 1, 10 10, 20 0),(5 5, 20 10))') , 2)) [Buffer_101_1] "POLYGON((6.08036302695091 3.25193590220472, 2.41421356237309,-0.414213562373095, 2.41421356237309 -0.41421356237309 ... 18.5857864376269 -1.4142135623731, 11.9598184865245 5.21175438872926, 6.08036302695091 3.25193590220472))" select asewkt(buffer( geometryfromtext('POLYGON((0 0, 10 20, 0 20, 0 0))') ,2))[Buffer_102_1] "POLYGON((-2 0,-2 20,-1.96157056080646 20.3901806440323, -1.84775906502257 20.7653668647302, -1.66293922460509 21.1111404660392,-1.41421356237309 www.ronny-locht.de Seite29 Die Formate WKT und WKB ... -1.96352270241768 -0.38023492355432, -2 -3.59172492420644e-010, -2 0))" Allerdings rät das PostGIS-Handbuch davon ab, diese Funktion mit einer Geometriesammlung aufzurufen. Ein Test mit einer Geometriesammlung führte zu einem ordentlichen Ergebnis, welches jedoch nicht unbedingt immer erzielt werden kann. select asewkt(buffer('GEOMETRYCOLLECTION(POINT(20 20),POLYGON((0 0, 10 20, 0 20, 0 0)))', 2)) [Buffer_104_1] "MULTIPOLYGON(((22 20, 21.9615705608086 19.6098193559788, 21.8477590650312 19.2346331352906, ... -1.96352270241768 -0.38023492355432, -2 -3.59172492420644e-010, -2 0)))" www.ronny-locht.de Seite30 Die Formate WKT und WKB Implementierungsunterschiede Diese Funktion ist in der MySQL-Datenbank nicht vorhanden, es wurde auch kein Platzhalter definiert. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION buffer(geometry, Double precision) RETURNS geometry 2. CREATE OR REPLACE FUNCTION buffer(geometry, Double precision, integer) RETURNS geometry MySQL Diese Funktion wurde bis zur Version 5.0 nicht implementiert. Centroid() Parameter Geometrie Rückgabewert: Geometrie Beschreibung Gibt den Schwerpunkt des Objektes als Punkt zurück. Hier muss wie immer in den Handbücher darauf hingewiesen werden, dass der Schwerpunkt nicht zwingend in der Geometrie liegen muss, wird ein Punkt benötigt, welcher in der Geometrie liegt, so sollte die Funktion PointOnSurface verwendet. Das OGC-Konsortium schreibt hier keinen bestimmten Algorithmus vor, so das die Ergebnisse variieren können. Deshalb wird hier keine Formel angegeben werden. Beispiele Gehen wir zu den Beispielen über. Der Punkt gibt sich selber zurück. select asewkt(centroid( geometryfromtext('POINT(1 1)') )) [Centroid_99_1] ergibt "POINT(1 1)" Das nächste Beispiel macht klar, dass hier der Flächenschwerpunkt berechnet wird. select asewkt(centroid( geometryfromtext('MULTIPOINT(1 1, 2 1, 2 2, 1 2,10 10)') )) [Centroid_104_1] www.ronny-locht.de Seite31 Die Formate WKT und WKB ergibt diese Abfrage ergibt "POINT(3.2 3.2)" Das nächste Beispiel zeigt, dass auch bei geschlossenen Objekten das Zielobjekt nicht Teil des Ausgangsobjektes seien muss. select asewkt(centroid( geometryfromtext('LINESTRING(0 0, 10 20, 0 20)') ))[Centroid_100_1] ergibt "POINT(5 13.0901699437495)" Mehrfachlinien ergeben nichts wesentlich neues. select asewkt(centroid( geometryfromtext('MULTILINESTRING( (0 0, 10 0), (0 10, 10 10), (0 20, 10 20))' ) )[Centroid_101_1] ergibt "POINT(5 10)" www.ronny-locht.de Seite32 Die Formate WKT und WKB Wie wird das ganze definiert wenn sich die Breiten der Linien ändern. Die Abfrage select asewkt(centroid( geometryfromtext('MULTILINESTRING( (2 0, 8 0), (0 10, 10 10), (-2 20, 12 20))' ) ))[Centroid_101_2] ergibt die erwartete Verschiebung "POINT(5 12.6666666666667)" Hier ein Test mit einem Multipolygon. select asewkt(centroid( geometryfromtext('MULTIPOLYGON( ((0 0, 0 10 , 10 10, 10 0, 0 0)), ((100 100, 100 200, 200 200, 200 100, 100 100)))' ) ))[Centroid_103_1] ergibt "POINT(148.564356435644 148.564356435644)" www.ronny-locht.de Seite33 Die Formate WKT und WKB Der Punkt wird also nur minimal vom kleineren Polygon "angezogen". select asewkt(centroid( geometryfromtext('MULTIPOLYGON( ((0 0, 0 10 , 10 10, 10 0, 0 0)), ((100 100, 100 200, 200 200, 200 100, 100 100), (100.25 100.25, 100.25 199.75, 199.75 199.75, 199.75 100.25, 100.25 100.25) ) )') )) [Centroid_103_2] ergibt einen Punkt der fast genau mittig zwischen den beiden Massenschwerpunkten liegt. "POINT(77.4092615769712 77.4092615769712)" Offensichtlich werden nur die Geometrien der höchsten Schwerpunktbestimmung benutzt, was folgendes Beispiel zeigt. Dimension für die select asewkt(centroid( geometryfromtext('GEOMETRYCOLLECTION( POINT(1 1), LINESTRING(1 1, 1 100), www.ronny-locht.de Seite34 Die Formate WKT und WKB POLYGON((10 10,11 10, 11 11, 10 11, 10 10)) )') ))[Centroid_104_1] ergibt "POINT(10.5 10.5)" Nun soll diese Verhalten noch einmal mit einer Linie überprüft werden. select asewkt(centroid('GEOMETRYCOLLECTION( POINT(10 10), LINESTRING(1 1, 1 100))')) [Centroid_104_2] ergibt "POINT(1 50.5)" Implementierungsunterschiede Die MySQL hat diese Funktion nur für Flächen und Mehrfachflächen definiert und gibt für alle anderen Geometrietypen null zurück. www.ronny-locht.de Seite35 Die Formate WKT und WKB Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION centroid(geometry) RETURNS geometry Collect() Parameter Geometrie Geometrie .... Rückgabewert: Geometrie Beschreibung Gibt ein Multi-Objekt oder eine Geometrie-Kollektion zurück, je nachdem welche Parameter übergeben werden. Collect ist eine Aggregat-Funktion welche im SQL ähnlich wie die SUM- oder die MAX-Funktion im Zusammenhang mit "Group by" genutzt werden kann. In der folgenden Tabelle werden die entsprechenden Geometrie-Typen für verschiedene EingabeGeometrien dargestellt. Man sollte hier immer bedenken, das diese Funktion nicht assoziativ ist, dass heißt das gilt ∃ g1 , g2 , g3/collect collect g1 , g2 , g3≠collect collectg1 , g2 , g3 Ein entsprechendes Beispiel wird unten behandelt. Werden nur einfache Geometrien eines Typs als Eingabe genutzt so entsteht eine Mehrfachgeometrie des gleichen Typs, ansonsten entsteht eine Geometriesammlung. Gleiche Element werden nicht zusammengefasst, jedes Objekt hat also so viele Elemente wie Geometrien in dieses Objekt eingegangen sind. www.ronny-locht.de Seite36 Die Formate WKT und WKB Die entsprechende Funktion ist nur aus der PostGIS Erweiterung bekannt. Ob sie durch andere Datenbanken oder ein OGC-Definition unterstützt wird, muss noch untersucht werden. Beispiele Die einfachste Variante ist es zwei Punkt zu übergeben. select asewkt(collect('POINT(1 1)', 'POINT(2 2)'))[Collect_1_1] ergibt "MULTIPOINT(1 1,2 2)" allerdings select asewkt(collect( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(2 2)')) )[Collect_8_1] ergibt "GEOMETRYCOLLECTION(MULTIPOINT(1 1,2 2),POINT(3 3))" Hier soll noch einmal die Assoziativität aufgegriffen werden. Aus select asewkt(collect( collect( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(2 2)') ), geometryfromtext('POINT(3 3)')) ) [[Collect_106_1]] wird "GEOMETRYCOLLECTION(MULTIPOINT(1 1,2 2),POINT(3 3))" während select asewkt( collect(geometryfromtext('POINT(11)'), collect( geometryfromtext('POINT(2 2)'), geometryfromtext('POINT(3 3)')) ) ) [Collect_449_2] "GEOMETRYCOLLECTION(POINT(1 1),MULTIPOINT(2 2,3 3))" Nun zur eigentlichen Funktion von Collect, dem Aggregieren. select asewkt(collect(geom) from ( Select geometryfromtext('POINT(1 Select geometryfromtext('POINT(2 Select geometryfromtext('POINT(3 Select geometryfromtext('POINT(4 )[Collect_1149_1] 1)') as geom union 2)') union 3)') union 4)')) as subquery ergibt nur eine Geometrie "MULTIPOINT(1 1,2 2,3 3,4 4)" Hier stellt sich natürlich sofort die Frage was passiert mit gemischten Geometrien. select asewkt(collect(geom)) from ( Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom union Select geometryfromtext('POINT(1 1)') union Select geometryfromtext('LINESTRING(1 1,10 10)') union www.ronny-locht.de Seite37 Die Formate WKT und WKB Select geometryfromtext('POINT(2 2)')) as subquery [Collect_106_1] ergibt select asewkt(collect(geom)) from ( Select geom From ( Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom union Select geometryfromtext('POINT(1 1)') union Select geometryfromtext('LINESTRING(1 1,10 10)') union Select geometryfromtext('POINT(2 2)')) as subquery_2 order by geometrytype(geom) ) as subquery [Collect_1149_1] ergibt nur eine andere Sortierung "GEOMETRYCOLLECTION(LINESTRING(0 0,9 9),LINESTRING(1 1,10 10), POINT(1 1),POINT(2 2))" Erst select asewkt(collect(geom)) from ( Select collect(geom) as geom From ( Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom union Select geometryfromtext('POINT(1 1)') union Select geometryfromtext('LINESTRING(1 1,10 10)') union Select geometryfromtext('POINT(2 2)')) as subquery_2 where geometrytype(geom)='POINT' UNION Select collect(geom) as geom From ( Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom union Select geometryfromtext('POINT(1 1)') union Select geometryfromtext('LINESTRING(1 1,10 10)') union Select geometryfromtext('POINT(2 2)')) as subquery_2 where geometrytype(geom)='LINESTRING' ) as subquery [Collect_1149_3] ergibt nur zwei Geometriesammlungen "GEOMETRYCOLLECTION(MULTILINESTRING((0 0,9 9),(1 1,10 10)),MULTIPOINT(1 1,2 2))" Die nächste Frage die sich stellt, ist, was passiert mit doppelten Geometrien. select asewkt(collect( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)')) ) [Collect_1_2] ergibt "MULTIPOINT(1 1,1 1)" Eine Zusammenfassung von Elementen findet also nicht statt. Auch Geometriesammlungen werden nicht aufgelöst und zu größeren verschmolzen. select asewkt(collect( geometryfromtext('GEOMETRYCOLLECTION(POINT(1 1))'), geometryfromtext('GEOMETRYCOLLECTION(POINT(1 1))')) ) [Collect_49_1] ergibt demnach GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1 1)),GEOMETRYCOLLECTION(POINT(1 1))) Implementierungsunterschiede Diese Funktion wird von der MySQL-Datenbank nicht unterstützt. www.ronny-locht.de Seite38 Die Formate WKT und WKB Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION centroid(geometry) RETURNS geometry MySQL Diese Funktion ist in der MySQL-Datenbank nicht definiert. Contains() Parameter Geometrie Geometrie Rückgabewert Boolean Beschreibung Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. Eine Geometrie ist auch in einer anderen Geometrie vorhanden, wenn diese gleich sind. Mathematisch also ausgedrückt: G1⊆G 2 Eine, nebenbei bemerkt nicht validierbare, Geometrie kann in einer Geometrie einer niedrigeren Dimension enthalten sein. Dies geht sowohl bei der Implementierung von PostGIS als auch von der MySQL. Ein Geometrie muss vollständig in der anderen Geometrie enthalten sein, darf aber auf dem Rand liegen. Ist die Geometrie über mehrere Geometrien einer Mehrfachgeometrie oder einer Geometriesammlung enthalten, so wird diese vorher nicht aggregiert, sondern jede Geometrie wird einzeln geprüft. Beispiele Die einfache Variante ist select contains( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Contains_1_1] ergibt und select contains( geometryfromtext('MULTIPOINT(1 2, 2 2)'), www.ronny-locht.de Seite39 Die Formate WKT und WKB geometryfromtext('POINT(2 2)') ) [Contains_8_1] ergibt das erwartete Ergebnis true und auch select contains( geometryfromtext('MULTIPOINT(1 2, 2 2)'), geometryfromtext('MULTIPOINT(1 2, 2 2)')) ) [Contains_9_1] ergibt true. Ein Mehrfachobjekt kann in einem einfachen Objekt der gleichen Dimension liegen. select asewkt(contains ( geometryfromtext('POINT(1 1)'), geometryfromtext('MULTIPOINT(1 1 , 1 1)')) ) [Contains_2_1] ergibt true. Dass die Dimension keine Rolle spielt, zeigt folgende Abfrage select contains( geometryfromtext('POINT(1 1)'), geometryfromtext('LINESTRING(1 1, 1 1)') ) [Contains_3_1] ergibt true, wobei bedacht werden sollte das select isvalid( geometryfromtext('LINESTRING(1 1, 1 1)') ) natürlich false ergibt. Ebenso ergibt select asewkt(contains( geometryfromtext('POINT(1 1)'), geometryfromtext('GEOMETRYCOLLECTION(POINT(1 1), POINT(1 1))')) ) [Contains_7_1] true Wahr ergeben natürlich auch die folgenden Ausdrücke: select contains( geometryfromtext('LINESTRING(0 0, 10 10)'), geometryfromtext('LINESTRING(0 0, 1 1)') ) [Contains_17_1] select contains( geometryfromtext('POLYGON((0 0, 10 20, 20 0, 0 0))'), geometryfromtext('POLYGON((0 0, 5 10, 10 10,0 0))') www.ronny-locht.de Seite40 Die Formate WKT und WKB ) [Contains_33_1] Falsch ergeben die folgenden Ausdrücke select contains( geometryfromtext('MULTIPOLYGON( ((0 0, 10 0, 10 10, 0 10, 0 0)), ((10 0, 20 0, 20 10, 10 10, 10 0)))'), geometryfromtext('POLYGON((8 2, 12 2, 12 4, 8 4, 8 2))') ) [Contains_40_1] wobei die Mehrfachfläche natürlich nicht "valid" ist. Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). PostgreSQL gibt true oder false für Wahr oder Falsch zurück, MySQL hingegen 0 oder 1. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION contains(geometry, geometry) RETURNS boolean MySQL 1. Contains(g1,g2) RETRUNS boolan www.ronny-locht.de Seite41 Die Formate WKT und WKB ConvexHull() Parameter Geometrie Beschreibung Gibt die konvexe Hülle eines Elementes zurück. Es gilt die Konvexe (convX) 1. ist minimal ¬∃convX G1 ldots Gn convX G 1 ldots G n daraus folgt natürlich, das convX eindeutig ist 2. alle Punkte der Ausgangsgeometrien sind Teilmenge {¬∃P ∈G1 ...G n∨P ∉convX } 3. für jeweils zwei Punkte in der Hülle sind auch alle Punkte auf der Linie zwischen den Punkten Teilmenge von convX Diese Funktion gibt auf Grund ihre Definition nur einfache Geometrien zurück. Für Punkte und Zwei-Punkt-Linien ist die Konvexe Hülle eine Identitätsfunktion. Hier sei noch mal auf den Wikipedia-Artikel hierzu hingewiesen, der dieses noch einmal näher erläutert: http://de.wikipedia.org/wiki/Konvexe_H%C3%BClle Beispiele Für einen Punkt ist eine konvexe Hülle eine Identitätsfunktion, was das folgende Beispiel zeigt select asewkt(convexhull(geometryfromtext('POINT(1 1)'))) [ConvexHull_99_1] ergibt "POINT(1 1)" Kleiner als ein Punkt kann natürlich keine Geometrie sein. Soll eine Konvexe Hülle von mehreren Objekten erstellt werden, so muss die Collect-Funktion genommen werden. select asewkt(convexhull( collect( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(2 2)')) ) ) [ConvexHull_1_1] Hier sieht man, das jede Geometrie, welche mehr als einen Punkt enthält, mindestens die Dimension 1 hat, denn das Ergebnis ist "LINESTRING(1 1,2 2)" www.ronny-locht.de Seite42 Die Formate WKT und WKB Das gleiche Ergebnis ergibt allerdings auch select asewkt(convexhull(geometryfromtext( 'LINESTRING(1 1, 2 2)')) ) [ConvexHull_100_1] was zeigt, dass für Zwei-Punkt-Linien die konvexe Hülle eine Identitätsfunktion ist. Geometrien der Dimension 1 entstehen allerdings nur, wenn ab dem 3. Punkt alle linear abhängig sind. select asewkt(convexhull(geometryfromtext( 'GEOMETRYCOLLECTION( POINT( 1 1), POINT(2 2), LINESTRING(1.25 1.25, 1.75 1.75) )')) ) [ConvexHull_104_1] ergibt "LINESTRING(1 1,2 2)" select asewkt(convexhull( geometryfromtext('LINESTRING(0 0, 1 2, 0 2)') )) [ConvexHull_100_2] ergibt "POLYGON((0 0,0 2,1 2,0 0))" www.ronny-locht.de Seite43 Die Formate WKT und WKB An diesem Beispiel sieht man leicht, die entstehende Fläche, weil der dritte Punkt linear unabhängig ist. Ebenso kann man aus einem Multi-Punkt eine Fläche erstellen select asewkt(convexhull( geometryfromtext('MULTIPOINT(0 1, 0 2, 1 3, 2 3, 3 2, 3 1, 2 0, 1 0)') )) [ConvexHull_105_1] ergibt "POLYGON((1 0,0 1,0 2,1 3,2 3,3 2,3 1,2 0,1 0))" Den select asewkt(convexhull( geometryfromtext('POLYGON((0 0, 1 1, 0 2, 2 2, 2 0 , 0 0))') ))[ConvexHull_102_1] ergibt "POLYGON((0 0,0 2,2 2,2 0,0 0))" www.ronny-locht.de Seite44 Die Formate WKT und WKB An diesem Beispiel sieht man, das zur konvexen Hülle auch alle Elemente in die "zwischen" dieser Geometrie gehören. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION convexhull(geometry) RETURNS geometry MySQL 2. ConvexHull(g) RETRUNS geometry Rückgabewert Geometrie Crosses() Parameter Geometrie Geometrie Beschreibung Gibt zurück, ob sich zwei Geometrien überkreuzen, was bedeutet 1. die beiden Geometrien überschneiden sich {∃ P / P ∈G 1∧P ∈G 2 } 2. die maximale Dimension der Schnittmenge muss um eins kleiner als die maximale Geometrie der Eingangsgeometrien sein dim intersectsG1, G 2 =max dim G 1 , dimG2 −1 3. kein Punkt der Schnittmenge darf auf dem Rand einer der beiden Flächen liegen {∀ P n ∈G1∧P n ∈G2 / P n ∉border G 1∧P n ∉border G2 } www.ronny-locht.de Seite45 Die Formate WKT und WKB 4. keine der Geometrien ist echte Teilmenge der anderen Geometrie (keine echte Bedingung da sie aus 3 folgt G1⊈G 2∧G 2⊈G1 Beispiele Nach der Definition muss die folgende Abfrage false zurückgeben, da die zweite Teilmenge von der erste ist, ... und natürlich umgekehrt, außerdem müsste das Ergebnis eine Dimension niedriger sein als die Punkte, dies wäre die leere Geometrie, dass widerspricht jedoch der Forderung, dass die beiden Geometrien gemeinsame Elemente haben. select crosses( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Crosses_1_1] Die erste ernsthafte Abfrage muss dann also sein select crosses( geometryfromtext('MULTIPOINT(1 1, 2 1)'), geometryfromtext('LINESTRING(0 0, 2 2)')) ) [Crosses_10_1] Die ist die erste Abfrage, welche true zurück gibt. Hier sind zum ersten Mal alle Bedingungen erfüllt. Das klassische und einleuchtendeste Beispiel ist wohl select crosses( geometryfromtext('LINESTRING(0 1, 1 0)'), geometryfromtext('LINESTRING(0 0, 1 1)') )[Crosses_17_1] Dieses gibt natürlich true zurück. Wohingegen die folgende Anweisung false zurück gibt, weil die Geometrie, welche Intersection zurückgeben würde auch die Dimension 1 hat. select crosses( geometryfromtext('LINESTRING(0 0, 2 2)'), geometryfromtext('LINESTRING(1 1, 3 3)') ) [Crosses_17_1] www.ronny-locht.de Seite46 Die Formate WKT und WKB Nun ist natürlich die Frage wann kreuzen sich zwei Flächen. select crosses( geometryfromtext('LINESTRING(1 1, 10 10)'), geometryfromtext('POLYGON((0 0, 5 0 , 5 5 , 0 5, 0 0))') ) [Crosses_19_1] ergibt true Allerdings ergibt die nächste Abfrage false, weil select crosses( geometryfromtext('LINESTRING(5 2, 5 10)'), geometryfromtext('POLYGON((0 0, 5 0 , 5 5 , 0 5, 0 0))') ) [Crosses_19_2] ergibt false www.ronny-locht.de Seite47 Die Formate WKT und WKB Der Versuch mit zwei Polygonen scheitert. select crosses( geometryfromtext('POLYGON((2 2, 10 2, 10 10,2 10, 2 2))'), geometryfromtext('POLYGON((0 0, 5 0 , 5 5 , 0 5, 0 0))') ) [Crosses_33_1] ergibt aufgrund der Dimension (als Fläche wird 2 zurückgeben) false Die nächste Abfrage macht deutlich, dass der Aufruf mit zwei Flächen nicht sinnvoll ist, da die Schnittmenge immer entweder eine Fläche ist oder Punkte von ihr auf dem Rand liegen. select crosses( geometryfromtext('POLYGON(( 2 5, 10 5 , 10 10 , 2 10, 2 5))'), geometryfromtext('POLYGON((0 0, 5 0 , 5 5 , 0 5, 0 0))') ) [Crosses_33_3] ergibt jedoch false www.ronny-locht.de Seite48 Die Formate WKT und WKB Rückgabewert: Boolean Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). PostgreSQL gibt "t" oder "f" für Wahr oder Falsch zurück, MySQL hingegen 0 oder 1. Das MySQL-Handbuch sagt aus, dass für eine Fläche oder eine Mehrfachfläche als erste Geometrie oder einen Punkt oder Mehfachpunkt als zweite Geometrie null zurückgegeben wird. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION crosses(geometry, geometry) RETURNS boolean MySQL 1. Crosses(g1,g2) returns double precision Distance() Parameter Geometrie Geometrie www.ronny-locht.de Seite49 Die Formate WKT und WKB Beschreibung Berechnet die kürzeste Distanz zwischen zwei Objekten. Beispiele select distance( geometryfromtext('POLYGON((10 10, 20 10, 20 20, 10 20, 10 10))'), geometryfromtext('POINT(0 0)') [Distance_316_1] ) ergibt ungefähr 14,1 Überschneiden oder berühren sich zwei Elemente, so wird der Wert 0 zurückgeben, wie im unteren Beispiel. Es wird also nicht null zurückgeben, ein wichtiger Unterschied. select distance( geometryfromtext('POLYGON((10 0, 20 0, 20 10, 10 10, 10 0))'), geometryfromtext('POLYGON((5 5, 15 5, 15 15, 5 15, 5 5), (7 7, 7 9, 9 9, 9 7 , 7 7) )') ) [Distance_33_1] Löcher in Flächen werden berücksichtigt, also wird die Distanz zwischen der Fläche und dem Punkt www.ronny-locht.de Seite50 Die Formate WKT und WKB mit 2,5 zurückgegeben. select distance( geometryfromtext('POLYGON((5 5, 15 5, 15 15, 5 15, 5 5), (7 7, 7 12, 12 12, 12 7 , 7 7) )'), geometryfromtext('POINT(9.5 9.5)') ) [Distance_316_1] Da eine Distanz immer positiv ist werden nur positive Werte zurückgegeben werden. Rückgabewert Fließkommazahl r ∈ℝ Implementierungsunterschiede Dieses ist eine der wenigen Analyse-Funktionen die nicht auf den MBR zurückgreift, auch wenn man sich hier leicht im Handbuch vertun kann. PostgreSQL 1. CREATE OR REPLACE FUNCTION distance(geometry, geometry) RETURNS double precision 2. CREATE OR REPLACE FUNCTION distance_sphere(geometry, geometry) RETURNS double precision (NUR FÜR PUNKTE) 3. CREATE OR REPLACE FUNCTION distance_spheroid(geometry, geometry) RETURNS double precision (NUR FÜR PUNKTE) MySQL 1. Distance(g1,g2) returns double precision Dimension() Parameter Geometrie www.ronny-locht.de Seite51 Die Formate WKT und WKB Beschreibung Gibt die Dimension einer Geometrie zurück, diese muss kleiner oder gleich der Dimension der Tabelle sein die Dimension kann nur -1, 0, 1 oder 2 sein. Hier ist mit Dimension nicht der Freiheitsgrad der Geometrie oder des Koordinatensystems gemeint, sondern deuten auf den Geometrietyp hin. Bei Geometriesammlungen wird die maximale Dimension der enthaltenen Objekte zurückgegeben. Dimension Typ -1 leere Geometrie 0 Punkt 1 Linie 2 Fläche Beispiele Punkte select dimension( geometryfromtext('POINT(1 1)') ) [Dimension_99_1] ergibt 0 Dementsprechend select dimension( geometryfromtext('MULTIPOINT(1 1, 2 2)') ) [Dimension_105_1] ergibt 0 Linie select dimension( geometryfromtext('LINESTRING(2 3,3 4)') ) [Dimension_100_1] ergibt wie Mehrfachlinien auch 1 Flächen select dimension( geometryfromtext('POLYGON((0 0, 10 20, 20 0, 0 0))') ) [Dimension_102_1] ergibt wie Multiflächen www.ronny-locht.de Seite52 Die Formate WKT und WKB 2 Geomtriesammlung Hier der Interessante Teil, die Geometriesammlungen. select dimension( geometryfromtext( 'GEOMETRYCOLLECTION( POINT(2 3), LINESTRING(2 3,3 4), MULTIPOLYGON( ((0 0, 10 0, 10 10, 0 10, 0 0), (2.5 2.5, 7.5 2.5, 7.5 7.5, 2.5 7.5, 2.5 2.5)), ((0 0, 10 0, 10 10, 0 10, 0 0)) ) )' ) ) [Dimension_104_1] ergibt 2 Doch was passiert mit Geometriesammlungen, die nur Elemente enthält, welche eine niedrigere Dimension hat als 2. select dimension( geometryfromtext( 'GEOMETRYCOLLECTION( POINT(2 3), LINESTRING(2 3,3 4)) ' )) [Dimension_104_2] ergibt 1 Rückgabewert Ganzzahl n∈−1,0 ,1 ,2 Fehlermeldungen PostgreSQL 1. Something went wrong in dimension computation Tritt auf, wenn man bei der PostGIS-Variante Dimension mit einer leeren Geometrie aufruft. Bei MySQL wird hier nur null zurückgegeben. Das korrekte Verhalten sollte allerdings sein, dass 0 zurückgeben wird. PostgreSQL 1. CREATE OR REPLACE FUNCTION dimension(geometry) RETURNS integer MySQL 1. Dimension(g) returns int www.ronny-locht.de Seite53 Die Formate WKT und WKB Disjoint() Parameter Geometrie Geometrie Beschreibung Gibt zurück ob zwei Geometrie geometrisch disjunkt sind. Dies ist der Fall wenn ¬∃ P / P∈G1 ∧P∈G 2 Es gibt also keinen Punkt der in beiden Geometrien enthalten ist. Beispiele: select disjoint( geometryfromtext('LINESTRING(5 2, 5 10)'), geometryfromtext('LINESTRING(5 2, 5 -10)') ) [Disjoint_17_1] ergibt false ebenso select disjoint( geometryfromtext('LINESTRING(50 2, 50 10)'), geometryfromtext('MULTIPOLYGON( ((50 2, 50 10 , 60 10 , 60 2, 50 2)), ((0 0, 5 0 , 5 5 , 0 5, 0 0)))' ) ) [Disjoint_244_1] Es ist also klar, das die beiden Geometrien Element-Fremd seine müssen. Rückgabewert: Boolean Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). PostgreSQL 1. CREATE OR REPLACE FUNCTION disjoint(geometry, geometry) RETURNS boolean MySQL 1. Disjoint(g1,g2) returns int www.ronny-locht.de Seite54 Die Formate WKT und WKB Difference() Parameter Geometrie Geometrie Beschreibung Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Ausnahme ist, wenn die resultierende Geometrien gleich sind, hier entsteht immer eine leere Geometrie. Wird eine Geometrie kleinerer Dimension aus einer Geometrie höherer Dimension ausgeschnitten, so werden höchstens Stützpunkte hinzugefügt. Die Dimension der zurückgegeben Geometrie entspricht der Ursprungsgeometrie (G1) oder ist eine leere Geometrie. Beispiele Das einfachste Beispiel ist wohl select asewkt(difference( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') )) [Difference_1_1] es ergibt natürlich "GEOMETRYCOLLECTION EMPTY" und select asewkt(difference( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 2)') )) [Difference_1_2] ergibt "POINT(1 1)" Bei der nächsten Abfrage wird deutlich, dass der Rand ausgenommen ist, bzw. auf Grund der mathematischen Ungenauigkeiten ausfällt. select asewkt(difference( geometryfromtext('LINESTRING(0 0, 10 10)'), geometryfromtext('LINESTRING(5 5,11 11)') )) [Difference_17_2] ergibt "LINESTRING(0 0,5 5)" www.ronny-locht.de Seite55 Die Formate WKT und WKB Die Verschneidung von einer Linie mit einer Fläche erzeugt eine neue Geometrie, welche gleich der alten Geometrie ist, wenn man sich nicht die Punkte anschaut select asewkt(difference( geometryfromtext('POLYGON((0 0, 20 10, 20 0, 0 0))'), geometryfromtext('LINESTRING(5 0,5 20)') )) [Difference_31_1] ergibt "POLYGON((0 0,5 2.5,20 10,20 0,5 0,0 0))" Offensichtlich sind in die Geometrie nur zwei Punkte eingefügt worden Die Veränderung ist eigentlich auch logisch, da eine Menge entfernt wird, welche in der Dimension der Fläche nicht vorhanden ist. Einer Linie wird der zusätzlich Stützpunkt nicht hinzugefügt, wie das folgende Beispiel zeigt. select asewkt(difference( geometryfromtext('LINESTRING(5 0,5 20)'), geometryfromtext('POINT( 5 10)') )) [Difference_31_1] ergibt " LINESTRING(5 0,5 20)" www.ronny-locht.de Seite56 Die Formate WKT und WKB Andersherum ist es sehr wohl möglich, aus einer Linie eine Fläche aus zuschneiden. select asewkt(difference( geometryfromtext('LINESTRING(5 0,5 20)'), geometryfromtext('POLYGON((0 0, 20 10, 20 0, 0 0))') )) [Difference_19_1] ergibt wie erwartet LINESTRING(5 2.5,5 20) Mehrfachgeometrien können auch problemlos behandelt werden. select asewkt(difference( geometryfromtext('MULTILINESTRING( (0 0, 0 20, 10 10), (2 10, 4 10))' ), geometryfromtext('LINESTRING(0 0, 0 10, 10 10, 5 15)') )) [Difference_24_1] LINESTRING(0 10,0 20,5 15) www.ronny-locht.de Seite57 Die Formate WKT und WKB Implementierungsunterschiede MySQL hat diese Funktion nicht implementiert. Parameter Geometrie Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION difference(geometry, geometry) RETURNS geometry MySQL Diese Funktion ist in der MySQL nicht implementiert, sie soll vielleicht später hinzugefügt werden. Fehlermeldungen PostgreSQL 1. IllegalArgumentException: This method does not support GeometryCollection arguments Bedeutet, dass diese Funktion nicht mit einer Geometriesammlung aufgerufen werden darf. www.ronny-locht.de Seite58 Die Formate WKT und WKB EndPoint Parameter Geometrie Beschreibung Gibt den letzten Punkt einer Linie zurück, bei einer Mehrfachlinie den letzten Punkt der ersten Linie. Beispiele select asewkt(endpoint( geometryfromtext('LINESTRING(0 0, 0 10, 10 10, 5 15)') )) [EndPoint_100_1] ergibt "POINT(5 15)" select asewkt(endpoint( geometryfromtext('MULTILINESTRING((0 0, 0 20, 10 10), (2 10, 4 10))') )) [EndPoint_101_1] ergibt "POINT(10 10)" www.ronny-locht.de Seite59 Die Formate WKT und WKB Wird der Endpunkt der weiteren Linien benötigt, so muss diese zuerst aus der Geometrie gelöst werden. select asewkt(endpoint(geometryn( geometryfromtext('MULTILINESTRING( (0 0, 0 20, 10 10), (2 10, 4 10))' ) ,2))) [EndPoint_101_3] ergibt "POINT(4 10)" Wie in den Parametern angegeben können Polygone nicht ausgewertet werden, was die folgende Abfrage zeigt. www.ronny-locht.de Seite60 Die Formate WKT und WKB select asewkt(endpoint(geometryn( geometryfromtext( 'MULTIPOLYGON( ((50 2, 50 10 , 60 10 , 60 2, 50 2)), ((0 0, 5 0 , 5 5 , 0 5, 0 0)))' ) ,2))) [EndPoint_103_2] ergibt "<NULL>" select asewkt(endpoint(exteriorring(geometryn( geometryfromtext('MULTIPOLYGON( ((50 2, 50 10 , 60 10 , 60 2, 50 2)), ((0 0, 5 0 , 5 5 , 0 5, 0 0)))' ) ,2)))) [EndPoint_103_3] ergibt "POINT(0 0)" Nun kann man natürlich die Geometrie entsprechend behandeln, die folgende Abfrage liefert das gewünschte Ergebnis Rückgabewert Geometrie Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION endpoint(geometry) RETURNS geometry MySQL EndPoint(ls) RETRUNS geometry Envelop() Parameter Geometrie Beschreibung Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Das heißt, es müssen mindestens 3 linear unabhängige Punkte zur Verfügung stehen, um ein reguläres Polygon zu erzeugen. select asewkt(envelope( geometryfromtext('POINT( 5 10)') )) [Envelop_99_1] ergibt www.ronny-locht.de Seite61 Die Formate WKT und WKB "POLYGON((5 10,5 10,5 10,5 10,5 10))" allerdings ergibt select isvalid('POLYGON((5 10,5 10,5 10,5 10,5 10))') false. Das erste vernünftige Ergebnis ergibt sich aus select asewkt(envelope( geometryfromtext('MULTIPOINT( 5 10, 4 3, 10 12)') )) [Envelop_105_1] ergibt "POLYGON((4 3,4 12,10 12,10 3,4 3))" Also reguläres ein Polygon. select asewkt(envelope( geometryfromtext('LINESTRING(0 0, 0 10)')) ) [Envelop_100_1] ergibt das illegale Polygon "POLYGON((0 0,0 10,0 10,0 0,0 0))" Diese Funktion kann problemlos mit Geometriesammlungen umgehen. select asewkt(envelope( geometryfromtext('GEOMETRYCOLLECTION( LINESTRING(0 0, 0 10), MULTIPOINT( 5 10, 4 3, 10 12), MULTIPOLYGON( ((50 2, 50 10 , 60 10 , 60 2, 50 2)), ((0 0, 5 0 , 5 5 , 0 5, 0 0)) www.ronny-locht.de Seite62 Die Formate WKT und WKB ) )') )) [Envelop_104_1] ergibt das erwartete Ergebnis POLYGON((0 0,0 12,60 12,60 0,0 0)) Rückgabewert Geometrie Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION envelope(geometry) RETURNS geometry MySQL 1. Envelope(g) RETRUNS geometry Equals() Parameter Geometrie Geometrie Beschreibung Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. Dies ist der Fall wenn jede Einzelgeometrie in der Quellgeometrie genau einer Einzelgeometrie in der zweiten Geometrie entspricht, und jeder Punkt einer einzelnen Quellgeometrie einen entsprechenden Punkt in der Zielgeometrie hat und den gleichen Vorgänger und Nachfolger, wobei Doppelungen von Anfangsund Endpunkten entfernt werden. Aus den oben genannten Eigenschaften folgt, das die Elemente nicht die gleichen Eigenschaften, insbesondere im Bezug auf Anfangs und Endpunkt haben müssen. Auch die Punktanzahl muss nicht übereinstimmen. www.ronny-locht.de Seite63 Die Formate WKT und WKB Beispiele Der einfachste Fall ist der Vergleich von zwei Punkten select equals( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') )[Equals_1_1] ergibt true Soweit nichts unerwartetes, interessant wird es bei Linien, die eine entgegengesetzte Laufrichtung haben. select equals( geometryfromtext('LINESTRING(0 0, 0 10)'), geometryfromtext('LINESTRING( 0 10, 0 0)') ) [Equals_17_1] ergibt true Die Laufrichtung wird also nicht bei der Betrachtung berücksichtigt, dies gilt auch für die Punktzahl. select equals( geometryfromtext('LINESTRING(0 0, 0 5,0 10 )'), geometryfromtext('LINESTRING( 0 10, 0 0)') ) [Equals_17_3] ergibt true Damit ist Anfangs und Endpunkt auch nicht mehr relevant. select equals( geometryfromtext('LINESTRING(0 0, 0 10, 10 10, 10 0, 0 0)'), geometryfromtext('LINESTRING( 0 10, 0 0, 10 0, 10 10, 0 10)') ) [Equals_17_2] ergibt ebenfalls true www.ronny-locht.de Seite64 Die Formate WKT und WKB Also sind die Position des Anfangs und Endpunkt egal. Unterschiedliche Reihenfolgen in Mehrfachobjekten werden ignoriert. select equals( geometryfromtext('MULTIPOLYGON( ((50 2, 50 10 , 60 10 , 60 2, 50 2)), ((0 0, 5 0 , 5 5 , 0 5, 0 0)) )'), geometryfromtext('MULTIPOLYGON( ((0 0, 5 0 , 5 5 , 0 5, 0 0)), ((50 2, 50 10 , 60 10 , 60 2, 50 2)) )')) [Equals_41_1] ergibt true also ist nicht nur die Reihenfolge der Punkte nicht von Relevanz, sondern auch die Reihenfolge der Untergeometrien eines Mehrfachelements. Rückgabewert: Boolean Fehlermeldungen PostgreSQL 1. Relate Operation called with a LWGEOMCOLLECTION type. This is unsupported Diese Funktion darf nicht mit Geometriesammlungen aufgerufen werden. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION equals(geometry, geometry) RETURNS boolean MySQL 1. Equals(g1,g2) returns int www.ronny-locht.de Seite65 Die Formate WKT und WKB Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). MySQL gibt 1 und 0 anstatt true und false zurück. ExteriorRing() Parameter Geometrie Beschreibung Gibt den äußeren Ring einer Fläche zurück. Ein Ring ist eine Linie, und muss deshalb gegebenenfalls gewandelt werden. Beispiele select asewkt(exteriorring( geometryfromtext('POLYGON( (50 2, 50 10 , 60 10 , 60 2, 50 2), (52 3, 54 5, 52 7, 52 3)) ') )) [ExtreriorRing_102_1] ergibt die Linie "LINESTRING(50 2,50 10,60 10,60 2,50 2)" um eine Fläche zu erhalten, muss die Linie in ein Polygon umgewandelt werden. Hier der Weg in der PostGIS-Variante select asewkt(makepolygon(exteriorring( geometryfromtext('POLYGON( (50 2, 50 10 , 60 10 , 60 2, 50 2), (52 3, 54 5, 52 7, 52 3)) ') ) )) [ExtreriorRing_102_2] ergibt "POLYGON((50 2,50 10,60 10,60 2,50 2))" Fehlermeldungen PostgreSQL 1. ERROR: ExteriorRing: geom is not a polygon Ein Ring kann nur aus einer Einzelnen Fläche gebildet werden. Rückgabewert Geometrie www.ronny-locht.de Seite66 Die Formate WKT und WKB Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION exteriorring(geometry) RETURNS geometry MySQL 1. ExteriorRing(poly) returns geometry GeometryN() Parameter Geometrie Beschreibung Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Multi-Objektes zurück. Ist das genannte Element kein Kollektion-Objekt oder hat die Kollektion nicht so viele Elemente, so wird null zurückgegeben. Bespiele SELECT AsText(GeometryN(GeomFromText( 'MULTIPOINT(1 1)'),1) ); [GeometryN_105_1] Ergibt 'POINT(1 1)' Ergibt null. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION geometryn(geometry, integer) RETURNS geometry MySQL 1. GeometryN(gc,N) returns geometry Rückgabewert Geometrie www.ronny-locht.de Seite67 Die Formate WKT und WKB GeometryType() Parameter Geometrie Beschreibung Gibt den Typ der Geometrie als String zurück. Beispiele ) select geometrytype( geometryfromtext( 'MULTIPOLYGON(((0 0, 5 0 , 5 5 , 0 5, 0 0)), ((50 2, 50 10 , 60 10 , 60 2, 50 2)) )' ) [GeometryType_103_1] ergibt "MULTIPOLYGON" Rückgabewert String є {'POINT', 'MULTIPOINT', 'LINESTRING', 'MULTILINESTRING', 'POLYGON', 'MULTIPOLYGON', 'GEOMETRIECOLLECTION'} Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION geometrytype(geometry) RETURNS text MySQL 1. GeometryType(g) returns string InteriorRingN() Parameter Geometrie Ganzzahl n Beschreibung Gibt den n-ten inneren Ring der Fläche zurück, bzw. Null, wenn diese Fläche nicht über www.ronny-locht.de Seite68 Die Formate WKT und WKB entsprechend viele innere Ringe verfügt. Der Rückgabewert ist eine Linie, keine Fläche. Die Funktion gibt null zurück wenn nicht die Anzahl der inneren Flächen kleiner ist, als die Zahl n. Deshalb sollte mit NumGeometries ab geprüft werden, ob genügend Geometrien vorhanden sind. Beispiele Der normale Weg ist select asewkt(InteriorRingN( geometryfromtext('POLYGON( (0 0, 5 0 , 5 5 , 0 5, 0 0), (1 1, 3 1 , 3 3 , 1 3, 1 1) )' ) ,1)) [InteriorRingN_102_2] ergibt "LINESTRING(1 1,3 1,3 3,1 3,1 1)" Ist die Zahl zu groß, wird null zurückgegeben. select asewkt(InteriorRingN( geometryfromtext('POLYGON( (0 0, 5 0 , 5 5 , 0 5, 0 0), (1 1, 3 1 , 3 3 , 1 3, 1 1) )' ),2) ) [InteriorRingN_102_1] ergibt null Rückgabewert Geometrie Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION interiorringn(geometry, integer) RETURNS geometry MySQL 2. InteriorRingN(poly,N) returns geometry Intersection() Parameter Geometrie Geometrie www.ronny-locht.de Seite69 Die Formate WKT und WKB Rückgabewert Geometrie Beschreibung Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Sind beiden Geometrien elementfremd, so wird eine leere Geometrie zurückgegeben. Die zurückgegebene Geometrie hat als maximale Dimension die kleinere der beiden Ausgangsdimensionen. Beispiele Am Anfang der einfach Einstieg mit zwei Punkten select asewkt(Intersection( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') )) [Intersection_1_1] ergibt "POINT(1 1)" Wenn beide Geometrien disjoint sind select asewkt(Intersection( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(0 0)') )) [Intersection_1_2] ergibt "GEOMETRYCOLLECTION EMPTY" Ein Beispiel dafür das die beiden Geometrien maximal die Dimension der kleinsten Ausgangsgeometrie haben select asewkt(Intersection( geometryfromtext('LINESTRING(-1 -1, 1 1)'), geometryfromtext('POINT(0 0)') )) [Intersection_15_1] ergibt "POINT(0 0)" www.ronny-locht.de Seite70 Die Formate WKT und WKB Die Dimension kann allerdings auch kleiner sein, auch wenn das Ergebnis nicht die leere Geometrie ist. select asewkt(Intersection( geometryfromtext('LINESTRING(-1 -1, 1 1)'), geometryfromtext('LINESTRING(-1 1, 1 -1)') )) [Intersection_17_1] ergibt "POINT(0 0)" Allerdings kann aus einfachen Geometrien eine Mehrfachgeometrie werden. select asewkt(Intersection( geometryfromtext('LINESTRING(0 3, 0 0, 4 0, 4 3)'), geometryfromtext('LINESTRING(0 1, 0 4, 4 4, 4 1)') )) [Intersection_17_2] ergibt "MULTILINESTRING((0 3,0 1),(4 1,4 3))" Man kann sogar aus zwei einfachen Geometrien eine Geometriesammlung erzeugen select asewkt(Intersection( geometryfromtext('LINESTRING(0 3, 0 0, 4 0, 4 2)'), geometryfromtext('LINESTRING(0 1, 0 4, 4 4, 4 2)') )) [Intersection_17_3] ergibt "GEOMETRYCOLLECTION(POINT(4 2),LINESTRING(0 3,0 1))" www.ronny-locht.de Seite71 Die Formate WKT und WKB Mehrfachgeometrien werden korrekt verarbeitet select asewkt(Intersection( geometryfromtext('LINESTRING(0 3, 0 0, 4 0, 4 2)'), geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 4, 4 2), (0 0, 10 10))' ) )) [Intersection_18_1] ergibt "GEOMETRYCOLLECTION(POINT(0 0),POINT(4 2),LINESTRING(0 3,0 1))" Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). Fehlermeldungen PostgreSQL 1. IllegalArgumentException: This method does not support GeometryCollection arguments Bedeutet, dass diese Funktion nicht mit einer Geometriesammlung aufgerufen werden darf. PostgreSQL 1. CREATE OR REPLACE FUNCTION intersection(geometry, geometry) www.ronny-locht.de Seite72 Die Formate WKT und WKB RETURNS geometry MySQL Diese Funktion ist in der MySQL nicht implementiert. Intersects() Parameter Geometrie Geometrie Rückgabewert: Boolean Beschreibung Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. {∃ P / P ∈G 1∧P ∈G 2 } intersects G 1, G 2 ¬disjoint G 1, G 2 Beispiele Zum Anfang eine einfaches Beispiel mit Punkten select Intersects( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Intersects_1_1] ergibt true Auch ein einzelner Punkt auf der Grenze (Boundary) reicht nach der Bedingung aus. select Intersects( geometryfromtext('LINESTRING(0 0, 5 5 )'), geometryfromtext('LINESTRING( 5 5, 10 10)')) [Intersects_17_1] ergibt true Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). www.ronny-locht.de Seite73 Die Formate WKT und WKB Fehlermeldungen PostgreSQL 1. Relate Operation called with a LWGEOMCOLLECTION type. This is unsupported Diese Funktion darf nicht mit Geometriesammlungen aufgerufen werden. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION intersects(geometry, geometry) RETURNS boolean MySQL Diese Funktion ist in der MySQL nicht implementiert. IsClosed() Parameter Geometrie Beschreibung Gibt zurück, ob eine Linie den gleichen Anfangs- und Endpunkt hat. Beispiele Das ganze für eine Linie ist einfach select isClosed( geometryfromtext('LINESTRING( 5 5, 10 10)') ) [IsClosed_100_1] ergibt false Ist der Anfangs- gleich dem Endpunkt, so ist diese Geometrie geschlossen. select isClosed( geometryfromtext('LINESTRING(0 0, 10 10, 10 0, 0 0)') )[IsClosed_100_3] ergibt true www.ronny-locht.de Seite74 Die Formate WKT und WKB IsClosed überprüft die Geometrie nicht auf Richtigkeit, so ist folgende Geometrie geschlossen, obwohl sie so nicht den Regeln des WKT entspricht. select isClosed( geometryfromtext('LINESTRING(0 0, 0 0)') ) [IsClosed_100_4] ergibt true Soll eine Mehrfachlinie geprüft werden so müssen alle Teillinien das Kriterium erfüllen. select isClosed( geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 4, 0 1), (0 0, 10 10, 10 0, 0 0)) ') ) [IsClosed_101_14] ergibt true Zu der Bedingung isClosed sollte also auch immer die Bedingung isValid verwendet werden, wenn dies nicht aus der Entstehung der Elemente schon abgeleitet werden kann. Ist nur eine Linie nicht geschlossen so gilt die Ganze Mehrfachlinie als nicht geschlossen. select isClosed( geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 5, 2 1), (0 0, 10 10, 10 0, 0 0))') ) [IsClosed_101_18] ergibt www.ronny-locht.de Seite75 Die Formate WKT und WKB false select isClosed( geometryfromtext('GEOMETRYCOLLECTION( LINESTRING(0 0, 0 0), POINT(0 0)) ') ) [IsClosed_104_2] ergibt true allerdings nur bei der PostGIS-Variante, MySQL gibt hier null zurück. Rückgabewert: Boolean Implementierungsunterschiede Die MySQL gibt bei einer Geometriesammlung immer null zurück. Die MySQL gibt 0 und 1 zurück, während PostGIS true und false zurück gibt. Die MySQL gibt null zurück, wenn diese Funktion mit null aufgerufen wird, PostGIS erzeugt hier einen Fehler. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION isclosed(geometry) RETURNS boolean MySQL 1. IsClosed(mls) Returns 0, 1, -1 IsEmpty() Parameter Geometrie www.ronny-locht.de Seite76 Die Formate WKT und WKB Beschreibung Gibt zurück, ob die Geometrie leer ist. Rückgabewert: Boolean Beispiele Select isEmpty( geometryfromtext('GEOMETRYCOLLECTION EMPTY') ) [IsEmpty_104_1] ergibt true Alle anderen Geometrien werden false zurückgeben Implementierungsunterschiede Die MySQL gibt 0 und 1 zurück, während PostGIS true und false zurückgibt. Die MySQL gibt null zurück, wenn diese Funktion mit null aufgerufen wird, PostGIS erzeugt hier einen Fehler. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION isempty(geometry) RETURNS boolean MySQL 1. IsEmpty(g) Returns 0, 1, -1 IsSimple() Parameter Geometrie Beschreibung Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Voraussetzungen sind für jeden Geometrietyp anders. Punkte Ein zulässiger Punkt ist Simple. Linien Linien dürfen nicht Überschneiden sein und keine Kickbacks haben. www.ronny-locht.de Seite77 Die Formate WKT und WKB Flächen Flächen dürfen nicht selbstüberschneident sein und keine Kickbacks haben. Beispiele Punkte Ein zulässiger Punkt ist Simple. Mehrfachgeometrie und Geometriesammlungen Jedes Element für sich muss Simple sein, und die Geometrien dürfen sich nicht überlagern. Mehrfachpunkte select issimple( geometryfromtext('LINESTRING(0 0, 1 0, 1 0, 10 0)') )[IsSimple_100_4] Ergibt false, weil sich die zwei Punkte überlagern. {∃ P n ↔ P m∣m≠n}¬simple not ∃ P n ↔ P m ∀ m , n∈{1numgeometrys G}¿ simple Linie select issimple(geometryfromtext('LINESTRING(0 0, 1 0, 1 0, 10 0)')); Doppelte Punkte verhindern nicht das eine Linie einfach ist. Das Beispiel oben gibt true zurück. select issimple( geometryfromtext('LINESTRING(0 0, 2 0, 1 0, 5 0)') )[IsSimple_100_3] Richtige Kickbacks verhindern die Einfachheit. select issimple( geometryfromtext('LINESTRING(0 0, ) [IsSimple_100_1] www.ronny-locht.de 10 0, 10 5, 5 0)') Seite78 Die Formate WKT und WKB Schneidet ein Linienabschnitt einen anderen Linienabschnitt so ist diese Geometrie nicht einfach. Mehrfachlinien select issimple( geometryfromtext('MULTILINESTRING( (0 0, 10 0), ( 10 0, 0 0))' ) ) [IsSimple_101_1] Ergibt false da zwei Geometrien gleich sind. Wenn {∃Gn ↔G m ∣m≠n } 1. {∃ G1 ¬simple} 2. dann ist die Geometrie nicht einfach. Rückgabewert Boolean Implementierungsunterschiede Diese Funktion ist nur als Platzhalter in der MySQL-Datenbank definiert. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION issimple(geometry) RETURNS boolean MySQL IsSimple ist in der MySQL nur als Platzhalter definiert, und sollte nicht verwendet werden. IsRing() Parameter Geometrie Beschreibung Gibt zurück ob eine Linie zu einer Fläche konvertiert werden kann. Dies ist der Fall, wenn die Geometrie nicht selbstüberschneident (kann durch isSimple) und geschlossen (isClosed) ist. www.ronny-locht.de Seite79 Die Formate WKT und WKB Beispiele Als erstes die richtige Lösung. select isRing( geometryfromtext('LINESTRING( 5 5,0 0, 5 0,5 5)') ) [IsRing_100_2] ergibt true Bei Selbstüberschneidungen kann keine Fläche gebildet werden. select isRing( geometryfromtext('LINESTRING( 5 5,0 0, 5 5)') ) [IsRing_100_1] ergibt false select isRing( geometryfromtext('LINESTRING( 5 5,0 0, 5 0,7 7)') ) [IsRing_100_4] ergibt false Rückgabewert: Boolean Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION isring(geometry) RETURNS boolean MySQL 1. IsRing(ls) Returns 0,1 www.ronny-locht.de Seite80 Die Formate WKT und WKB Length() Parameter Geometrie Rückgabewert: Fließkommazahl Beschreibung Gibt die Länge einer linienhaften Geometrie zurück. Beispiele Punkte/Mehrfachpunkte Punkte und Mehrfachpunkte haben immer die Länge 0. select Length( geometryfromtext('MULTIPOINT(1 1, 0 0)') ) [Length_105_2] ergibt 0 Linien Die einfache Linie macht keine Probleme select Length( geometryfromtext('LINESTRING( 5 5, 5 10)') ) [Length_100_1] ergibt 5 Und natürlich ist es auch kein Problem, eine Mehrpunktlinie zu behandeln select Length( geometryfromtext('LINESTRING( 5 5, 5 10, 10 10)') ) [Length_100_2] ergibt natürlich 10 Eine ungültig Geometrie lässt sich auch berechnen. select Length( geometryfromtext('LINESTRING( 5 5, ) [Length_100_3] 5 5)') ergibt 0 www.ronny-locht.de Seite81 Die Formate WKT und WKB Mehrfachlinien select Length( geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 5, 2 1), (0 0, 10 10, 10 0, 0 0) )') ) [Length_101_1] ergibt 45.7373772043482 was der Summe der Länge der ersten Geometrie (11.5952415806172) und der zweiten Geometrie ( 34.142135623731) ist. Geometriesammlung In einer Geometriesammlung werden nur die Länge der Linien summiert. select Length( geometryfromtext('GEOMETRYCOLLECTION( LINESTRING(0 0, 10 10, 10 0, 0 0), POLYGON((50 2, 50 10 , 60 10 , 60 2, 50 2)) )') ) [Length_104_2] ergibt 34.142135623731 Implementierungsunterschiede Bei MySQL wird die Funktion als Glenght implementiert, Length ist in der Datenbank für Strings reserviert und deshalb reserviert. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION length(geometry) RETURNS double precision 2. CREATE OR REPLACE FUNCTION length2d(geometry) RETURNS double precision 3. CREATE OR REPLACE FUNCTION length3d(geometry) RETURNS double precision MySQL 1. GLength(mls) Returns double precision 2. GLength(ls) Returns double precision www.ronny-locht.de Seite82 Die Formate WKT und WKB NumGeometries() Parameter Geometrie Beschreibung Gibt die Anzahl der in einer Geometrie-Zusammenfassung (Multi-Punkt, Multi-Linie, Multi-Fläche oder Geometriesammlung) enthalten Geometrien zurück. Diese Funktion arbeitet nicht rekursiv. Beispiele Flächen select NumGeometries( geometryfromtext('POLYGON( (0 0, 0 100, 100 100, 100 0, 0 0), (50 2, 50 10 , 53 10 , 53 2, 50 2), (60 60, 70 70, 60 80, 60 60) )') ) [NumGeometries_102_1] ergibt null Mehrfachpunkte select NumGeometries( geometryfromtext('MULTIPOINT(1 1, 0 0, 4 4)') ) [NumGeometries_105_1] ergibt 3 Geometriesammlung select NumGeometries( geometryfromtext('GEOMETRYCOLLECTION( LINESTRING(40 0,45 5), POLYGON((50 2,50 10,53 10,53 2,50 2)))') ) [NumGeometries_104_1] ergibt 2 Diese Funktion arbeitet jedoch nicht rekursiv. select NumGeometries( geometryfromtext('GEOMETRYCOLLECTION( GEOMETRYCOLLECTION( LINESTRING(40 0,45 5), POLYGON((50 2,50 10,53 10,53 2,50 2)) ) )') ) [NumGeometries_104_2] www.ronny-locht.de Seite83 Die Formate WKT und WKB ergibt 1 Rückgabewert Ganzzahl Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION numgeometries(geometry) RETURNS integer MySQL 1. NumGeometries(gc) Returns Integer NumInteriorRing() Parameter Geometrie Beschreibung Gibt die Anzahl der inneren Ringe (Löcher) einer Fläche zurück. Beispiele select NumInteriorRings( geometryfromtext('POLYGON( (0 0, 0 100, 100 100, 100 0, 0 0), (50 2, 50 10 , 53 10 , 53 2, 50 2), (60 60, 70 70, 60 80, 60 60) )') ) [NumInteriorRings_102_1] ergibt 2 www.ronny-locht.de Seite84 Die Formate WKT und WKB Rückgabewert Ganzzahl Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION numinteriorring(geometry) RETURNS integer MySQL 1. NumInteriorRings(poly) Returns Integer NumPoints() Parameter Geometrie Beschreibung Gibt die Anzahl der Punkte einer Linie zurück. Bei allen nicht linienhaften Geometrien (dimension(g)<>1) wird null zurückgegeben. Ein unschönes verhalten. Beispiele select NumPoints( geometryfromtext('LINESTRING(4 4, 10 10)') ) [NumPoints_100_1] ergibt 2 Rückgabewert Ganzzahl Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION npoints(geometry) RETURNS integer www.ronny-locht.de Seite85 Die Formate WKT und WKB MySQL 1. NumPoints(ls) Returns Integer Overlaps() Parameter Geometrie Geometrie Beschreibung Gibt zurück, ob sich zwei Geometrien überlappen, dass heißt das sie nicht nur einzelne Schnittpunkte haben, sondern auch unendlich viele Punkte die zu beiden Geometrien gehören. ∣G 1∩G1∣=∞∧G1≠G 2 Der Schnitt der beiden Geometrien muss die gleiche Dimension haben wie die minimale Dimension der beiden Geometrien. Beispiele Die folgende Anweisung gibt false zurück. select overlaps( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Overlaps_1_1] Natürlich kann eine Punkt nicht abzählbar viele Punkte mit einem anderen Punkt haben, daraus folgt, dass das obere Statement false zurückgibt. SELECT overlaps( geometryfromtext('LINESTRING(0 1, 10 1)'), geometryfromtext('LINESTRING(5 1, 12 1)') )[Overlaps_17_3] Die nächste Anweisung ergibt natürlich true. Da beide Linien ein Stück der Strecke teilen und dadurch unendlich viele gleich Punkte haben. SELECT overlaps( geometryfromtext('LINESTRING(0 1, 10 1)'), geometryfromtext('LINESTRING(0 0, 10 2)') ) [Overlaps_17_2] www.ronny-locht.de Seite86 Die Formate WKT und WKB SELECT overlaps( geometryfromtext('LINESTRING(0 1, 10 1)'), geometryfromtext('LINESTRING(0 0, 0 2, 6 2, 6 0 , 10 0 , 10 2)') )[Overlaps_17_1] Anweisungen wie oben gezeigt, werden immer nur false zurückgeben, das diese natürlich nur endlich viele Punkte gemeinsam haben wie oben exemplarisch dargestellt. Allerdings dürfen die beiden Geometrien auch nicht gleich sein, wie das nächste Beispiel zeigt. select overlaps( geometryfromtext('LINESTRING(0 1, 10 1)'), geometryfromtext('LINESTRING(10 1, 0 1)') ) [Overlaps_17_1] Dieses Beispiel gibt natürlich false zurück, im Gegensatz zur unteren Abfrage. select overlaps( geometryfromtext('MULTIPOLYGON( ((10 10, 20 10 , 20 20, 10 20, 10 10)), ((25 25, 30 30, 25 35, 25 25)) )'), geometryfromtext('MULTIPOLYGON( ((27 10, 27 30, 37 30, 37 10, 27 10)), ((45 45, 50 50, 45 55, 45 45)) )') ) [Overlaps_41_1] www.ronny-locht.de Seite87 Die Formate WKT und WKB Multi-Flächen, Multi-Linien werden unterstützt, die beiden Flächen oben würden beim Test auf Überlappung true zurückgeben. Geometriesammlungen werden jedoch nicht unterstützt und erzeugen eine Fehlermeldung. Rückgabewert: Boolean Fehlermeldungen PostgreSQL ERROR: Relate Operation called with a LWGEOMCOLLECTION type. This is unsupported Diese Funktion darf nicht mit eine Geometriesammlung aufgerufen werden. Diese Funktion darf nicht mit einer Geometriesammlung aufgerufen werden. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION "overlaps"(geometry, geometry) RETURNS boolean MySQL 1. Overlaps(g1,g2) returns boolean Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis einschließlich Stand 6.0), daraus folgt, das die Funktion nur zurückgibt, ob diese beiden kleinsten Umschließenden Rechtecke sich überschneiden. Allerdings kann natürlich die Dimension der Intersection danach ab geprüft werden. Der üblich Boolean-Unterschied zwischen PostgreSQL und MySQL taucht auf indem die Erste true und false zurückgibt, während, die Zweite 0 und 1 zurückgibt. www.ronny-locht.de Seite88 Die Formate WKT und WKB PointN() Parameter Geometrie Beschreibung Gibt den n-ten Punkt der Linie zurück. Diese Funktion ist nur für Linnen definiert. Rückgabewert: Geometrie Beispiel select asewkt(PointN( geometryfromtext('LINESTRING(4 4, 10 10)') ,2)) [PointN_100_1] ergibt POINT(10 10) Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION Programminterface(geometry) RETURNS geometry MySQL 1. PointN(ls,N) Returns Geometrie PointOnSurface() Parameter Geometrie www.ronny-locht.de Seite89 Die Formate WKT und WKB Beschreibung Gibt einen Punkt zurück, welcher garantiert in der Geometrie ist. Beispiele Punkt select asewkt(PointOnSurface( geometryfromtext('POINT(2 1)') )) [PointOnSurface_99_1] ergibt "POINT(2 1)" Für den Punkt ist dies offensichtlich eine Identitätsfunktion. Mehrfachpunkt select asewkt(PointOnSurface( geometryfromtext('MULTIPOINT(1 1, 0 0, 4 4)') ))[PointOnSurface_105_1] ergibt üblicherweise "POINT(1 1)" also den ersten Punkt der Geometrie, dies muss aber nicht so sein. Linie select asewkt(PointOnSurface( geometryfromtext('LINESTRING(1 1, 6 6)') )) [PointOnSurface_100_1] ergibt "POINT(6 6)" www.ronny-locht.de Seite90 Die Formate WKT und WKB select asewkt(PointOnSurface( geometryfromtext('LINESTRING(0 1, 0 4, 4 5, 2 1)') )) [PointOnSurface_100_2] ergibt "POINT(0 4)" Es scheint so. als wenn bei Linien immer der zweite Punkt genommen wird. Mehrfachlinie select asewkt(PointOnSurface( geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 5, 2 1), (0 0, 10 10, 10 0, 0 0)) ') )) [PointOnSurface_101_1] ergibt "POINT(4 5)" www.ronny-locht.de Seite91 Die Formate WKT und WKB Es ergibt also das gleiche Ergebnis wie die einfache Linie. Zuerst wird also offensichtlich die erste Geometrie genommen. select asewkt(PointOnSurface( geometryfromtext('POLYGON((52 3, 54 5, 52 7, 52 3))') )) [PointOnSurface_102_1] ergibt "POINT(53 5)" Geometriesammlung select asewkt(PointOnSurface( geometryfromtext('GEOMETRYCOLLECTION( LINESTRING(40 0,45 5), POLYGON((50 2,50 10,53 10,53 2,50 2)) )') )) [PointOnSurface_104_3] ergibt "POINT(51.5 6)" www.ronny-locht.de Seite92 Die Formate WKT und WKB Hier wird also die Geometrie mit der höchsten Dimension bevorzugt. Rückgabewert: Geometrie Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION pointonsurface(geometry) RETURNS geometry MySQL 1. PointOnSurface(mpoly) Relate() Parameter Geometrie Geometrie [Char(9) Relations-Matrix] Beschreibung Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. Die Relations-Matrix ist ein Char-Feld der Länge 9. Hierbei steht jeder Buchstabe für eine mögliche Relation. Die Relationen-Matrix sieht wie folgt aus. www.ronny-locht.de Seite93 Die Formate WKT und WKB G2 G1 Interior Boundary Exterior Beispiele Punkte select relate( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Relate_1_2] ergibt 0FFFFFFF2 Das heißt die Schnittmenge der beiden Inneren ist ein Punkt, die Schnittmengen der beiden Äußeren ist einen Fläche. Die restlichen Schnittmengen sind leer. Linien select relate( geometryfromtext('LINESTRING(1 1, 6 6)'), geometryfromtext('LINESTRING(1 6, 6 1)') ) [Relate_17_2] ergibt 0F1FF0102 soll hier einmal explizit durchgespielt werden wie dieser Wert zustande kommt. Interior geschnitten mit Interior 0F1FF0102 www.ronny-locht.de Seite94 Die Formate WKT und WKB Interior geschnitten mit Boundary 0F1FF0102 Interior geschnitten mit Exterior 0F1FF0102 Boundary geschnitten mit Interior 0F1FF0102 www.ronny-locht.de Seite95 Die Formate WKT und WKB Boundary geschnitten mit Boundary 0F1FF0102 Boundary geschnitten mit Exterior 0F1FF0102 Exterior geschnitten mit Interior 0F1FF0102 www.ronny-locht.de Seite96 Die Formate WKT und WKB Exterior geschnitten mit Boundary 0F1FF0102 Exterior geschnitten mit Exterior 0F1FF0102 Ergibt natürlich eine Fläche, wie dieser Funktion natürlich immer bei endlichen Geometrien zurückgibt. Rückgabewert: Varchar Relation-Matrix, wenn keine Releations-Matrix angegeben wurde Boolean Wenn eine Relations-Matrix angegebenen wurde. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION relate(geometry, geometry) RETURNS text www.ronny-locht.de Seite97 Die Formate WKT und WKB 2. CREATE OR REPLACE FUNCTION relate(geometry, geometry, text) RETURNS boolean StartPoint() Parameter Geometrie Beschreibung Gibt den ersten Punkt einer Linie der ersten Linie zurück. Beispiele select asewkt(startpoint( geometryfromtext('LINESTRING(1 1, 6 6)') )) [StartPoint_100_1] ergibt "POINT(1 1)" Ergibt also den ersten Punkt der Linie. select asewkt(startpoint( geometryfromtext('MULTILINESTRING( (0 1, 0 4, 4 5, 2 1), (0 0, 10 10, 10 0, 0 0) )') )) [StartPoint_101_1] ergibt "POINT(0 1)" Ergibt den ersten Punkt der ersten Linie. Rückgabewert Geometrie www.ronny-locht.de Seite98 Die Formate WKT und WKB Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION startpoint(geometry) RETURNS geometry MySQL 2. StartPoint(ls) Returns Geometrie SRID() Parameter Geometrie Beschreibung Gibt die SRID der Geometrie zurück. Die SRID ist eine Referenz auf das Koordinatensystem, in dem die Geometrie dargestellt wird. Beispiele select SRID( geometryfromtext('POLYGON((50 2, 50 10 , 53 10 , 53 2, 50 2))') ) [SRID_102_1] ergibt -1 Bis jetzt wurde nur mit SRID-freien gearbeitet, weil dieses zuerst einmal wesentlich kürzer sind. select SRID( geometryfromtext('SRID=3068; GEOMETRYCOLLECTION( LINESTRING(0 0,5 5), POLYGON((50 2,50 10,53 10,53 2,50 2) ))') ) [SRID_102_1] ergibt 3068 Rückgabewert Integer Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION srid(geometry) RETURNS integer MySQL 1. SRID(g) Returns Integer www.ronny-locht.de Seite99 Die Formate WKT und WKB SymDifference() Parameter Geometrie Geometrie Beschreibung Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. Beispiele Punkte select asewkt(Symdifference( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)')) ) [SymDifference_1_1] ergibt "GEOMETRYCOLLECTION EMPTY" Es gibt keine unterschiedlichen Punkte, also ist das Ergebnis leer. select asewkt(Symdifference( geometryfromtext('POINT(2 1)'), geometryfromtext('POINT(1 1)')) ) [SymDifference_1_2] ergibt "MULTIPOINT(1 1,2 1)" Es gibt keine gleichen Punkte, also werden die Geometrien aggregiert. Linien select asewkt(Symdifference( geometryfromtext('LINESTRING(1 1, 5 5)'), geometryfromtext('LINESTRING(5 5, 100 10)') )) [SymDifference_17_1] ergibt "MULTILINESTRING((1 1,5 5),(5 5,100 10))" select asewkt(Symdifference( geometryfromtext('LINESTRING(1 1, 5 5)'), geometryfromtext('LINESTRING(5 5, 10 10)') )) [SymDifference_17_2] www.ronny-locht.de Seite100 Die Formate WKT und WKB ergibt "MULTILINESTRING((1 1,5 5),(5 5,10 10))" Offensichtlich werden Randpunkte nicht ausgeschnitten. select asewkt(Symdifference( geometryfromtext('LINESTRING(1 1, 6 6)'), geometryfromtext('LINESTRING(4 4, 10 10)') )) [SymDifference_17_3] ergibt "MULTILINESTRING((1 1,4 4),(6 6,10 10))" Flächen select asewkt(Symdifference( geometryfromtext('POLYGON((50 2, 50 10 , 53 10 , 53 2, 50 2))'), geometryfromtext('POLYGON((50 8, 60 10 , 60 2, 50 8))'))) [SymDifference_33_2] ergibt "MULTIPOLYGON( ((50 2,50 8,53 6.2,53 2,50 2)), ((50 8,50 10,53 10,53 8.6,50 8)), ((53 6.2,53 8.6,60 10,60 2,53 6.2)) )" www.ronny-locht.de Seite101 Die Formate WKT und WKB Rückgabewert Geometrie Fehlermeldungen PostgreSQL 1. IllegalArgumentException: This method does not support GeometryCollection arguments Diese Funktion sollte nicht mit einer Geometriesammlung aufgerufen werden. Implementierungsunterschiede Diese Funktion ist nicht in der MySQL implementiert. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION symdifference(geometry, geometry) RETURNS geometry 2. CREATE OR REPLACE FUNCTION symmetricdifference(geometry, geometry) RETURNS geometry MySQL Diese Funktion ist in der MySQL nicht implementiert. www.ronny-locht.de Seite102 Die Formate WKT und WKB Touches() Parameter Geometrie Geometrie Beschreibung Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Es muss also folgendes gelten: 1. {∃ P∣P∈envelop G1 ∧P∈envelop G2 } 2. {¬∃P∣P ∈G 1∩envelop G 1∧P ∈G2 ∩envelopG 2 } Beispiele Punkte select Within( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Touches_1_1] ergibt false Linien select Within( geometryfromtext('LINESTRING(1 1, 5 5)'), geometryfromtext('LINESTRING(5 5, 100 10)') ) [Touches_17_1] ergibt true Linien mit Punkten select touches( geometryfromtext('POINT(1 1)'), geometryfromtext('LINESTRING(1 1, 5 5)') ) [Touches_3_1] www.ronny-locht.de Seite103 Die Formate WKT und WKB ergibt true select touches( geometryfromtext('POINT(2 2)'), geometryfromtext('LINESTRING(1 1, 5 5)') ) [Touches_3_2] ergibt false Ergibt false weil der Punkt in der Linie liegt. Flächen select touches( geometryfromtext('POLYGON((50 2, 50 10 , 53 10 , 53 2, 50 2))'), geometryfromtext('POLYGON((53 2, 53 10 , 60 10 , 60 2, 53 2))')) [Touches_33_3] ergibt true www.ronny-locht.de Seite104 Die Formate WKT und WKB select touches( geometryfromtext('POLYGON((50 2, 50 10 , 53 10 , 53 2, 50 2))'), geometryfromtext('POLYGON((53 8, 60 10 , 60 2, 53 8))') ) [Touches_33_2] ergibt true Rückgabewert: Boolean Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0). Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION touches(geometry, geometry) RETURNS boolean MySQL 1. Touches(g1,g2) Returns 0, 1 Union() Parameter Geometrie Geometrie Beschreibung Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Gleiche Geometrien werden aggregiert. Allerdings werden aus zwei überlappenden Geometrien drei Geometrien gebildet. www.ronny-locht.de Seite105 Die Formate WKT und WKB Beispiele Punkte select asewkt(GeomUnion( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(2 1)')) ) [Union_1_4] ergibt "MULTIPOINT(1 1,2 1)" wie erwartet. select asewkt(GeomUnion( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)')) ) [Union_1_3] ergibt "POINT(1 1)" Dieses Beispiel zeigt klar, das diese Funktion Punkte aggregiert, im Gegensatz zur CollectFunktion. Mehrfachpunkte select asewkt(GeomUnion( geometryfromtext('MULTIPOINT(1 1, 0 0)'), geometryfromtext('MULTIPOINT(1 1, 0 0, 4 4)') )) [Union_9_1] ergibt "MULTIPOINT(0 0,1 1,4 4)" Also auch Untergeometrien werden aggregiert. Linien select asewkt(GeomUnion( geometryfromtext('LINESTRING(8 8, 9 9)'), geometryfromtext('LINESTRING(5 5, 10 10)') )) [Union_17_1] ergibt "MULTILINESTRING((8 8,9 9),(5 5,8 8),(9 9,10 10))" www.ronny-locht.de Seite106 Die Formate WKT und WKB Hier werden also die Linien nicht so zusammengefasst, wie erwartet. Flächen select asewkt(GeomUnion( geometryfromtext('POLYGON((50 2, 50 10 , 60 10 , 60 2, 50 2))'), geometryfromtext('POLYGON((52 3, 54 5, 52 7, 52 3))') )) [Union_33_1] ergibt "POLYGON((50 2,50 10,60 10,60 2,50 2))" Hier werden die beiden Geometrien wieder aggregiert. Unterschiedliche Geometrien select asewkt(GeomUnion( geometryfromtext('LINESTRING(5 5, 100 10)'), geometryfromtext('POLYGON((50 2, 50 10 , 60 10 , 60 2, 50 2))') )) [Union_19_1] ergibt "GEOMETRYCOLLECTION( LINESTRING(5 5,50 7.36842105263158), LINESTRING(60 7.89473684210526,100 10), POLYGON((50 2,50 7.36842105263158,50 10,60 10, 60 7.89473684210526,60 2,50 2)) )" www.ronny-locht.de Seite107 Die Formate WKT und WKB Ergibt natürlich eine Geometriesammlung bei der die zwei Linien um die Fläche entstehen. Rückgabewert Boolean Implementierungsunterschiede Die MySQL implementiert diese Funktion nicht. PostGIS nennt die Funktion GeomUnion um nicht mit dem in SQL reservierten Wort "Union" in Konflikt zu kommen. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION GeomUnion(geometry, geometry) RETURNS geometry MySQL Diese Funktion ist in der MySQL nicht definiert. Within() Parameter Geometrie Geometrie Rückgabewert: Boolean Beschreibung Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist, dass heißt es gibt Punkte, welche in G1 und in G2 enthalten ist, aber es gibt keine Punkte welche in G1 und nicht in G2 enthalten sind. ∃ P / P⊂G 1∧P⊂G2 ∧¬∃P / P⊂G 1∧P⊄G 2 Die beiden Geometrien dürfen gleich sein. www.ronny-locht.de Seite108 Die Formate WKT und WKB Beispiele Punkte select within( geometryfromtext('POINT(1 1)'), geometryfromtext('POINT(1 1)') ) [Within_1_1] ergibt true Was zeigt dass Punkte behandelt werden und ebenso, dass beiden Geometrien gleich seinen dürfen. Mehrfachpunkte select within( geometryfromtext('MULTIPOINT(1 1, 0 0)'), geometryfromtext('MULTIPOINT(1 1, 0 0, 4 4)') ) [Within_9_1] ergibt true Ein Mehrfachgeometrie ist also in einer anderen anderen Geometrie, wenn jedes Teilelement in der anderen Geometrie enthalten ist. Linien select within( geometryfromtext('LINESTRING(8 8, 9 9)'), geometryfromtext('LINESTRING(5 5, 10 10)') ) [Within_17_4] ergibt true Flächen select Within( geometryfromtext('POLYGON((52 3, 54 5, 52 7, 52 3))'), geometryfromtext('POLYGON((50 2, 50 10 , 60 10 , 60 2, 50 2))')) [Within_33_2] www.ronny-locht.de Seite109 Die Formate WKT und WKB ergibt true select Within( geometryfromtext('POLYGON((52 3, 54 5, 52 7, 52 3))'), geometryfromtext('MULTIPOLYGON( ((50 2, 50 10 , 53 10 , 53 2, 50 2)), ((53 2, 53 10 , 60 10 , 60 2, 53 2)) )') ) [Within_34_1] ergibt false Die Geometrie muss also in einer Geometrie komplett enthalten sein. Nebenbei ist die Mehrfachfläche nicht validierbar. Implementierungsunterschiede Die MySQL implementiert diese Funktion nicht. Nur eine Bounding-Box-Funktion existiert. Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION within(geometry, geometry) RETURNS boolean MySQL Diese Funktion ist in der MySQL nicht definiert. Implementierungsunterschiede Bei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0): www.ronny-locht.de Seite110 Die Formate WKT und WKB X() Parameter Geometrie Beispiele select X( geometryfromtext('POINT(1 1)') ) [X_99_1] ergibt 1 Beschreibung Gibt den X-Wert (Rechtswert) des Punkts zurück. Rückgabewert: Fließkommazahl Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION x(geometry) RETURNS double precision MySQL 1. X(p) Returns double precision y() Parameter Geometrie Rückgabewert: Fließkommazahl Beschreibung Gibt den Y-Wert eines Punktes. Beispiele select X( geometryfromtext('POINT(1 1)') ) [Y_99_1] www.ronny-locht.de Seite111 Die Formate WKT und WKB ergibt 1 Fehlermeldungen PostgerSQL 1. Argument to Y() must be a point Definition in den Datenbanken PostgreSQL 1. CREATE OR REPLACE FUNCTION y(geometry) RETURNS double precision MySQL 2. X(p) Returns double precision Funktionen nach Geometrien Funktionen die auf Punkte (Points) anwendbar sind AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. www.ronny-locht.de Seite112 Die Formate WKT und WKB Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. GeometryType() Gibt den Typ der Geometrie als String zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. IsEmpty() Gibt zurück, ob die Geometrie leer ist. www.ronny-locht.de Seite113 Die Formate WKT und WKB IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Vorraussetzungen sind für jeden Geometrietyp anders. Overlaps() Gibt zurück, ob sich zwei Geometrien überlappen, PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within() Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. X() Gibt den x-Wert des Punktes zurück. Y() Gibt den y-Wert des Punktes zurück. www.ronny-locht.de Seite114 Die Formate WKT und WKB Funktionen die auf Linien (Linestrings) anwendbar sind AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Boundary Gibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Dimension() Gibt die räumliche Dimension der Geometrie zurück. www.ronny-locht.de Seite115 Die Formate WKT und WKB Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. EndPoint() Gibt den letzten Punkt einer Linie zurück, bei einer Mehrfachlinie den letzten Punkt der ersten Linie. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. GeometryType() Gibt den Typ der Geometrie als String zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. IsClosed() Gibt zurück, ob eine Geometrie einen gleichen Anfangs- und Endpunkt hat. IsEmpty() Gibt zurück, ob die Geometrie leer ist. IsRing() Gibt zurück ob eine Linie zu einer Fläche konvertiert werden kann. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Voraussetzungen sind für jeden Geometrietyp anders. Length() Gibt die Länge einer linienhaften Geometrie zurück. www.ronny-locht.de Seite116 Die Formate WKT und WKB NumPoints() Gibt die Anzahl der Punkte einer Linie zurück. Overlaps() Gibt zurück, ob sich zwei Geometrien überlappen. PointN() Gibt den n-ten Punkt der Linie zurück. PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. StartPoint() Gibt den ersten Punkt einer Linie der ersten Linie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. Funktionen die auf Flächen (Polygone) anwendbar sind area() Gibt die Fläche die eingenommen wird zurück. www.ronny-locht.de Seite117 Die Formate WKT und WKB AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Boundary Gibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. www.ronny-locht.de Seite118 Die Formate WKT und WKB Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. ExteriorRing() Gibt den äußeren Polygonzug zurück. GeometryN() Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Mehrfach-Objektes zurück. GeometryType() Gibt den Typ der Geometrie als String zurück. NumInteriorRing() Anzahl der inneren Polygonzüge. InteriorRingN() Gibt den n-ten inneren Polygonzug zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. IsEmpty Gibt zurück, ob die Geometrie leer ist. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Vorraussetzungen sind für jeden Geometrietyp anders. www.ronny-locht.de Seite119 Die Formate WKT und WKB NumInteriorRing() Gibt die Anzahl der inneren Ringe (Löcher) einer Fläche zurück. Overlaps() Gibt zurück, ob sich zwei Geometrien überlappen. PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. Funktionen die auf Mehfachpunkte (Multipoints) anwendbar sind AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. www.ronny-locht.de Seite120 Die Formate WKT und WKB Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. www.ronny-locht.de Seite121 Die Formate WKT und WKB GeometryN() Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Mehrfach-Objektes zurück. GeometryType() Gibt den Typ der Geometrie als String zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. IsEmpty Gibt zurück, ob die Geometrie leer ist. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Vorraussetzungen sind für jeden Geometrietyp anders. NumGeometries() Gibt die Anzahl der in einer Geometrie-Zusammenfassung (Mehrfach-Punkt, Mehrfach-Linie, Mehrfach-Fläche oder Geometriesammlung) enthalten Geometrien zurück. Diese Funktion arbeitet nicht rekursiv. PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. www.ronny-locht.de Seite122 Die Formate WKT und WKB Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Overlaps() Gibt zurück, ob sich zwei Geometrien überlappen. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. Funktionen die auf Mehrfachlinien (Multilinestring) anwendbar sind AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Boundary Gibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. www.ronny-locht.de Seite123 Die Formate WKT und WKB ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. EndPoint() Gibt den letzten Punkt einer Linie zurück, bei einer Mehrfachlinie den letzten Punkt der ersten Linie. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. GeometryN() Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Mehrfach-Objektes zurück. GeometryType() Gibt den Typ der Geometrie als String zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch www.ronny-locht.de Seite124 Die Formate WKT und WKB in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. IsClosed() Gibt zurück, ob eine Geometrie einen gleichen Anfangs- und Endpunkt hat. IsEmpty Gibt zurück, ob die Geometrie leer ist. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Vorraussetzungen sind für jeden Geometrietyp anders. NumGeometries() Gibt die Anzahl der in einer Geometrie-Zusammenfassung (Mehrfach-Punkt, Mehrfach-Linie, Mehrfach-Fläche oder Geometriesammlung) enthalten Geometrien zurück. Diese Funktion arbeitet nicht rekursiv. Length() Gibt die Länge einer linienhaften Geometrie zurück. PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. StartPoint() Gibt den ersten Punkt einer Linie der ersten Linie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. www.ronny-locht.de Seite125 Die Formate WKT und WKB Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. Funktionen die auf Mehrfachflächen (Multipolygon) anwendbar sind Area() Gibt die Fläche die eingenommen wird zurück. AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Boundary Gibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. Contains() Gibt zurück ob die erste Geometrie vollständig in der zweiten Geometrie enthalten ist. www.ronny-locht.de Seite126 Die Formate WKT und WKB ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Crosses() Gibt zurück, ob sich zwei Geometrien überkreuzen. Difference() Gibt die Geometrie zurück, welche alle Punkte enthält, die zur ersten Geometrie gehören und nicht in der Zweiten enthalten sind. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Disjoint Gibt zurück ob zwei Geometrie elementfremd sind. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. GeometryN() Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Mehrfach-Objektes zurück. GeometryType() Gibt den Typ der Geometrie als String zurück. Intersection() Gibt die Geometrie zurück, welche alle Punkte enthält, die sowohl in der ersten Geometrie als auch in der zweiten Geometrie enthalten sind. Intersects() Gibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten. www.ronny-locht.de Seite127 Die Formate WKT und WKB IsEmpty Gibt zurück, ob die Geometrie leer ist. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Vorraussetzungen sind für jeden Geometrietyp anders. NumGeometries() Gibt die Anzahl der in einer Geometrie-Zusammenfassung (Mehrfachpunkt, Mehrfachlinie, Mehrfachfläche oder Geometriesammlung) enthalten Geometrien zurück. Diese Funktion arbeitet nicht rekursiv. Overlaps() Gibt zurück, ob sich zwei Geometrien überlappen, PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. SymDifference() Gibt die Geometrie zurück, welche alle Punkte enthält, die entweder in der ersten Geometrie oder in der zweiten Geometrie aber nicht in beiden vorhanden sind. Touches() Gibt zurück, ob zwei Geometrien gemeinsame Punkte auf ihren Rändern haben. Union() Gibt eine Geometrie zurück, welche eine Zusammenfassung der beiden Geometrien sind. Within Gibt zurück ob eine Geometrie G1 in der Geometrie G2 ist. www.ronny-locht.de Seite128 Die Formate WKT und WKB Funktionen die auf Sammlungen (GeometryCollections) anwendbar sind area() Gibt die Fläche die eingenommen wird zurück. AsBinary Gibt die Geometrie als WKB-Objekt zurück. AsText Gibt die Geometrie als WKT-Objekt zurück. Buffer Gibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind. Centroid Gibt den Schwerpunkt des Objektes als Punkt zurück. Collect Führt mehrere Geometrien zu einer Geometrie zusammen. ConvexHull() Gibt die konvexe Hülle eines Elementes zurück. Dimension() Gibt die räumliche Dimension der Geometrie zurück. Distance() Gibt den kleinsten Abstand zwischen den beiden Geometrien zurück. Envelop() Ergibt eine Rechteck aus den Min- und Max-Werten einer Geometrie zurück. Equals() Gibt an, ob eine Geometrie einer anderen Geometrie gleicht. www.ronny-locht.de Seite129 Die Formate WKT und WKB GeometryN() Gibt die n-te-Geometrie eine Geometrie-Zusammenfassung oder eines Mehrfach-Objektes zurück. IsEmpty Gibt zurück, ob die Geometrie leer ist. IsSimple() Gibt zurück, ob eine Geometrie geometrisch einfach ist. Die Voraussetzungen sind für jeden Geometrietyp anders. NumGeometries() Gibt die Anzahl der in einer Geometrie-Zusammenfassung (Mehrfach-Punkt, Mehrfach-Linie, Mehrfach-Fläche oder Geometriesammlung) enthalten Geometrien zurück. Diese Funktion arbeitet nicht rekursiv. PointOnSurface() Gibt einen Punkt zurück, welcher garantiert Teil der Geometrie ist. Relate() Gibt zurück ob zwei Geometrien in einem räumlichen Zusammenhang stehen. SRID() Gibt die SRID der Geometrie zurück. www.ronny-locht.de Seite130 Die Formate WKT und WKB Der Datenbankzugriff Einrichten einer Test-Datenbank Es wird bei der PostgreSQL davon ausgegangen, dass das Tool pgAdmin mit installiert ist. Sollte dies nicht geschehen sein, so muss es von der PostgreSQL-Seite herunterladen und separat installiert werden. Alle Datenbank-Installationen werden mit diesem Tool beschrieben. Für eine reine SQL-Nutzung können die Skripte unter der Rubrik Skripte genommen werden, hier liegt auch ein direkter Link auf die jeweiligen Skripte im Download-Bereich. Ebenso sollte die PostgreSQL-Datenbankserver eingerichtet sein, entweder mit der Option PostGIS oder mit nachinstallierten PostGIS. Die Installation des Datenbankservers wird zur Zeit hier nicht beschrieben. Beschaffung Sowohl PostgreSQL-Datenbank (Version 8.2) und das Datenbank-Tool pgAdmin (Version 1.6.3) als auch die Erweiterung PostGIS (Version 1.1.6) stehen frei zur Verfügung und können unter folgenden Adresse heruntergeladen werden: http://www.postgresql.org/ http://www.postgis.org/ Erstellen der Testdatenbank PostgreSQL/PostGIS Erstellen der Rollen Zuerst muss der Datenbankserver ausgewählt werden. Zuerst werden die Rollen in der Datenbank angelegt. Bei der PostgreSQL werden Benutzer und Rollen auf dem Datenbankserver festgelegt. Es werden die Gruppenrollen angelegt. Im weiteren werden die Gruppenrollen gis_admin und gis_user gebraucht. Zuerst legen wir den Nutzer gis_admin an. Hierzu muss eine Verbindung mit dem Datenbankserver als DB-Administrator (in den meisten Fällen ist dies postgres). Nun den Serverbaum mit dem Pluszeichen öffnen und mit der rechten Maustaste das Kontextmenü aufrufen. Den Menüpunkt www.ronny-locht.de Seite131 Die Formate WKT und WKB Gruppenrollen aufrufen. Im folgenden Dialog wird im Feld „Rollenname“ gis_admin eingegeben. Das Rollenprivileg „Kann weitere Rollen anlegen“ muss dieser Rolle zugebilligt sein. Danach muss noch die Gruppenrolle gis_user auf die gleiche Art und Weise erstellt werden. Dieser braucht jedoch keine besonderen Rollen-Privilegien. Erstellen der Nutzer Nun müssen noch zwei Nutzer erstellt werden. www.ronny-locht.de Seite132 Die Formate WKT und WKB Zuerst den Administrator für die Datenbank. Der Name des Datenbank-Nutzers sollte mein_gis_admin lauten, als Passwort wird von mir „mga“ genommen. www.ronny-locht.de Seite133 Die Formate WKT und WKB Diesem Nutzer wird die Rolle gis_admin hinzugefügt. www.ronny-locht.de Seite134 Die Formate WKT und WKB Analog wird der Nutzer mein_gis_user angelegt. Dieser bekommt das Passwort „mgu“ und die Rollenmitgliedschaft gis_user. Hinweis: Gibt es einen Nutzer mit bekannten Namen und Passwort, so ist dies ein grosses Sicherheitsproblem. Erstellen der Datenbank Nun kann mit der rechten Maustaste das Kontextmenü aufgerufen werden. Hier den Menüpunkt „Neue Datenbank“ aufrufen. Im darauf wird der Einrichtungsdialog angezeigt. www.ronny-locht.de Seite135 Die Formate WKT und WKB Name der Datenbank soll auf meine_postgis, der Eigentümer soll mein_gis_admin sein und das Template muss template_postgis (Template ist eine Vorlagendatei) sein. Ist dieses Template nicht vorhanden, so ist wahrscheinlich PostGIS nicht installiert. www.ronny-locht.de Seite136 Die Formate WKT und WKB Im Anschluss sollte die erstellte Datenbank analog dem unteren Bild aussehen. Sollte nicht weit mehr als zweihundert Funktionen und mindestens zwei Tabellen vorhanden sein, so ist bei der Installation etwas schiefgelaufen. www.ronny-locht.de Seite137 Die Formate WKT und WKB Erstellen der Sequenzen Für spätere Abfragen wird hier einen globalen GIS-Index einrichten. Damit bekommt jedes grafisches Element eine für die Datenbank eindeutige ID. Hierfür benötigen wir eine Sequenz. Im anschließenden Dialog muss nur der Name und die ID eingetragen werden, nützlich ist nun noch ein Kommentar, welchen Sinn diese Sequenz hat. www.ronny-locht.de Seite138 Die Formate WKT und WKB Wir müssen für diese Sequenz dem Nutzer gis_user die entsprechenden Rechte geben, damit dieser die Sequenz benutzen kann. Wir machen dies über die Gruppenrechte. Er muss sowohl lesen als auch schreiben können, da er mit jedem Lesen eines Wertes auch ein Update macht. Wie im vorhergenden Beispiel werden noch die Sequenzen mein_punkt, meine_mehrfach_punkte, meine_linie, meine_mehrfach_linien, mein_polygon, meine_mehrfach_polygone und meine_geometrie_collections erstellt. www.ronny-locht.de Seite139 Die Formate WKT und WKB Erstellen der Tabellen Wir wählen hier einen etwas aufwendigeren Weg der Installation, welcher jedoch später Vorteile bringt. Wir erstellen zuerst eine globale Tabelle, welche zu jedem Element die grundsätzlichen Werte enthält. Diese sind Geometrie, die enthaltende Tabelle, die Bounding-Box (ein Rechteck welches durch die minimalen und maximalen Koordinaten bestimmt wird), die Länge und die Fläche des Elements. Sollte ein Element keine Länge (Linien und Punkte) haben, bzw. keine Länge haben (Punkt und Fläche) so bleiben diese Null. Skripte Erstellen der Rollen Dieses Skript muss als Datenbankserver-Administrator ausgeführt werden. CREATE ROLE gis_admin NOSUPERUSER NOINHERIT NOCREATEDB CREATEROLE; CREATE ROLE gis_user NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE; Das Skript liegt unter: http://www.ronny-locht.de/postgres/skripte/erstelle_rollen.sql Erstelle der Nutzer Dieses Skript muss als Datenbankserver-Administrator ausgeführt werden. CREATE ROLE mein_gis_admin LOGIN ENCRYPTED PASSWORD 'md5c3c6903cec3e375a5aea4bc2a4237ed7' NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE; GRANT gis_admin TO mein_gis_admin; CREATE ROLE mein_gis_user LOGIN ENCRYPTED PASSWORD 'md50e3718b805ef571295205531f9a1c76a' NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE; GRANT gis_user TO mein_gis_user; http://www.ronny-locht.de/postgres/skripte/erstelle_nutzer.sql Erstellen der Datenbank Dieses Skript muss als Datenbankserver-Administrator ausgeführt werden CREATE DATABASE meine_postgis_2 TEMPLATE template_postgis OWNER = mein_gis_admin ENCODING = 'SQL_ASCII' TABLESPACE = pg_default; GRANT CONNECT, TEMPORARY ON DATABASE meine_postgis TO public; GRANT ALL ON DATABASE meine_postgis TO mein_gis_admin; http://www.ronny-locht.de/postgres/skripte/erstelle_nutzer.sql Erstellen der Sequenzen Dieses Skript kann nun als mein_gis_admin ausgeführt werden. www.ronny-locht.de Seite140 Die Formate WKT und WKB CREATE SEQUENCE globale_gis_sequenz INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; ALTER TABLE globale_gis_sequenz OWNER TO postgres; GRANT ALL ON TABLE globale_gis_sequenz TO postgres; GRANT SELECT, UPDATE ON TABLE globale_gis_sequenz TO gis_user; COMMENT ON SEQUENCE globale_gis_sequenz IS 'Die globale Sequenz für grafische Elemente über alle Tabellen'; http://www.ronny-locht.de/postgres/skripte/erstelle_sequenzen.sql Erstellen der Tabellen Hinweise zur Installation Installation von PostGIS als Option oder von der PostGIS-Seite Auf der PostGIS Seite wird gerne darauf hingewiesen, das die PostGIS-Version akuteller ist als die entsprechende PostGIS-Versionen die mit der PostgreSQL ausgeliefert werden. Auf der anderen Seite kann man sich aber sicher sein, das die PostGIS-Version mit der PostgreSQL-Version zusammenarbeitet. Netzkonfiguration mit hba.conf Sollte der Datenbankserver und nicht erreichbar sein, so sollte überprüft werden ob eine Zeile wie die folgende in der zugehörigen Datei hab.con eingerichtet ist. host all all 192.168.1.0/24 md5 Diese schaltet die für alle Adressen im a-Subnetz 192.168.1 frei. Änderung der Geometrie-Darstellung Zwischen der Version < 1.0 und der Version > 1.0 hat sich die Interne Darstellung der GeometrieElemente geändert, diese werden jetzt als WellKnownBinary anstatt als WellKnownText dargestellt. Dieses mach die Funktionalität schneller, allerdings ist die Lesbarkeit wesentlich geringer. Backup der Datenbank Backup Nach längeren Arbeiten an der Datenbank sollten die Ergebnisse gesichert werden. Ebenso kann es für eine Schulung oder eine Vorführung notwendig sein, die Datenbank zu auf einen anderen Server zu setzen. Hierfür bietet PostgreSQL einen einfachen Backup-Mechanismus. Zuerst muss man an der Datenbank angemeldet sein. Danach kann über das Kontextmenü der Menüpunkt Backup aufgerufen werden. www.ronny-locht.de Seite141 Die Formate WKT und WKB Im Nachfolgenden Dialog muss mit dem ...-Knopf noch der Speicherort für die Backup-Datei zugewiesen werden und anschließenden kann der Dialog ausgeführt werden. Wiederherstellung Noch offen Austausch von Daten Für Datenbanken mit geografischen Daten ist es häufig notwendig, das Daten ausgetauscht werden müssen. www.ronny-locht.de Seite142 Die Formate WKT und WKB Performance-Tuning GIS-index Der GiST-Index speichert das umhüllende Rechteck, die Bounding-Box ab. Zuerst wird überprüft ob sich diese überlappen oder berühren, bevor eine konkrete Berechnung durchgeführt wird. Die Berechnung ist denkbar einfach und deshalb auch sehr schnell. Es muss natürlich eins der beiden folgenden gelten min x g 1max x g 2 ∧ max x g 1min x g 2 ∧ max y g 1 min y g 2∧max y g 1min y g 2 Diese Bedingung lässt sich mit einem entsprechenden Index extrem schnell Verarbeiten. Gibt es, wie in Geo-Informationssystemen üblich sehr viele Elemente, die geometrisch nicht miteinander verbunden sind, kann hier eine Abfrage schnell um den Faktor 10.000 schneller werden, was nicht heißt, dass das Ergebnis nicht erst nach mehrstündiger Sucharbeit fertig sein kann. Der GiST-Index ist nur ansprechbar, wenn man die ST-Funktionen von PostGIS verwendet, diese Arbeiten direkt auf der Bounding-Box. Ich habe einmal eine Tabelle mit zirka 11.000 Flurstücken genommen und versucht, Flurstücke in einem Abstand von 10 Metern zu finden. Dies war auch erfolgreich. SELECT t1.ident, t2.ident FROM alk_flaechen t1, alk_flaechen t2 WHERE distance(t1.alk_flaechen, t2.alk_flaechen)<10 and t1.ident<>t2.ident LIMIT 1000 Limit (cost=0.00..2.00 rows=10 width=66) -> Nested Loop (cost=0.00..8636993.12 rows=43080908 width=66) Join Filter: ((distance(t1.alk_flaechen, t2.alk_flaechen) < 10::double precision) AND (t1.ident <> t2.ident)) -> Seq Scan on alk_flaechen t1 (cost=0.00..560.69 rows=11369 width=291) -> Seq Scan on alk_flaechen t2 (cost=0.00..560.69 rows=11369 width=291) Diese Abfrage hat also mit PostGIS-Version 1.1 über zwei Minuten gebraucht. SELECT t1.ident, t2.ident FROM alk_flaechen t1, alk_flaechen t2 WHERE t2.alk_flaechen && box2d(buffer(box2d(t1.alk_flaechen), 10)) AND distance(t1.alk_flaechen, t2.alk_flaechen)<10 www.ronny-locht.de Seite143 Die Formate WKT und WKB and t1.ident<>t2.ident Limit (cost=0.01..287.55 rows=10 width=66) -> Nested Loop (cost=0.01..6182.15 rows=215 width=66) Join Filter: ((distance(t1.alk_flaechen, t2.alk_flaechen) < 10::double precision) AND (t1.ident <> t2.ident)) -> Seq Scan on alk_flaechen t1 (cost=0.00..560.69 rows=11369 width=291) -> Index Scan using fads on alk_flaechen t2 (cost=0.01..0.46 rows=1 width=291) Index Cond: (t2.alk_flaechen && (box2d(buffer((box2d(t1.alk_flaechen))::geometry, 10::double precision)))::geometry) Filter: (t2.alk_flaechen && (box2d(buffer((box2d(t1.alk_flaechen))::geometry, 10::double precision)))::geometry) Die zweite Abfrage sieht der ersten sehr ähnlich, interessant ist der "&&"-Operator welcher dafür sorgt, dass zuvor prüft, ob sich die Bounding-Boxes überschneiden. Ab der Version 1.3 muss dieser zusätzliche Aufwand nicht mehr betrieben werden, da die meisten Operationen, welche Geometrien miteinander vergleichen automatisch auf die vorhandenen Indiezes zurückgreifen. Zu bedenke ist jedoch immer, das ein GiST-Index natürlich die Verarbeitung wesentlich langsamer macht, wenn nur Daten eingefügt werden und nicht über geometrische Opereationen verglichen wird. Dies kann durchaus vorkommen, wenn durch ein Programm, wie zum Beispiel OpenJump immer die komplette Tabelle gelesen wird. Wird hier jeweils anschließend die komplette Tabelle überschrieben, so wird dieser Index einfach nicht genutzt, aber der Aufwand zum Pflegen ist trotzdem vorhanden. Ein Index verbraucht natürlich auch Speicherplatz, und dieser wird natürlich linear mit der Anzahl der Elemente ansteigen. Werden also extrem viele Elemente mit wenigen Punkten gespeichert, so wird der Index wesentlich ineffektiver sein, als wenn nur wenige Elemente mit einer hohen Punktzahl gespeichert werden. Den Speicherplatz sollte man in der heutigen Zeit jedoch nicht überschätzen. Ich mache hier ein kleines Beispiel auf: ● ein x- bzw y-Wert benötigt 6 Byte für die Speicherung ● daraus folgt das min(x), max(x), min(y), max(y) 24 Byte brauchen ● nehmen wir an wir haben 10.000.000 Elemente ● dann folgt daraus das wir etwa 230 MB Speicherplatz benötigen ● eine normale Fläche kann mit 6 Punkten angenommen werden www.ronny-locht.de Seite144 Die Formate WKT und WKB ● diese würde also das 3-Fache benötigen, ohne ihre Sachdaten Auch sollte man die heutigen Festplattengrößen mit einbeziehen, und schon entzerrt sich das Bild. Abfrage-Optimierung Um eine Abfrage zu Optimieren muss zuerst einmal feststehen, wie diese Abfrage von der Datenbank verstanden wird, hierzu bietet PostgreSQL wie fast jede moderne Datenbank die Funktion explain an. Wenn eine Abfrage lange dauert, sollte man hier zuerst einmal schaun, ob die Indiezes so funktionieren, wie man es geplant hat. Es passiert nämlich auch erfahrenen Nutzern, das die Datenbanken den Index nicht so verwendet, wie der Nutzer dies gerne möchte. Vakuum Die PostgerSQL-Datenbank hat einen Mechanismus um Datentabellen zu optimieren. Hierfür existiert der Befehlt Vacuum. Dieser sollte regelmäßig durchgeführt werden, wenn Datentabellen ständigen Änderungen unterworfen sind. Enthalten die Tabellen hingegen nur statische Daten, so erzeugt diese Prozedur nur unnötige Wärme. Allgemeine Abfrage-Optimierung Bei allem technischen Aufwand sollte man immer bedenken, das die logische Optimierung einer SQL-Abfrage häufig wesentlich mehr bringt. Einigen Strategien hierzu wird ein eigenes Kapitel gewidmet. Denn egal wie schnell die Programme werden, werden Vergleiche über 50.000 x 50.000 Elemente gemacht so wird der Aufwand extrem hoch. Typische Fehlermeldungen In diesem Kapitel sollen Fehlermeldungen mit kurzen Problem-Lösungen aufgeführt werden. MySQL Dieses Buch bezieht sich auf den MySQL 5.0 Community Server, es wird eine vollständige Installation vorausgesetzt. (http://dev.mysql.com/downloads/mysql/5.0.html) Alle Installationen werden mit den Server-Werkzeugen dargestellt, die entsprechenden GUI-Tools müssen ebenfalls eingespielt werden. Im Download-Bereich stehen dann die Skripte für die manuelle Installation zur Verfügung. (http://dev.mysql.com/downloads/gui-tools/5.0.html) Auf die Installation der Datenbank wird zur Zeit nicht weiter eingegangen. www.ronny-locht.de Seite145 Die Formate WKT und WKB Erstellen der Datenbank Wir starten im den Mysql-Administrator unter Start-->Programme. Der anschließende Dialog muss mit dem Nutzer „root“ und dem entsprechenden Passwort, welches bei der Installation angegeben werden musste, an die vorgesehene Datenbanken passieren. Der Nutzer „root“ muss natürlich nicht verwendet werden, wenn der DB-Admin einen Nutzer mit Rechten zur Datenbank-Erstellung zur Verfügung gestellt hat. Dann müssen die Daten natürlich diese Nutzerdaten eingetragen werden. Unter dem Punkt „Kataloge www.ronny-locht.de Seite146 Die Formate WKT und WKB wird nun mit dem Kontextmenü ein neuer Katalog angelegt. Dieses Schema soll wkt_mysql heißen. Nun wird eine neue Tabelle angelegt. www.ronny-locht.de Seite147 Die Formate WKT und WKB Die Struktur der Tabelle sollte wie folgt aussehen. CREATE TABLE `wkt_mysql`.`test_wkt` ( `name` VARCHAR(45) NOT NULL, `id` INTEGER UNSIGNED ZEROFILL NOT NULL DEFAULT NULL AUTO_INCREMENT, POLYGON NOT NULL, PRIMARY KEY (`id`)) ENGINE = InnoDB; www.ronny-locht.de `geom` Seite148 Die Formate WKT und WKB Allgemeine Datenbankoptimierung Abseits von sich immer besser selber optimierenden Datenbanken sollten man ein wenig über die Durchführung von Queries in Datenbanken wissen. Dieses Kapitel ist ein kurzer Abriß, was man beachten sollte, damit die Queries nicht unnötig lange Laufzeiten haben. Es soll kein umfassender Performance-Workshop werden, aber man sollte halt immer beachten, dass man in GIS-Systemen schnell extrem viele Daten verwaltet, der Beziehung mit den grafischen Komponenten extreme Rechenleistungen verlangt. Index-Erstellung Tot-Indizierung Häufig wird gedacht, desto mehr Indiezes ich auf eine Datenbank setze, desto schneller wird diese. Dies stimmt allerdings nur für den lesenden Zugriff, und auch hier nur unter der Bedingung, das diese Indiezes auch genutzt werden. Beim schreibenden Zugriff wird die Datenbank logischweise langsamer, da jeder Index beim schreiben natürlich zusätzliche Zeit kostet. Es ist also notwendig, das man nur solche Indiezes benutzt, welche einen wirklichen Vorteil bei den Abfragen bringen. Querie-Planung www.ronny-locht.de Seite149 Die Formate WKT und WKB Programme für die Daten Hier eine Übersicht über die Programme zum Sichten, Speicher und Verarbeiten der Daten. Die verschiedenen Kategorien werden wie unten farblich markiert. Programmart Lizenz Datenbank frei Datenbank kommerziell Viewer frei Viewer kommerziell GIS frei GIS kommerziell Tools frei Tools kommerziell Viewer Das halten von WKT/WKB Daten in Datenbanken ist nicht alles. Häufig muss man sich schnell einige Daten auswählen und darstellen. In diesem Kapitel werden kurz einige Tools vorgestellt, welche die spatialen Daten anzeigen bzw. bearbeitet werden können. Vorraussetzung für diese Liste ist eine schnelle unkompliziert Anzeige. Zuerst ein Liste welches Tool mit welcher Datenbank zusammenarbeitet und welche Funktionalität es bietet. Anschließend ein weitere Tabelle, welche Datenmengen vorraussichtlich mit den Tools angezeigt werden können (zur Nachvollziehbarkeit werden von mir später Testdaten zur Verfügung gestellt). Die Liste wird regelmäßigen Updates unterzogen. Natürlich werden Hinweise an den Autor gerne angenommen, welche Programme in die Liste aufgenommen werden sollten. OpenJump Version MySQL Oracle PostgreSQL/PostGIS 1.2 ls/NV l+ls/NV l+ls/s ??/?? NV/NV l/s ??/?? l/s ??/?? Quatnum GIS gvSIG Abkürzungen: 1.1.1 ● L Lesen mit Datenbank-Updates, d.h. die Daten werden bei jedem Bildneuaufbau aus der Datenbank gelesen ● l Lesen ohne Updates aus der Datenbank, d.h. die Daten werden einmal gelesen und dann dargestellt, Änderungen in der Datenbank werden nicht übernommen. ● ls Lesen über ein Query-Tool. www.ronny-locht.de Seite150 Die Formate WKT und WKB ● ST Die Daten werden zuerst in einer Transaktion in der Datenbank gehalten und dann auf Wunsch übernommen ● S Geänderte Daten werden sofort in die Datenbank geschrieben. ● s Alle Daten/Änderungen werden in die Datenbank geschrieben, wurde von anderer Stellen Daten geändert, werden diese Überschrieben. ● NV Nicht verfügbar. ● ?? Nicht bekannt. GIS-System Betriebssystem-Verfügbarkeit Welche Programme können auf welchem Betriebssystem ausgeführt werden. Die blauen Spalten sind Betriebssysteme die getestet wurden, bei grünen Spalten konnten nicht getestet werden. OpenJump aktuelle Version Windows Linux Solaris 1.2 ja/Java ja/Java ja/Java ja/Java ja/Java ja/Java ??/?? ??/?? ??/?? ??/?? ??/?? ??/?? Quatnum GIS IBM/AIX MacOS X FreeBSD gvSIG 1.1.1 ??/?? ??/?? ??/?? ??/?? ??/?? ??/?? MySQL 6.0 ja ja ja ja ja ja ja ja ?? ?? ja ?? PostgerSQL/ 8.2/1.3.3 PostGIS Oracle 11g ja ja (DA) ?? ?? ?? ?? 1. ja es wird für dieses Betriebssystem ein natives Paket angeboten, dieses kann als Binär-Packet oder als Source-Code vorliegen 2. ja/Java Es wird als Java-Paket angeboten, eine entsprechende Java-Laufzeitumgebung muss installiert sein 3. ?? Der Status für dieses Betriebssystem ist nicht bekannt 4. ja (DA) Es stehen Pakete zur Verfügung, allerdings nur für bestimmte Distributionen www.ronny-locht.de Seite151 Die Formate WKT und WKB (Distributionsabhängig) Bezugsquellen Hier wird nach Möglichkeit das direkte Download-Verzeichnis angegeben. Ebenso ein Links auf gute Anleitungsseiten. Die Beispiele Natürlich gibt es jede Abfrage noch in einem SQL-Skript. Hier können die Werte nachfolzogen werden, und die Ergebnisse überprüft werden. Dies kann durchaus sinnvoll sein, da sich die Implmentierungen mit der Zeit ändern können. Für PostgerSQL/PostGIS-Nutzer gibt es noch eine zusätzliche Möglichkeit, hier können die Beispiele direkt aus einer Beispieldatenbank heraus, als View dargestellt werden. Dies ist besonders nützlich, wenn diese Beispiele dann mit einem Viewer wie zum Beispiel OpenJump dargestellt werden. Hierzu liegt unter ein Tabellendump und eine SQL-Skript, welches ausgeführt werden muss. Anschließend können die Abfragen über die entsprechende CodeNummer angesprochen werden. Wenn eine Abfrage in der Datenbank ist, so steht hinter der Abfrage in eckigen Klammern eine Code-Nummer. Mit den Anweisungen _create_ergebnis_view('[code_nummer]'); _create_quell_view('[code_nummer]'); werden die beiden Views "quelle" und "ergo" neu erstellt. www.ronny-locht.de Seite152