Diese Lektion zeigt, wie Sie mit einigen der räumlichen Methoden Daten in einem bestimmten Kontext abfragen können.
Die Abfragen werden in der Tabelle SpatialContacts oder Massdata oder in beiden Tabellen ausgeführt. Die Tabelle SpatialContacts, die bereits in Ihrer Datenbank vorhanden war, enthält Namen und Kontaktinformationen für Personen, von denen viele in Massachusetts leben.
Es wird auch gezeigt, wie Abstände berechnet werden. Hierfür müssen Sie Maßeinheiten in die Datenbank einfügen.
In Interactive SQL erstellen Sie eine Variable namens @Mass_01775
, um die zugehörige Geometrie für die PLZ-Region 01775 zu speichern.
CREATE VARIABLE @Mass_01775 ST_Geometry; SELECT geometry INTO @Mass_01775 FROM Massdata WHERE ZIP = '01775'; |
Sie möchten z. B. alle Kontakte in SpatialContacts im PLZ-Bereich 01775 und den umgebenden PLZ-Bereichen suchen. Hierzu können Sie die ST_Intersects-Methode verwenden, die Geometrien zurückgibt, die sich mit der angegebenen Geometrie überschneiden oder mit ihr übereinstimmen. Sie können z.B. die folgende Anweisung in Interactive SQL ausführen:
SELECT c.Surname, c.GivenName, c.Street, c.City, c.PostalCode, z.geometry FROM Massdata z, SpatialContacts c WHERE c.PostalCode = z.ZIP AND z.geometry.ST_Intersects( @Mass_01775 ) = 1; |
Alle Zeilen in Massdata.geometry sind demselben räumlichen Bezugssystem (SRID 4269) zugeordnet, da der Geometriespalte bei der Erstellung die SRID 4269 zugeordnet wurde und Daten in sie eingelesen wurden.
Es ist jedoch auch möglich, eine nicht deklarierte ST_Geometry-Spalte zu erstellen (d. h. ohne Zuweisung einer SRID). Dies kann erforderlich sein, wenn Sie planen, in einer einzelnen Spalte räumliche Daten zu speichern, denen unterschiedliche räumliche Bezugssysteme zugeordnet sind. Wenn diese Werte bearbeitet werden, wird jeweils das räumliche Bezugssystem verwendet, das dem betreffenden Wert zugeordnet ist.
Wenn eine Spalte nicht deklariert wird, besteht die Gefahr, dass der Datenbankserver die Änderung eines räumlichen Bezugssystems zulässt, das den Daten in der nicht deklarierten Spalte zugeordnet ist.
Wenn die Spalte eine deklarierte SRID hat, erlaubt der Datenbankserver es nicht, das räumliche Bezugssystem, das den Daten zugeordnet ist, zu verändern. Sie müssen die Daten zuerst aus der Spalte auslesen und dann kürzen, das räumliche Bezugssystem ändern und dann die Daten erneut einlesen.
Mit der Methode ST_SRID können Sie die SRID ermitteln, die Werten einer Spalte zugeordnet ist, und zwar unabhängig davon, ob diese deklariert ist. Beispiel: Folgende Anweisung zeigt die SRID, die den einzelnen Zeilen in der Spalte Massdata.geometry zugeordnet ist:
SELECT geometry.ST_SRID() FROM Massdata; |
Mit der ST_CoveredBy-Methode können Sie prüfen, ob eine Geometrie vollständig in einer anderen Geometrie enthalten ist. Beispiel: Massdata.CenterPoint (ST_Point-Typ) enthält die Breitengrad-/Längengrad-Koordinaten des Mittelpunkts des PLZ-Bereichs, während Massdata.geometry das Polygon enthält, das den PLZ-Bereich darstellt. Sie können schnell prüfen, ob ein CenterPoint-Wert außerhalb des PLZ-Bereichs liegt, indem Sie folgende Abfrage in Interactive SQL ausführen:
SELECT * FROM Massdata WHERE NOT(CenterPoint.ST_CoveredBy(geometry) = 1); |
Es werden keine Zeilen zurückgegeben. Dies zeigt an, dass alle CenterPoint-Werte innerhalb ihrer in Massdata.geometry zugeordneten Geometrien liegen. Diese Prüfung stellt natürlich nicht sicher, dass es sich um die tatsächlichen Mittelpunkte handelt. Sie müssten die Daten auf ein räumliches Bezugssystem für die plane Erddarstellung projizieren und die CenterPoint-Werte mit der ST_Centroid-Methode prüfen. Hinweise zum Projizieren von Daten in ein anderes räumliches Bezugssystem finden Sie unter Lektion 6: Räumliche Daten projizieren.
Mit der Methode ST_Distance können Sie den Abstand zwischen zwei Mittelpunkten der PLZ-Bereiche messen. Sie möchten z. B. die Liste aller Postleitzahlen innerhalb von 100 Meilen vom PLZ-Bereich 01775. Führen Sie z.B. die folgende Abfrage in Interactive SQL aus:
SELECT c.PostalCode, c.City, z.CenterPoint.ST_Distance( ( SELECT CenterPoint FROM Massdata WHERE ZIP = '01775' ), 'Statute mile' ) dist, z.CenterPoint FROM Massdata z, SpatialContacts c WHERE c.PostalCode = z.ZIP AND dist <= 100 ORDER BY dist; |
Wenn die Kenntnis der genauen Entfernung nicht von Bedeutung ist, können Sie statt dessen die Abfrage unter Verwendung der ST_WithinDistance-Methode erstellen, die bei bestimmten Datensätzen eine bessere Performance bietet (insbesondere bei großen Geometrien):
SELECT c.PostalCode, c.City, z.CenterPoint FROM Massdata z, SpatialContacts c WHERE c.PostalCode = z.ZIP AND z.CenterPoint.ST_WithinDistance( ( SELECT CenterPoint FROM Massdata WHERE ZIP = '01775' ), 100, 'Statute mile' ) = 1 ORDER BY c.PostalCode; |
Siehe ST_WithinDistance-Methode für den ST_Geometry-Datentyp.
Fahren Sie fort mit Lektion 5: Ausgabe von räumlichen Daten in SVG .
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |