Die Formate WKT und WKB - ronny-locht.de · Die Formate WKT und WKB Der Aufbau des Formats...

152
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

Transcript of Die Formate WKT und WKB - ronny-locht.de · Die Formate WKT und WKB Der Aufbau des Formats...

Die Formate WKT und WKB

Die Formate WKT und WKB

Eine kurze Zusammenfassung von Rolf Breuer

InhaltsverzeichnisVorwort.................................................................................................................................................4Wer braucht so was..............................................................................................................................5

Der kleinste gemeinsame Nenner....................................................................................................5... und doch ein Fortschritt...............................................................................................................5

Der Aufbau des Formats.......................................................................................................................6WellKnownText...............................................................................................................................6

Regel für alle Elemente...............................................................................................................6Der Punkt....................................................................................................................................6Die Linie.....................................................................................................................................6Die Fläche...................................................................................................................................7Die Mehfachpunkte.....................................................................................................................8Die Mehfachlinien.......................................................................................................................9Die Multiflächen.......................................................................................................................10Die Geometriezusammenfassung..............................................................................................11

Der Text.........................................................................................................................................11Extended WellKnownText............................................................................................................12WellKnownBinary.........................................................................................................................12

Funktionsregister................................................................................................................................13Aufbau des Funktionsregisters.......................................................................................................13

Der Funktionsname...................................................................................................................13Parameter..................................................................................................................................13Rückgabewert............................................................................................................................13Fehlermeldungen.......................................................................................................................13Definition in der Datenbank......................................................................................................14Implementierungsunterschiede.................................................................................................14Die Symbolik............................................................................................................................14

Funktionen nach Namen................................................................................................................14Area()........................................................................................................................................14AsBinary().................................................................................................................................17AsText()....................................................................................................................................19Boundary()................................................................................................................................20Buffer()......................................................................................................................................25Centroid()..................................................................................................................................30Collect()....................................................................................................................................35Contains()..................................................................................................................................38ConvexHull()............................................................................................................................41Crosses()....................................................................................................................................45Distance()..................................................................................................................................49Dimension()..............................................................................................................................51Disjoint()...................................................................................................................................53

www.ronny-locht.de Seite1

Die Formate WKT und WKB

Difference()...............................................................................................................................54EndPoint....................................................................................................................................58Envelop()...................................................................................................................................61Equals().....................................................................................................................................63ExteriorRing()...........................................................................................................................65GeometryN().............................................................................................................................66GeometryType()........................................................................................................................67InteriorRingN().........................................................................................................................68Intersection().............................................................................................................................69Intersects().................................................................................................................................72IsClosed()..................................................................................................................................74IsEmpty()..................................................................................................................................76IsSimple()..................................................................................................................................77IsRing().....................................................................................................................................79Length().....................................................................................................................................80NumGeometries()......................................................................................................................82NumInteriorRing()....................................................................................................................83NumPoints()..............................................................................................................................84Overlaps()..................................................................................................................................85PointN().....................................................................................................................................88PointOnSurface()......................................................................................................................88Relate()......................................................................................................................................92StartPoint()................................................................................................................................97SRID().......................................................................................................................................98SymDifference()........................................................................................................................99Touches()................................................................................................................................102Union()....................................................................................................................................105Within()...................................................................................................................................107X()...........................................................................................................................................110y()............................................................................................................................................110

Funktionen nach Geometrien.......................................................................................................111Funktionen die auf Punkte (Points) anwendbar sind..............................................................111Funktionen die auf Linien (Linestrings) anwendbar sind ......................................................114Funktionen die auf Flächen (Polygone) anwendbar sind .......................................................116Funktionen die auf Mehfachpunkte (Multipoints) anwendbar sind .......................................119Funktionen die auf Mehrfachlinien (Multilinestring) anwendbar sind ..................................122Funktionen die auf Mehrfachflächen (Multipolygon) anwendbar sind .................................125Funktionen die auf Sammlungen (GeometryCollections) anwendbar sind ...........................128

Der Datenbankzugriff.......................................................................................................................130Einrichten einer Test-Datenbank.................................................................................................130

Beschaffung............................................................................................................................130Erstellen der Testdatenbank....................................................................................................130

PostgreSQL/PostGIS...................................................................................................................130Skripte.....................................................................................................................................139Hinweise zur Installation........................................................................................................140Backup der Datenbank............................................................................................................140Austausch von Daten .............................................................................................................141Performance-Tuning...............................................................................................................142

www.ronny-locht.de Seite2

Die Formate WKT und WKB

Typische Fehlermeldungen.....................................................................................................144MySQL........................................................................................................................................144

Erstellen der Datenbank..........................................................................................................145Allgemeine Datenbankoptimierung..................................................................................................148

