Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - Unterstützung für räumliche Daten » Räumliche Daten » Praktische Einführung: Mit den räumlichen Funktionen experimentieren

 

Lektion 4: Räumliche Daten abfragen

Diese Lektion zeigt, wie Sie mit einigen der räumlichen Methoden Daten in einem bestimmten Kontext abfragen können. Es wird auch gezeigt, wie Abstände berechnet werden. Hierfür müssen Sie Maßeinheiten in die Datenbank einfügen.

Voraussetzungen

In dieser Lektion wird davon ausgegangen, dass Sie bereits alle vorherigen Lektionen abgeschlossen haben. Siehe Lektion 1: Zusätzliche Maßeinheiten und räumliche Bezugssysteme installieren.

In dieser Lektion wird davon ausgegangen, dass Sie die Rollen und Privilegien haben, die im Abschnitt "Privilegien" am Anfang dieser praktischen Einführung aufgeführt sind: Praktische Einführung: Mit den räumlichen Funktionen experimentieren.

Kontext und Bemerkungen

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.

 Abfragen der räumlichen Daten
  1. 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';
  2. 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, GROUPO.SpatialContacts c
    WHERE
    c.PostalCode = z.ZIP
    AND z.geometry.ST_Intersects( @Mass_01775 ) = 1;

    Siehe ST_Intersects-Methode für den ST_Geometry-Datentyp.

  3. 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;
  4. 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. In dieser praktischen Einführung erhalten Sie später Informationen zur Projektion.

  5. 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, GROUPO.SpatialContacts c
    WHERE c.PostalCode = z.ZIP
      AND dist <= 100
    ORDER BY dist;
  6. 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, GROUPO.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;

Ergebnisse

Die Abfragen werden auf die räumlichen Daten durchgeführt.

Nächste Schritte

Gehen Sie weiter zu Lektion 5: Ausgabe von räumlichen Daten in SVG .

 Siehe auch