Die Formate WKT und WKB (PDF

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