Index-Erstellung......................................................................................................................148Querie-Planung.......................................................................................................................148

Programme für die Daten.................................................................................................................149Viewer..........................................................................................................................................149GIS-System..................................................................................................................................150Betriebssystem-Verfügbarkeit.....................................................................................................150Bezugsquellen..............................................................................................................................151Die 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 Vollzeit-Job 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 NennerZur 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 FortschrittAuch 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 ElementeAlle 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 PunktEin 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 Linieinsert 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 MehfachpunkteSollen Mehrere Punkte in einem Element abgebildete werden, so können diese im Mehfachpunkt-Objekt 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 MehfachlinienEine 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 Multi-Linien darzustellen.

Im oberen Beispiel sind die rotbraunen Kanten eingemessen während die Fläche nur aus der Raster-Karten 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ächenEin 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 GeometriesammlungEine 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 TextAlso 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 Multi-Punkt 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 WellKnownTextDer üblichen WKT-Darstellung wird noch eine SRID hinzugefügt. Dies ist eine Referenz auf eine Koordinatensystem-Definition.

WellKnownBinaryIm 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

010100000000000000000024400000000000002440im WellKnownBinary.

www.ronny-locht.de Seite12

Die Formate WKT und WKB

Funktionsregister

Aufbau des FunktionsregistersDas 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 FunktionsnameEin 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.

ParameterHier 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ückgabewertDer 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.

FehlermeldungenHier werden die bekannten Fehlermeldungen und ihre Ursachen aufgeführt, dies ist natürlich von der Datenbank abhängig.

Definition in der DatenbankHier 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

ImplementierungsunterschiedeHier 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

Geometrien1. Punkt

2. Mehrfach-Punkt

3. Linie

4. Mehrfach-Linie

5. Fläche

6. Mehrfach-Fläche

7. Geometriesammlung

Datenbanken1. DB2 (noch nicht fertig)

2. MySQL

3. Oracle (noch nicht fertig)

4. PostgreSQL/PostGIS

Funktionen nach Namen

Area()

ParameterGeometrie

Rückgabewert Fließkommazahl

BeschreibungGibt 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.

∑n=1

numGeometries

area Gn

Beispieleselect 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

PostgreSQL1. CREATE OR REPLACE FUNCTION area2d(geometry)

RETURNS Double precision2. CREATE OR REPLACE FUNCTION area(geometry)

RETURNS Double precision

MySQL1. Area(poly) RETRUNS

2. Area(poly) RETRUNS

ImplementierungsunterschiedeWird 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()

ParameterGeometrie

String ByteCoding

BeschreibungGibt 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 Byte-Reihenfolgen angeben, damit man die Daten an andere Server weiter geben kann, welche mit einer entsprechenden Byte-Reihenfolge arbeiten.

BeispieleBei 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

"0102000000020000000000000000004940000000000000004000000000000049400000000000002440"

allerdings by MySQL""

Nun einmal die Unterschiede in der Byte Reihenfolge, zuerst die Little-Indien-Varianteselect 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-Varianteselect 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ückgabewertBinärwert/Blob

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION asbinary(geometry, text)

RETURNS bytea2. CREATE OR REPLACE FUNCTION asbinary(geometry)

RETURNS bytea3. CREATE OR REPLACE FUNCTION astext(geometry)

RETURNS text

www.ronny-locht.de Seite18

Die Formate WKT und WKB4. CREATE OR REPLACE FUNCTION asewkb(geometry)

RETURNS bytea5. CREATE OR REPLACE FUNCTION asewkb(geometry)

RETURNS bytea

MySQL1. AsBinary(g) RETURNS blob2. AsWKB(g) RETURNS BLOB

AsText()

ParameterGeometrie

BeschreibungGibt 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.

BeispielEine 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ürzerselect 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

PostgreSQL1. CREATE OR REPLACE FUNCTION astext(geometry)

RETURNS text2. CREATE OR REPLACE FUNCTION asewkt(geometry, text)

RETURNS text

MySQL1. AsText(g) RETURNS text2. AsWKT(G) RETURNS text

Boundary()

ParameterGeometrie

Rückgabewert Geometrie

BeschreibungGibt 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()).

BeispieleZuerst 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 AnweisungSELECT 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 GLinie={startpoint Glinie , endpunkt GLinie}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]

ergibtMULTIPOINT(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

ergibtMULTIPOINT(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 Linien2. Sortiere diese nach X und Y3. Berechne die Anzahl der Vorkommen für jeden Punkt4. 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, 50 100,100 100, 100 50, 50 50)))')) [boundary_103_1]

ergibt keine BesonderheitenMULTILINESTRING((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, 50 100,100 100, 100 50, 0 0)))')) [boundary_103_2]

Das Ergebnis ist wieder ein MultilinestringMULTILINESTRING((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

ImplementierungsunterschiedeDie 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 objectsDiese Funktion sollte nicht mit einer Geometriesammlung aufgerufen werden.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION boundary(geometry)

RETURNS geometry

MySQLHier wurde nur ein Platzhalter definiert.

Buffer()

ParameterGeometrie

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

BeschreibungGibt 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.

BeispieleFü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 istselect 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 WKBgeometryfromtext('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

ImplementierungsunterschiedeDiese Funktion ist in der MySQL-Datenbank nicht vorhanden, es wurde auch kein Platzhalter definiert.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION buffer(geometry, Double precision)

RETURNS geometry 2. CREATE OR REPLACE FUNCTION buffer(geometry, Double precision, integer)

RETURNS geometry

MySQLDiese Funktion wurde bis zur Version 5.0 nicht implementiert.

Centroid()

ParameterGeometrie

Rückgabewert: Geometrie

BeschreibungGibt 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.

BeispieleGehen 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 Abfrageselect 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 Dimension für die Schwerpunktbestimmung benutzt, was folgendes Beispiel zeigt.

select asewkt(centroid(geometryfromtext('GEOMETRYCOLLECTION(

POINT(1 1),LINESTRING(1 1, 1 100),

www.ronny-locht.de Seite34

Die Formate WKT und WKBPOLYGON((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)"

ImplementierungsunterschiedeDie 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

PostgreSQL1. CREATE OR REPLACE FUNCTION centroid(geometry)

RETURNS geometry

Collect()

ParameterGeometrie

Geometrie

....

Rückgabewert: Geometrie

BeschreibungGibt 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 Eingabe-Geometrien 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.BeispieleDie 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ährendselect 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 1)') as geom unionSelect geometryfromtext('POINT(2 2)') unionSelect geometryfromtext('POINT(3 3)') unionSelect geometryfromtext('POINT(4 4)')) as subquery

)[Collect_1149_1]

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 unionSelect geometryfromtext('POINT(1 1)') unionSelect geometryfromtext('LINESTRING(1 1,10 10)') union

www.ronny-locht.de Seite37

Die Formate WKT und WKBSelect geometryfromtext('POINT(2 2)')) as subquery [Collect_106_1]

ergibtselect asewkt(collect(geom)) from (

Select geom From (Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom unionSelect geometryfromtext('POINT(1 1)') unionSelect geometryfromtext('LINESTRING(1 1,10 10)') union

Select geometryfromtext('POINT(2 2)')) as subquery_2order 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 unionSelect geometryfromtext('POINT(1 1)') unionSelect geometryfromtext('LINESTRING(1 1,10 10)') unionSelect geometryfromtext('POINT(2 2)')) as subquery_2

where geometrytype(geom)='POINT'UNIONSelect collect(geom) as geom From (

Select geometryfromtext('LINESTRING(0 0, 9 9)') as geom unionSelect geometryfromtext('POINT(1 1)') unionSelect geometryfromtext('LINESTRING(1 1,10 10)') unionSelect 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 demnachGEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(1 1)),GEOMETRYCOLLECTION(POINT(1 1)))

ImplementierungsunterschiedeDiese Funktion wird von der MySQL-Datenbank nicht unterstützt.

www.ronny-locht.de Seite38

Die Formate WKT und WKB

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION centroid(geometry)

RETURNS geometry

MySQLDiese Funktion ist in der MySQL-Datenbank nicht definiert.

Contains()

ParameterGeometrie

Geometrie

Rückgabewert Boolean

BeschreibungGibt 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.

BeispieleDie 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 WKBgeometryfromtext('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]

ergibttrue.

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]

ergibttrue.

Dass die Dimension keine Rolle spielt, zeigt folgende Abfrageselect contains(

geometryfromtext('POINT(1 1)'),geometryfromtext('LINESTRING(1 1, 1 1)')

) [Contains_3_1]

ergibttrue,

wobei bedacht werden sollte dasselect isvalid(

geometryfromtext('LINESTRING(1 1, 1 1)'))

natürlichfalse

ergibt.Ebenso ergibt

select asewkt(contains(geometryfromtext('POINT(1 1)'),geometryfromtext('GEOMETRYCOLLECTION(POINT(1 1), POINT(1 1))'))

) [Contains_7_1]

trueWahr 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ückeselect 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.

ImplementierungsunterschiedeBei 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

PostgreSQL1. CREATE OR REPLACE FUNCTION contains(geometry, geometry)

RETURNS boolean

MySQL1. Contains(g1,g2) RETRUNS boolan

www.ronny-locht.de Seite41

Die Formate WKT und WKB

ConvexHull()

ParameterGeometrie

BeschreibungGibt die konvexe Hülle eines Elementes zurück. Es gilt die Konvexe (convX)

1. ist minimal ¬∃convX G1 ldotsGnconvX G1ldots Gn

daraus folgt natürlich, das convX eindeutig ist

2. alle Punkte der Ausgangsgeometrien sind Teilmenge {¬∃P∈G1 ...Gn∨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

BeispieleFü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 auchselect 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

PostgreSQL1. CREATE OR REPLACE FUNCTION convexhull(geometry)

RETURNS geometry

MySQL2. ConvexHull(g) RETRUNS geometry

Rückgabewert Geometrie

Crosses()

ParameterGeometrie

Geometrie

BeschreibungGibt zurück, ob sich zwei Geometrien überkreuzen, was bedeutet

1. die beiden Geometrien überschneiden sich{∃P /P∈G1∧P∈G2}

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−13. kein Punkt der Schnittmenge darf auf dem Rand einer der beiden Flächen liegen

{∀ Pn∈G1∧Pn∈G2/Pn∉border G 1∧Pn∉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

BeispieleNach 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]

ergibttrue

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

ImplementierungsunterschiedeBei 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

PostgreSQL1. CREATE OR REPLACE FUNCTION crosses(geometry, geometry)

RETURNS boolean

MySQL1. Crosses(g1,g2) returns double precision

Distance()

ParameterGeometrie

Geometrie

www.ronny-locht.de Seite49

Die Formate WKT und WKB

BeschreibungBerechnet die kürzeste Distanz zwischen zwei Objekten.

Beispieleselect distance(

geometryfromtext('POLYGON((10 10, 20 10, 20 20, 10 20, 10 10))'),geometryfromtext('POINT(0 0)') [Distance_316_1]

)

ergibt ungefähr14,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ückgabewertFließkommazahl r∈ℝ

ImplementierungsunterschiedeDieses ist eine der wenigen Analyse-Funktionen die nicht auf den MBR zurückgreift, auch wenn man sich hier leicht im Handbuch vertun kann.

PostgreSQL1. CREATE OR REPLACE FUNCTION distance(geometry, geometry)

RETURNS double precision2. 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)

MySQL1. Distance(g1,g2) returns double precision

Dimension()

ParameterGeometrie

www.ronny-locht.de Seite51

Die Formate WKT und WKB

BeschreibungGibt 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 Punkt1 Linie2 Fläche

Beispiele

Punkte

select dimension(geometryfromtext('POINT(1 1)')

) [Dimension_99_1]ergibt

0

Dementsprechendselect 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 WKB2

GeomtriesammlungHier 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ückgabewertGanzzahl n∈−1,0 ,1 ,2

Fehlermeldungen

PostgreSQL

1. Something went wrong in dimension computationTritt 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.

PostgreSQL1. CREATE OR REPLACE FUNCTION dimension(geometry)

RETURNS integer

MySQL1. Dimension(g) returns int

www.ronny-locht.de Seite53

Die Formate WKT und WKB

Disjoint()

ParameterGeometrie

Geometrie

BeschreibungGibt 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

falseebenso

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

ImplementierungsunterschiedeBei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0).

PostgreSQL1. CREATE OR REPLACE FUNCTION disjoint(geometry, geometry)

RETURNS boolean

MySQL1. Disjoint(g1,g2) returns int

www.ronny-locht.de Seite54

Die Formate WKT und WKB

Difference()

ParameterGeometrie

Geometrie

BeschreibungGibt 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.

BeispieleDas 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

ImplementierungsunterschiedeMySQL hat diese Funktion nicht implementiert.

ParameterGeometrie

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION difference(geometry, geometry)

RETURNS geometry

MySQLDiese 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 argumentsBedeutet, dass diese Funktion nicht mit einer Geometriesammlung aufgerufen werden darf.

www.ronny-locht.de Seite58

Die Formate WKT und WKB

EndPoint

ParameterGeometrie

BeschreibungGibt den letzten Punkt einer Linie zurück, bei einer Mehrfachlinie den letzten Punkt der ersten Linie.

Beispieleselect 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 WKBselect 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ückgabewertGeometrie

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION endpoint(geometry)

RETURNS geometry

MySQLEndPoint(ls) RETRUNS geometry

Envelop()

ParameterGeometrie

BeschreibungErgibt 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 ergibtselect isvalid('POLYGON((5 10,5 10,5 10,5 10,5 10))')false.

Das erste vernünftige Ergebnis ergibt sich ausselect 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ückgabewertGeometrie

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION envelope(geometry)

RETURNS geometry

MySQL1. Envelope(g) RETRUNS geometry

Equals()

ParameterGeometrie

Geometrie

BeschreibungGibt 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 Anfangs- und 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

BeispieleDer einfachste Fall ist der Vergleich von zwei Punkten

select equals(geometryfromtext('POINT(1 1)'),geometryfromtext('POINT(1 1)')

)[Equals_1_1]ergibt

trueSoweit 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

trueDamit 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

truealso 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 unsupportedDiese Funktion darf nicht mit Geometriesammlungen aufgerufen werden.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION equals(geometry, geometry)

RETURNS boolean

MySQL1. Equals(g1,g2) returns int

www.ronny-locht.de Seite65

Die Formate WKT und WKB

ImplementierungsunterschiedeBei 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()

ParameterGeometrie

BeschreibungGibt den äußeren Ring einer Fläche zurück. Ein Ring ist eine Linie, und muss deshalb gegebenenfalls gewandelt werden.

Beispieleselect 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 polygonEin 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

PostgreSQL1. CREATE OR REPLACE FUNCTION exteriorring(geometry)

RETURNS geometry

MySQL1. ExteriorRing(poly) returns geometry

GeometryN()

ParameterGeometrie

BeschreibungGibt 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.

BespieleSELECT AsText(GeometryN(GeomFromText(

'MULTIPOINT(1 1)'),1)); [GeometryN_105_1]

Ergibt 'POINT(1 1)'

Ergibt null.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION geometryn(geometry, integer)

RETURNS geometry

MySQL1. GeometryN(gc,N) returns geometry

Rückgabewert Geometrie

www.ronny-locht.de Seite67

Die Formate WKT und WKB

GeometryType()

ParameterGeometrie

BeschreibungGibt den Typ der Geometrie als String zurück.

Beispieleselect 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

PostgreSQL1. CREATE OR REPLACE FUNCTION geometrytype(geometry)

RETURNS text

MySQL1. GeometryType(g) returns string

InteriorRingN()

ParameterGeometrie

Ganzzahl n

BeschreibungGibt 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.

BeispieleDer 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]

ergibtnull

Rückgabewert Geometrie

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION interiorringn(geometry, integer)

RETURNS geometry

MySQL2. InteriorRingN(poly,N) returns geometry

Intersection()

ParameterGeometrie

Geometrie

www.ronny-locht.de Seite69

Die Formate WKT und WKB

RückgabewertGeometrie

BeschreibungGibt 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.

BeispieleAm 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 verarbeitetselect 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))"

ImplementierungsunterschiedeBei 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 argumentsBedeutet, dass diese Funktion nicht mit einer Geometriesammlung aufgerufen werden darf.

PostgreSQL1. 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()

ParameterGeometrie

Geometrie

Rückgabewert: Boolean

BeschreibungGibt zurück ob sich zwei Geometrien nicht elementfremd sind, das also die Punktmengen mindestens ein gemeinsames Element enthalten.

{∃P /P∈G 1∧P∈G2}intersects G1, G2¬disjoint G 1,G 2

BeispieleZum Anfang eine einfaches Beispiel mit Punkten

select Intersects(geometryfromtext('POINT(1 1)'),geometryfromtext('POINT(1 1)')

) [Intersects_1_1]ergibt

trueAuch 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

ImplementierungsunterschiedeBei 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 unsupportedDiese Funktion darf nicht mit Geometriesammlungen aufgerufen werden.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION intersects(geometry, geometry)

RETURNS boolean

MySQL

Diese Funktion ist in der MySQL nicht implementiert.

IsClosed()

ParameterGeometrie

BeschreibungGibt zurück, ob eine Linie den gleichen Anfangs- und Endpunkt hat.

BeispieleDas ganze für eine Linie ist einfach

select isClosed(geometryfromtext('LINESTRING( 5 5, 10 10)')

) [IsClosed_100_1]ergibt

falseIst 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]

ergibttrue

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

ImplementierungsunterschiedeDie 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION isclosed(geometry) RETURNS boolean

MySQL1. IsClosed(mls) Returns 0, 1, -1

IsEmpty()

ParameterGeometrie

www.ronny-locht.de Seite76

Die Formate WKT und WKB

BeschreibungGibt zurück, ob die Geometrie leer ist.

Rückgabewert: Boolean

Beispiele

Select isEmpty(geometryfromtext('GEOMETRYCOLLECTION EMPTY')

) [IsEmpty_104_1]ergibt

trueAlle anderen Geometrien werden false zurückgeben

ImplementierungsunterschiedeDie 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION isempty(geometry) RETURNS boolean

MySQL1. IsEmpty(g) Returns 0, 1, -1

IsSimple()

ParameterGeometrie

BeschreibungGibt zurück, ob eine Geometrie geometrisch einfach ist. Die Voraussetzungen sind für jeden Geometrietyp anders.

PunkteEin zulässiger Punkt ist Simple.

LinienLinien dürfen nicht Überschneiden sein und keine Kickbacks haben.

www.ronny-locht.de Seite77

Die Formate WKT und WKB

FlächenFlächen dürfen nicht selbstüberschneident sein und keine Kickbacks haben.

Beispiele

PunkteEin zulässiger Punkt ist Simple.

Mehrfachgeometrie und GeometriesammlungenJedes 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.{∃Pn↔Pm∣m≠n}¬simple

not∃Pn↔Pm∀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, 10 0, 10 5, 5 0)')) [IsSimple_100_1]

www.ronny-locht.de 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.

Wenn1. {∃Gn↔Gm∣m≠n }2. {∃G1¬simple}

dann ist die Geometrie nicht einfach.

Rückgabewert Boolean

ImplementierungsunterschiedeDiese Funktion ist nur als Platzhalter in der MySQL-Datenbank definiert.

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION issimple(geometry) RETURNS boolean

MySQLIsSimple ist in der MySQL nur als Platzhalter definiert, und sollte nicht verwendet werden.

IsRing()

ParameterGeometrie

BeschreibungGibt 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

BeispieleAls erstes die richtige Lösung.

select isRing(geometryfromtext('LINESTRING( 5 5,0 0, 5 0,5 5)')

) [IsRing_100_2]ergibt

trueBei 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION isring(geometry) RETURNS boolean

MySQL1. IsRing(ls) Returns 0,1

www.ronny-locht.de Seite80

Die Formate WKT und WKB

Length()

ParameterGeometrie

Rückgabewert: Fließkommazahl

BeschreibungGibt die Länge einer linienhaften Geometrie zurück.

Beispiele

Punkte/MehrfachpunktePunkte und Mehrfachpunkte haben immer die Länge 0.

select Length(geometryfromtext('MULTIPOINT(1 1, 0 0)')

) [Length_105_2]ergibt

0

LinienDie 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, 5 5)')) [Length_100_3]

ergibt0

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.

GeometriesammlungIn 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

ImplementierungsunterschiedeBei MySQL wird die Funktion als Glenght implementiert, Length ist in der Datenbank für Strings reserviert und deshalb reserviert.

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION length(geometry)

RETURNS double precision 2. CREATE OR REPLACE FUNCTION length2d(geometry)

RETURNS double precision3. CREATE OR REPLACE FUNCTION length3d(geometry)

RETURNS double precision

MySQL1. GLength(mls) Returns double precision2. GLength(ls) Returns double precision

www.ronny-locht.de Seite82

Die Formate WKT und WKB

NumGeometries()

ParameterGeometrie

BeschreibungGibt 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

ergibt1

RückgabewertGanzzahl

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION numgeometries(geometry) RETURNS integer

MySQL1. NumGeometries(gc) Returns Integer

NumInteriorRing()

ParameterGeometrie

BeschreibungGibt 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]

ergibt2

www.ronny-locht.de Seite84

Die Formate WKT und WKB

RückgabewertGanzzahl

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION numinteriorring(geometry) RETURNS integer

MySQL1. NumInteriorRings(poly) Returns Integer

NumPoints()Parameter

Geometrie

BeschreibungGibt 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ückgabewertGanzzahl

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION npoints(geometry) RETURNS integer

www.ronny-locht.de Seite85

Die Formate WKT und WKB

MySQL1. NumPoints(ls) Returns Integer

Overlaps()

ParameterGeometrie

Geometrie

BeschreibungGibt 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.

∣G1∩G1∣=∞∧G1≠G2

Der Schnitt der beiden Geometrien muss die gleiche Dimension haben wie die minimale Dimension der beiden Geometrien.

BeispieleDie 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION "overlaps"(geometry, geometry) RETURNS boolean

MySQL1. Overlaps(g1,g2) returns boolean

ImplementierungsunterschiedeBei 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()

ParameterGeometrie

BeschreibungGibt 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]

ergibtPOINT(10 10)

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION Programminterface(geometry) RETURNS geometry

MySQL1. PointN(ls,N) Returns Geometrie

PointOnSurface()

ParameterGeometrie

www.ronny-locht.de Seite89

Die Formate WKT und WKB

BeschreibungGibt 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION pointonsurface(geometry) RETURNS geometry

MySQL1. PointOnSurface(mpoly)

Relate()

ParameterGeometrie

Geometrie

[Char(9) Relations-Matrix]

BeschreibungGibt 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

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

G1

G2

Interior Boundary Exterior

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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION relate(geometry, geometry) RETURNS text

www.ronny-locht.de Seite97

Die Formate WKT und WKB2. CREATE OR REPLACE FUNCTION relate(geometry, geometry, text)

RETURNS boolean

StartPoint()

ParameterGeometrie

BeschreibungGibt den ersten Punkt einer Linie der ersten Linie zurück.

Beispieleselect 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ückgabewertGeometrie

www.ronny-locht.de Seite98

Die Formate WKT und WKB

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION startpoint(geometry) RETURNS geometry

MySQL2. StartPoint(ls) Returns Geometrie

SRID()

ParameterGeometrie

BeschreibungGibt 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ückgabewertInteger

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION srid(geometry) RETURNS integer

MySQL1. SRID(g) Returns Integer

www.ronny-locht.de Seite99

Die Formate WKT und WKB

SymDifference()

ParameterGeometrie

Geometrie

BeschreibungGibt 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ächenselect 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ückgabewertGeometrie

FehlermeldungenPostgreSQL

1. IllegalArgumentException: This method does not support GeometryCollection argumentsDiese Funktion sollte nicht mit einer Geometriesammlung aufgerufen werden.

ImplementierungsunterschiedeDiese Funktion ist nicht in der MySQL implementiert.

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION symdifference(geometry, geometry) RETURNS geometry

2. CREATE OR REPLACE FUNCTION symmetricdifference(geometry, geometry) RETURNS geometry

MySQLDiese Funktion ist in der MySQL nicht implementiert.

www.ronny-locht.de Seite102

Die Formate WKT und WKB

Touches()

ParameterGeometrie

Geometrie

BeschreibungGibt 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∈G1∩envelop G 1∧P∈G2∩envelopG2}

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

trueLinien 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

ergibttrueselect 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 WKBselect 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

ImplementierungsunterschiedeBei der Implementierung der MySQL wird nur auf die MBR-Funktion zurückgegriffen (laut Handbuch bis Stand 6.0).

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION touches(geometry, geometry) RETURNS boolean

MySQL1. Touches(g1,g2) Returns 0, 1

Union()

ParameterGeometrie

Geometrie

BeschreibungGibt 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 Collect-Funktion.

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ückgabewertBoolean

ImplementierungsunterschiedeDie 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 DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION GeomUnion(geometry, geometry) RETURNS geometry

MySQLDiese Funktion ist in der MySQL nicht definiert.

Within()

ParameterGeometrie

Geometrie

Rückgabewert: Boolean

BeschreibungGibt 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⊂G1∧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

trueWas 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

trueEin 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

ergibttrue

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]

ergibtfalse

Die Geometrie muss also in einer Geometrie komplett enthalten sein. Nebenbei ist die Mehrfachfläche nicht validierbar.

ImplementierungsunterschiedeDie MySQL implementiert diese Funktion nicht. Nur eine Bounding-Box-Funktion existiert.

Definition in den DatenbankenPostgreSQL

1. CREATE OR REPLACE FUNCTION within(geometry, geometry) RETURNS boolean

MySQLDiese Funktion ist in der MySQL nicht definiert.

ImplementierungsunterschiedeBei 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()

ParameterGeometrie

Beispiele

select X(geometryfromtext('POINT(1 1)')

) [X_99_1]ergibt

1

BeschreibungGibt den X-Wert (Rechtswert) des Punkts zurück.

Rückgabewert: Fließkommazahl

Definition in den Datenbanken

PostgreSQL1. CREATE OR REPLACE FUNCTION x(geometry)

RETURNS double precision

MySQL1. X(p) Returns double precision

y()

ParameterGeometrie

Rückgabewert: Fließkommazahl

BeschreibungGibt 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

PostgreSQL1. CREATE OR REPLACE FUNCTION y(geometry)

RETURNS double precision

MySQL2. X(p) Returns double precision

Funktionen nach Geometrien

Funktionen die auf Punkte (Points) anwendbar sind

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CollectFührt mehrere Geometrien zu einer Geometrie zusammen.

CentroidGibt 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.

DisjointGibt 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

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

BoundaryGibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

DisjointGibt 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.

WithinGibt 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

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BoundaryGibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

DisjointGibt zurück ob zwei Geometrie elementfremd sind.

www.ronny-locht.de Seite118

Die Formate WKT und WKB

CentroidGibt 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.

IsEmptyGibt 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.

WithinGibt zurück ob eine Geometrie G1 in der Geometrie G2 ist.

Funktionen die auf Mehfachpunkte (Multipoints) anwendbar sind

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

www.ronny-locht.de Seite120

Die Formate WKT und WKB

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

DisjointGibt 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.

IsEmptyGibt 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.

WithinGibt zurück ob eine Geometrie G1 in der Geometrie G2 ist.

Funktionen die auf Mehrfachlinien (Multilinestring) anwendbar sind

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BoundaryGibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

DisjointGibt 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.

IsEmptyGibt 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.

WithinGibt 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.

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BoundaryGibt die äußeren Grenzen eines Objektes wieder. Dabei ist das resultierende Objekt immer eine Dimension kleiner als das Ausgangs-Objekt.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

DisjointGibt 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

IsEmptyGibt 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.

WithinGibt 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.

AsBinaryGibt die Geometrie als WKB-Objekt zurück.

AsTextGibt die Geometrie als WKT-Objekt zurück.

BufferGibt eine Fläche zurück, welche die Fläche und alle Punkte enthält, die im angegebenen Abstand zur ursprünglichen Geometrie vorhanden sind.

CentroidGibt den Schwerpunkt des Objektes als Punkt zurück.

CollectFü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.

IsEmptyGibt 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.

BeschaffungSowohl 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 RollenZuerst 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 NutzerNun 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 DatenbankNun 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 SequenzenFü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 TabellenWir 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 RollenDieses 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 NutzerDieses 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 DatenbankDieses 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 SequenzenDieses Skript kann nun als mein_gis_admin ausgeführt werden.

www.ronny-locht.de Seite140

Die Formate WKT und WKBCREATE 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-SeiteAuf 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.confSollte 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 md5Diese schaltet die für alle Adressen im a-Subnetz 192.168.1 frei.

Änderung der Geometrie-DarstellungZwischen der Version < 1.0 und der Version > 1.0 hat sich die Interne Darstellung der Geometrie-Elemente 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

minx g 1max x g2∧maxx g1min x g2∧max y g1min y g 2∧max y g1min y g2

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

FROMalk_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 WKBand 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-OptimierungUm 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-OptimierungBei 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.

MySQLDieses 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 DatenbankWir 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, `geom` POLYGON NOT NULL, PRIMARY KEY (`id`))ENGINE = InnoDB;

www.ronny-locht.de Seite148

Die Formate WKT und WKB

Allgemeine DatenbankoptimierungAbseits 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-IndizierungHä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 DatenHier eine Übersicht über die Programme zum Sichten, Speicher und Verarbeiten der Daten.

Die verschiedenen Kategorien werden wie unten farblich markiert.

Programmart LizenzDatenbank freiDatenbank kommerziell

Viewer freiViewer kommerziell

GIS freiGIS kommerziell

Tools freiTools kommerziell

ViewerDas 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.

Version MySQL Oracle PostgreSQL/PostGISOpenJump 1.2 ls/NV l+ls/NV l+ls/s

Quatnum GIS ??/?? NV/NV l/sgvSIG 1.1.1 ??/?? l/s ??/??

Abkürzungen:

● LLesen mit Datenbank-Updates, d.h. die Daten werden bei jedem Bildneuaufbau aus der Datenbank gelesen

● lLesen ohne Updates aus der Datenbank, d.h. die Daten werden einmal gelesen und dann dargestellt, Änderungen in der Datenbank werden nicht übernommen.

● lsLesen über ein Query-Tool.

www.ronny-locht.de Seite150

Die Formate WKT und WKB

● STDie Daten werden zuerst in einer Transaktion in der Datenbank gehalten und dann auf Wunsch übernommen

● SGeänderte Daten werden sofort in die Datenbank geschrieben.

● sAlle Daten/Änderungen werden in die Datenbank geschrieben, wurde von anderer Stellen Daten geändert, werden diese Überschrieben.

● NVNicht verfügbar.

● ??Nicht bekannt.

GIS-System

Betriebssystem-VerfügbarkeitWelche 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.

aktuelle Version

Windows Linux Solaris IBM/AIX MacOS X FreeBSD

OpenJump 1.2 ja/Java ja/Java ja/Java ja/Java ja/Java ja/JavaQuatnum GIS ??/?? ??/?? ??/?? ??/?? ??/?? ??/??

gvSIG 1.1.1 ??/?? ??/?? ??/?? ??/?? ??/?? ??/??

MySQL 6.0 ja ja ja ja ja jaPostgerSQL/

PostGIS8.2/1.3.3 ja ja ?? ?? ja ??

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/JavaEs 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)

BezugsquellenHier wird nach Möglichkeit das direkte Download-Verzeichnis angegeben. Ebenso ein Links auf gute Anleitungsseiten.

Die BeispieleNatü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 Code-Nummer 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