Mehr

So erhalten Sie die LineStrings von einem MultiLineString

So erhalten Sie die LineStrings von einem MultiLineString


Ich habe mich gefragt, ob ich die LineStrings aus einem MultiLinestring-Objekt extrahieren kann. Was ich wirklich versuche, ist, in einen MultiLineString zu schauen und zu sehen, ob ich einen bestimmten LineString habe. Ich habe überall gesucht, und die einzige Methode, die so klingt, als könnte sie so etwas tun, ist enthält(Geometrie g) aber das macht es nicht.


Ja, verwenden Sie ST_GeometryN

z.B,

select st_astext(st_geometryn(st_geomfromtext( 'MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'),1));

ergibt

LINESTRING(10 10,20 20,10 40).

Beachten Sie, dass die Indizierung auf 1 basiert.

Sie könnten auch jeden durchlaufen und auf Gleichheit testen, indem Sie generate_series verwenden, um die Indizes zu erstellen, z.

select st_equals(st_geometryn(g.geom, x), st_geomfromtext('LINESTRING(40 40, 30 30, 40 20, 30 10)')) from (select st_geomfromtext('MULTILINESTRING ((10 10, 20 20, 10 40) , (40 40, 30 30, 40 20, 30 10))') as geom ) g, create_series(1,2) x;

gibt f, t zurück.

Sie würden wahrscheinlich ST_NumGeometries(geom) anstelle von 2 in generate_series verwenden wollen, aber Sie haben die Idee.


Nun, eigentlich ist es ganz einfach, einfach verwenden.getGeometryN()

Einige Beispiele:

GeometryJSON gjson = new GeometryJSON(); Reader fileReader = new FileReader(''); MultiLineString mls = gjson.readMultiLine( fileReader ); LineString ls = mls.getGeometryN(1)); // Gibt Ihnen den ersten Zeilenstring


Warum gibt ST_Intersection von Postgis Multilinestring für sich selbst schneidende Linestrings zurück?

Ich versuche auf PostgreSQL mit der Erweiterung Postgis, die Geometrie eines gps_trace zu erhalten, der eine Box schneidet, dann möchte ich eine Linienfolge für jeden einzelnen Teil der Spur in der Box erhalten. Im folgenden Beispiel mit 1 trace und 1 box würde das bedeuten, dass ST_intersection mir einen Multilinestring mit 2 Linestrings darin zurückgibt, sodass ich jeden von ihnen mit ST_Dump() extrahieren kann

Die Geometrien sind in epsg 4326, ich verwende die Anfrage SELECT ST_Intersection(gps_traces.geom, grid.box) FROM gps_traces, grid

Aber als Ergebnis erhalte ich einen Multilestring mit 34 Geometrien im Inneren. Nachdem ich ein wenig gezoomt hatte, entdeckte ich, dass, wenn sich die Linie selbst schneidet, jedes Teil als separate Linienfolge betrachtet und registriert wird, obwohl die Spur am Anfang eine Linienfolge in einem Zug war.

Ich bin sehr überrascht von diesem Verhalten und habe keine Dokumentation zu diesem Thema oder Themen gefunden, die darüber gesprochen haben, also frage ich hier, wie die Geometrie aus einer Schnittmenge erstellt wird und warum ich dieses Verhalten bekomme?

Dies ist das erste Mal, dass ich Stackoverflow verwende, also entschuldige ich mich, wenn einige Elemente fehlen


Es besteht die Möglichkeit, dass Ihr Unternehmen umfassendere Erkenntnisse aus seinen Daten benötigt oder benötigt. Wird geladen. Advanced Analytics ist der Schlüssel zu diesen Erkenntnissen. Aus diesem Grund haben wir auf der Tableau Conference 2019 eine technische Deep-Dive-Sitzung durchgeführt, um Ihnen die Grundlagen zu zeigen.

Wir haben uns entschieden, Geodaten als Einstiegspunkt zu verwenden, und da viele von uns so viel Zeit in Taxis verbringen, konzentrierte sich die Analyse auf Uber und Taxiabholungen in NYC. In diesem Blog erfahren Sie, wie Sie selbst damit beginnen und Geodatenanalysen in Exasol ausführen können.

Was sind Geodaten?

Geodaten auf hoher Ebene sind Informationen, die geografische Merkmale, Standorte und Grenzen auf der Erde identifizieren. Sie können geografische Informationen speichern und analysieren, indem Sie Geodaten in Exasol verwenden. Also, wo fängt man an?

So richten Sie Exasol ein

Punkte, LineStrings und Flächen wie Polygone werden durch Koordinaten definiert und als GEOMETERY-Objekte gespeichert.

Diese GEOMETRIE-Säulen können ein räumliches Bezugssystem aufweisen, das ein universelles Mittel zum Definieren realer Standorte ist. Zum Beispiel das Kugelkoordinatensystem, das der Standard des US-Verteidigungsministeriums für Geoinformationen ist, oder das Mercator-Koordinatensystem, das von Google Maps verwendet wird. Das Diagramm unten zeigt, dass sich unter dem GEOMETRIE-Baum zahlreiche Objekte befinden, von Punkten, Linienzügen bis hin zu Polygonen und mehr.

In Exasol liefern wir die Datenbank mit nativer Unterstützung für diese Geometrieobjekte und einer breiten Palette von Funktionen, die es uns ermöglichen, Operationen und Berechnungen an diesen Geodatenobjekten auszuführen. Einige dieser Funktionen sind in der folgenden Tabelle hervorgehoben und Sie finden detailliertere Informationen auf unserer Dokumentationsseite.

Allgemeine Funktionen
ST_CONTAINS(g,g)Definiert, ob das erste Objekt das zweite vollständig enthält
ST_DISTANCE(g,g)Minimaler Abstand zwischen zwei Geodatenobjekten
ST_INTERSECTS(g,g)Definiert, ob ein Schnittpunkt zweier Geodatenobjekte existiert
ST_OVERLAPS(g,g)Definiert, ob sich zwei Geodatenobjekte überlappen.

Um dies in die Praxis umzusetzen, können wir uns ansehen, wie wir Geospatial-Funktionen in Exasol verwenden, um mehr über Uber- und Taxifahrten zu erfahren. Dazu haben wir einige Hauptdatensätze ausgewählt. Eine für Uber-Abholungen in NYC und eine für Taxi-Abholungen dort.

Wir verfügen über raumbezogene Objekte, die Burroughs, Nachbarschaften und Straßen in der Gegend von NY definieren, und wir können raumbezogene Funktionen verwenden, um diese Daten zu analysieren und zu visualisieren. Gehen wir also den Prozess durch.

Schritt 1

Speichern Sie Geodaten im Typ GEOMETRY. Dies kann sein: POINT, LINESTRING, LINEARRING, POLYGON, MULTIPOLYGON, GEOMETRYCOLLECTION, MULTILINESTRING, MULTIPOINT.

Schritt 2

Verwenden Sie etablierte räumliche Bezugssysteme (SRID), um Geometrien zu transformieren.

Räumliche Referenzsysteme werden in EXA_SPATIAL_REF_SYS definiert und bestehen aus einer SRID sowie Projektionsparametern, die von der proj4-Bibliothek verwendet werden, um zwischen Systemen zu transformieren.

GPS-Koordinaten sind z.B. gespeichert im Koordinatenformat WGS84, das durch SRID 4326 definiert ist. Um Koordinaten auf Karten zu verwenden oder Entfernungen in Metern zu berechnen, wurde SRID 3857 für die (Google) Mercator-Projektion verwendet.

Um zwischen Systemen zu transformieren, verwenden Sie ST_TRANSFORM.

Schritt 3

Verwenden Sie bekannte Geodatenfunktionen, um Geodatenobjekte abzurufen, zu manipulieren, zu messen, zu testen und zu vergleichen.

  • Für eine detaillierte Beschreibung der räumlichen Funktionen siehe Abschnitt 2.4.2. in der Bedienungsanleitung
  • Abrufen:
    • ST_X, ST_Y, ST_ENDPOINT, ST_POINTN, ST_CENTROID,…
    • ST_UNION, ST_TRANSFORM, ST_SETSRID,…
    • ST_AREA, ST_LENGTH, ST_NUMPOINTS, …
    • ST_ISRING, ST_ISSIMPLE, ST_ISEMPTY,…
    • ST_DISTANCE, ST_CROSSES, ST_TOUCHES, ST_DISJOINT,…

    Schritt 4

    Geo-Indizes für schnelle Berechnungen erstellen: R-Baum mit Version 6.1 für folgende Funktionen: ST_CONTAINS, ST_CROSSES, ST_EQUALS, ST_INTERSECTS, ST_OVERLAPS, ST_TOUCHES, ST_WITHIN.

    R-Bäume speichern Minimal Bounding Rectangles (MBR) um Geometrien und bauen eine Hierarchie aus diesen auf. Operationen wie die oben genannten können an diesen Verallgemeinerungen arbeiten und eine einfache Bereinigung durchführen (im besten Fall direkt unter dem Wurzelknoten), um kostspielige Geometrie-zu-Geometrie-Vergleiche zu vermeiden.

    Bekannte Standards: Benennung, Parameter und Funktionalität von Geo-Spatial Features folgt der Spezifikation des Open Geospatial Consortium (OGC)  Simple Feature Access Part 2: SQL Option
    http://www.opengeospatial.org/standards/sfs

    Jetzt sehen Sie, wie schnell Sie mit Exasol neue Erkenntnisse aus Geodaten gewinnen können, hier können Sie es selbst ausprobieren. Wir werden auch ein vollständiges Webinar durchführen, um Sie ausführlicher durch diese Demo zu führen – wenn Sie mehr über das Laden erfahren möchten. Advanced Analytics und stellen Sie uns Ihre Fragen, sichern Sie sich Ihren Platz, indem Sie sich hier registrieren.


    GeoJSON

    GeoJSON ist ein neueres Format zum Kodieren einer Vielzahl von geografischen Datenstrukturen mit dem JavaSkrippe ÖObjekt Neinotation (JSON)-Dateiformat. JSON-formatierte Daten werden häufig in der Webentwicklung und in Webdiensten verwendet. Wir werden es genauer untersuchen, wenn wir Daten aus dem Web sammeln. Ein Beispiel für eine GeoJSON-Datei ist unten:

    GeoJSON-Dateien sind reine Textdateien und können viele verschiedene Arten von geometrischen Features enthalten.


    Räumliche Analysemethoden¶

    Neben booleschen Attributen und Methoden bietet Shapely Analysemethoden, die neue geometrische Objekte zurückgeben.

    Mengentheoretische Methoden¶

    Fast jede binäre Prädikatsmethode hat ein Gegenstück, das ein neues geometrisches Objekt zurückgibt. Außerdem steht die mengentheoretische Grenze eines Objekts als schreibgeschütztes Attribut zur Verfügung.

    Diese Methoden geben immer ein geometrisches Objekt zurück. Ein Schnittpunkt von disjunkten Geometrien gibt beispielsweise eine leere GeometryCollection zurück, nicht None oder False. Um auf ein nicht leeres Ergebnis zu testen, verwenden Sie die is_empty-Eigenschaft der Geometrie.

    Gibt ein Objekt mit niedrigerer Dimension zurück, das die mengentheoretische Grenze des Objekts darstellt.

    Die Grenze eines Polygons ist eine Linie, die Grenze einer Linie ist eine Ansammlung von Punkten. Die Grenze eines Punktes ist eine leere (null) Sammlung.

    Siehe die Abbildungen in LineStrings und Collections of Lines zur Veranschaulichung von Linien und ihren Grenzen.

    Gibt eine Darstellung des geometrischen Schwerpunkts (Punkt) des Objekts zurück.

    Der Schwerpunkt eines Objekts kann einer seiner Punkte sein, dies kann jedoch nicht garantiert werden.

    Gibt eine Darstellung der Punkte zurück, aus denen dieses geometrische Objekt besteht, die nicht das bilden andere Objekt.

    Die Methode buffer() wird verwendet, um annähernd kreisförmige Polygone zu erzeugen. In den Beispielen dieses Abschnitts wird sie später in diesem Handbuch ausführlich erklärt.

    Abbildung 8. Unterschiede zwischen zwei annähernd kreisförmigen Polygonen.

    Shapely kann den Unterschied zwischen einem Objekt und einem Objekt mit niedrigeren Dimensionen (z. B. den Unterschied zwischen einem Polygon und einer Linie oder einem Punkt) nicht als einzelnes Objekt darstellen, und in diesen Fällen gibt die Differenzmethode eine Kopie des Objekts namens self zurück.

    Gibt eine Darstellung der Schnittmenge dieses Objekts mit dem anderen geometrischen Objekt zurück.

    Siehe die Abbildung unter symmetric_difference() unten.

    Objekt. symmetrische_differenz ( andere ) ¶

    Gibt eine Darstellung der Punkte in diesem Objekt nicht in dem anderen geometrischen Objekt und der Punkte in dem anderen nicht in diesem geometrischen Objekt zurück.

    Gibt eine Darstellung der Vereinigung von Punkten aus diesem Objekt und dem anderen geometrischen Objekt zurück.

    Der Typ des zurückgegebenen Objekts hängt von der Beziehung zwischen den Operanden ab. Die Vereinigung von Polygonen (zum Beispiel) ist ein Polygon oder ein Multi-Polygon, je nachdem, ob sie sich schneiden oder nicht.

    Die Semantik dieser Operationen variiert je nach Art des geometrischen Objekts. Vergleichen Sie beispielsweise die Grenze der Vereinigung von Polygonen mit der Vereinigung ihrer Grenzen.

    union() ist eine teure Methode, um die kumulative Vereinigung vieler Objekte zu finden. Eine effektivere Methode finden Sie unter shapely.ops.unary_union().

    Mehrere dieser mengentheoretischen Methoden können mit überladenen Operatoren aufgerufen werden:

    Kreuzung kann mit und erreicht werden, &

    Auf union kann mit oder zugegriffen werden, |

    Differenz kann mit Minus abgerufen werden,-

    symmetric_difference kann mit xor, ^ . aufgerufen werden

    Konstruktive Methoden¶

    Formschöne geometrische Objekte haben mehrere Methoden, die neue Objekte liefern, die nicht aus der mengentheoretischen Analyse abgeleitet wurden.

    Objekt. Puffer ( Entfernung , Auflösung = 16 , cap_style = 1 , join_style = 1 , mitre_limit = 5.0 ) ¶

    Gibt eine ungefähre Darstellung aller Punkte innerhalb einer bestimmten Entfernung von diesem geometrischen Objekt zurück.


    Eine GeoJSON FeatureCollection enthält mehrere Feature-Objekte, von denen jedes eine bestimmte Geometrie hat, die es mit der Karte verbindet. Eine einzelne FeatureCollection kann Millionen von Feature-Objekten enthalten, die über die ganze Welt verteilt sind. Wenn die FeatureCollection sehr groß ist oder die Feature-Objekte über ein großes geografisches Gebiet verteilt sind, möchten Sie die FeatureCollection möglicherweise in mehrere FeatureCollection-Objekte aufteilen, die jeweils in einer eigenen HERE-Kachelpartition gespeichert sind.

    Die Entscheidung, wann eine große FeatureCollection aufgeteilt werden soll, hängt davon ab, was Sie mit den Daten machen möchten und wie komplex einzelne Feature-Objekte sind. Einige Aufgaben können mit Millionen von Funktionen pro Kachel ausgeführt werden, während andere selbst mit Tausenden von Funktionen langsam sein können. Als allgemeine Regel für die Visualisierung von Daten sollte eine Partition weniger als 20.000 Features haben, oder weniger als 5.000, wenn es sich um Marker (Punkt-Features ohne Radius) handelt.

    Eine Möglichkeit zum Aufteilen einer großen FeatureCollection in mehrere FeatureCollection-Objekte basiert auf dem Mittelpunkt (Schwerpunkt) jedes Features. Dazu iterieren Sie über die FeatureCollection und berechnen den Schwerpunkt jedes Features. Dann ordnen Sie jeden Schwerpunkt der HERE-Kachel zu, die diesen Punkt überlappt. Am Ende werden alle Feature-Objekte einer HERE-Kachel zugeordnet. Jede resultierende HERE-Kachel enthält eine einzelne FeatureCollection, die wiederum alle Features enthält, deren Schwerpunkt diese bestimmte HERE-Kachel überlappt. Auf diese Weise werden aus einer großen FeatureCollection mehrere FeatureCollection-Objekte, die parallel verarbeitet werden können.

    Sie können eine große FeatureCollection auch basierend auf der ersten Koordinate der Feature-Geometrie anstelle des Schwerpunkts teilen.


    Raumkonzepte

    Räumliche Daten werden üblicherweise in Form von Layern, Features und Geometrie beschrieben. Im Kontext einer relationalen Datenbank entspricht ein Layer einer Tabelle in der Datenbank, ein Feature einem Datensatz in der Tabelle und die Geometrie einem Feld im Datensatz mit einem räumlichen Datentyp. In ähnlicher Weise wie ein Feld mit dem Datentyp Integer oder Text (z. B.) definiert werden kann, erlauben räumliche Datenbanken, dass das Feld einen Geometrie- (oder Geografie-)Datentyp hat. Da Integer- oder String-Datentypen bestimmte Operationen unterstützen (z. B. Addition oder Verkettung), haben räumliche Datentypen ihre eigene Suite von Operationen (z. B. Puffer und Schnittmenge, um nur zwei von vielen zu nennen).

    Geodaten-Features werden in bestimmten Geometrietypen wie Punkt, Linie oder Polygon definiert. Einige Systeme erlauben das Mischen verschiedener Geometrietypen in einer Schicht (oder Tabelle), aber viele tun dies nicht. Dies ist ein wichtiger Aspekt beim Entwerfen eines Systems. Eine vollständige Liste der verschiedenen Geometrietypen ist in Tabelle 1 unten aufgeführt.

    Räumliche Datenbanken oder Dateitypen sind so konzipiert, dass sie nahtlos mit GISs arbeiten und jegliche Komplexität der Implementierung vor dem Benutzer verbergen. Obwohl im Folgenden einige Details zu räumlichen Datentypen behandelt werden, ist es für die Verwendung eines GIS nicht erforderlich, die Details der Implementierung zu verstehen.


    So erhalten Sie die LineStrings von einem MultiLineString - Geographische Informationssysteme

    Autor: Sean Gillies, [email protected]>
    Ausführung: 1.7.0
    Datum: |heute|
    Urheberrechte ©: Dieses Werk ist lizenziert unter einer Creative Commons Attribution 3.0 United States License.
    Abstrakt:In diesem Dokument wird erläutert, wie Sie das Shapely Python-Paket für die Berechnungsgeometrie verwenden.

    Die deterministische Raumanalyse ist ein wichtiger Bestandteil computergestützter Ansätze zu Problemen in der Landwirtschaft, Ökologie, Epidemiologie, Soziologie und vielen anderen Bereichen. Wie ist das Verhältnis von Umfang/Fläche dieser Tierlebensräume? Welche Grundstücke in dieser Stadt überschneiden sich mit der 50-jährigen Hochwasserkontur aus diesem neuen Hochwassermodell? Wie groß sind Fundstellen für antike Keramik mit Herstellerzeichen „A“ und „B“ und wo überschneiden sich die Ausdehnungen? Was ist der Weg von zu Hause ins Büro, der identifizierte Spam-Zonen am besten umgeht? Dies sind nur einige der möglichen Fragen, die mit der nicht-statistischen Raumanalyse und insbesondere der Computergeometrie beantwortet werden können.

    Shapely ist ein Python-Paket für die mengentheoretische Analyse und Manipulation von planaren Features mit (über Pythons :mod:`ctypes`-Modul) Funktionen aus der bekannten und weit verbreiteten GEOS-Bibliothek. GEOS, eine Portierung der Java Topology Suite (JTS), ist die Geometrie-Engine der räumlichen PostGIS-Erweiterung für das PostgreSQL-RDBMS. Die Designs von JTS und GEOS orientieren sich weitgehend an der Simple Features Access Specification [1] des Open Geospatial Consortiums und Shapely hält sich hauptsächlich an die gleichen Standardklassen und -operationen. Shapely ist dabei tief in den Konventionen der Welt der Geoinformationssysteme (GIS) verwurzelt, strebt jedoch danach, Programmierern, die an nicht-konventionellen Problemen arbeiten, gleichermaßen nützlich zu sein.

    Die erste Prämisse von Shapely ist, dass Python-Programmierer in der Lage sein sollten, Geometrieoperationen vom Typ PostGIS außerhalb eines RDBMS durchzuführen. Nicht alle geografischen Daten stammen oder befinden sich in einem RDBMS oder werden am besten mit SQL verarbeitet. Wir können Daten in ein räumliches RDBMS laden, um Arbeit zu erledigen, aber wenn es kein Mandat gibt, die Daten im Laufe der Zeit in der Datenbank zu verwalten (das "M" in "RDBMS"), verwenden wir das falsche Werkzeug für den Job. Die zweite Prämisse ist, dass die Persistenz, Serialisierung und Kartenprojektion von Features signifikante, aber orthogonale Probleme sind. Sie brauchen vielleicht nicht hundert GIS-Format-Reader und -Schreiber oder die Vielzahl von State-Plane-Projektionen, und Shapely belastet Sie nicht damit. Die dritte Prämisse ist, dass Python-Idiome GIS (oder Java, in diesem Fall, da die GEOS-Bibliothek von JTS, einem Java-Projekt, abgeleitet ist) übertrumpfen Idiome.

    Wenn Sie Spaß an idiomatischem Python haben und davon profitieren, Pakete schätzen, die eine Sache gut machen, und sich einig sind, dass ein räumlich aktiviertes RDBMS oft genug das falsche Werkzeug für Ihre Berechnungsgeometrieaufgabe ist, könnte Shapely das Richtige für Sie sein.

    Die grundlegenden Arten von geometrischen Objekten, die von Shapely implementiert werden, sind Punkte, Kurven und Flächen. Jeder ist mit drei Sätzen von (möglicherweise unendlichen) Punkten in der Ebene verbunden. Die inneren, Rand- und äußeren Mengen eines Merkmals schließen sich gegenseitig aus und ihre Vereinigung fällt mit der gesamten Ebene zusammen [2].

    • Ein Punkt hat eine innere Menge von genau einem Punkt, eine Randmenge von genau keinen Punkten und eine äußere Menge aller anderen Punkte. Ein Punkt hat eine topologische Dimension von 0.
    • Eine Kurve hat einen inneren Satz, der aus unendlich vielen Punkten entlang seiner Länge besteht (stellen Sie sich einen im Raum gezogenen Punkt vor), einen Begrenzungssatz, der aus seinen beiden Endpunkten besteht, und einen äußeren Satz aller anderen Punkte. Eine Kurve hat eine topologische Dimension von 1.
    • Eine Fläche hat einen inneren Satz, der aus unendlich vielen Punkten besteht (stellen Sie sich eine Kurve vor, die in den Raum gezogen wird, um eine Fläche abzudecken), einen Begrenzungssatz, der aus einer oder mehreren Kurven besteht, und einen äußeren Satz aller anderen Punkte, einschließlich derer innerhalb von Löchern, die möglicherweise in der Oberfläche existieren. Eine Fläche hat eine topologische Dimension von 2.

    Das mag ein wenig esoterisch erscheinen, hilft aber dabei, die Bedeutung von Shapelys räumlichen Prädikaten zu verdeutlichen, und es ist so tief in die Theorie, wie dieses Handbuch gehen wird. Konsequenzen der Point-Set-Theorie, darunter auch einige, die sich als "Gotchas" manifestieren, für verschiedene Klassen werden später in diesem Handbuch besprochen.

    Der Punkttyp wird durch eine Point-Klassenkurve durch die LineString- und LinearRing-Klassen und die Oberfläche durch eine Polygon-Klasse implementiert. Shapely implementiert keine glatten (d. h. mit stetigen Tangenten versehenen) Kurven. Alle Kurven müssen durch lineare Splines angenähert werden. Alle abgerundeten Patches müssen durch Bereiche angenähert werden, die durch lineare Splines begrenzt sind.

    Punktsammlungen werden von einer MultiPoint-Klasse, Kurvensammlungen von einer MultiLineString-Klasse und Sammlungen von Oberflächen von einer MultiPolygon-Klasse implementiert. Diese Sammlungen sind rechentechnisch nicht signifikant, aber nützlich für die Modellierung bestimmter Arten von Features. Ein Y-förmiges Linien-Feature wird beispielsweise als Ganzes durch einen MultiLineString gut modelliert.

    Das Standarddatenmodell weist zusätzliche Einschränkungen auf, die für bestimmte Arten von geometrischen Objekten spezifisch sind, die in den folgenden Abschnitten dieses Handbuchs erläutert werden.

    Das räumliche Datenmodell wird begleitet von einer Gruppe natürlichsprachlicher Beziehungen zwischen geometrischen Objekten – enthält, schneidet, überlappt, berührt usw. – und einen theoretischen Rahmen, um sie unter Verwendung der 3x3-Matrix der gegenseitigen Schnittpunkte ihrer Komponentenpunktmengen zu verstehen [3 ]: das DE-9IM. Eine umfassende Übersicht über die Zusammenhänge in Bezug auf das DE-9IM findet sich in [4] und wird in diesem Handbuch nicht wiederholt.

    In Anlehnung an die technischen Spezifikationen von JTS [5] wird in diesem Handbuch zwischen konstruktiven (Puffer, konvexe Hülle) und mengentheoretischen Operationen (Schnittpunkt, Vereinigung usw.) unterschieden. Die einzelnen Operationen werden in einem folgenden Abschnitt des Handbuchs ausführlich beschrieben.

    Auch wenn die Erde nicht flach ist – und auch nicht genau kugelförmig – gibt es viele analytische Probleme, die durch Transformation von Erdmerkmalen in eine kartesische Ebene, Anwendung bewährter Algorithmen und anschließender Rücktransformation der Ergebnisse in geografische Koordinaten angegangen werden können. Diese Praxis ist so alt wie die Tradition akkurater Papierkarten.

    Shapely unterstützt keine Koordinatensystemtransformationen. Alle Operationen an zwei oder mehr Features setzen voraus, dass die Features in derselben kartesischen Ebene vorhanden sind.

    Geometrische Objekte werden in typischer Python-Manier erstellt, wobei die Klassen selbst als Instanzfabriken verwendet werden. Einige ihrer intrinsischen Eigenschaften werden in diesen Abschnitten besprochen, andere in den folgenden Abschnitten zu Operationen und Serialisierungen.

    Instanzen von Point , LineString und LinearRing haben als wichtigstes Attribut eine endliche Folge von Koordinaten, die ihre inneren, Begrenzungs- und äußeren Punktmengen bestimmt. Ein Linienzug kann durch nur 2 Punkte bestimmt werden, enthält aber unendlich viele Punkte. Koordinatenfolgen sind unveränderlich. Ein dritter Z-Koordinatenwert kann beim Konstruieren von Exemplaren verwendet werden, hat jedoch keine Auswirkungen auf die geometrische Analyse. Alle Operationen werden in der x-y-Ebene ausgeführt.

    In allen Konstruktoren werden numerische Werte in den Typ float konvertiert. Mit anderen Worten, Point(0, 0) und Point(0.0, 0.0) erzeugen geometrisch äquivalente Instanzen. Shapely überprüft nicht die topologische Einfachheit oder Gültigkeit von Instanzen, wenn sie konstruiert werden, da die Kosten in den meisten Fällen ungerechtfertigt sind. Die Validierung von Factories kann von Benutzern, die sie benötigen, einfach mit dem Prädikat :attr:is_valid implementiert werden.

    Shapely ist eine planare Geometriebibliothek und z, die Höhe über oder unter der Ebene, wird in der geometrischen Analyse ignoriert. Für Anwender besteht hier ein potenzieller Fallstrick: Koordinatentupel, die sich nur in z unterscheiden, werden nicht voneinander unterschieden und ihre Anwendung kann zu überraschend ungültigen Geometrieobjekten führen. LineString([(0, 0, 0), (0, 0, 1)]) gibt beispielsweise keine vertikale Linie mit Einheitslänge zurück, sondern eine ungültige Linie in der Ebene mit der Länge Null. Ebenso ist Polygon([(0, 0, 0), (0, 0, 1), (1, 1, 1)]) nicht durch einen geschlossenen Ring begrenzt und ungültig.


    Wie man 2 Graph-Netzwerke mit OSMnx/NetworkX abgleicht

    Ich habe einen GeopandasDataFrame mit MULTILINESTRING-Geometrieobjekten, die ich über eine API für eine kleine Stadt abgerufen habe. In den Dokumenten der API heißt es, dass sie OpenStreetMap (OSM) für den geodatenbezogenen Teil ihres DataFrame verwenden.

    Ich versuche, GeopandasDataFrame in ein Diagramm zu konvertieren, indem ich die gdf_to_nx-Funktion des momepy-Moduls verwende. Die Funktion akzeptiert nur Geometrien, die nicht aus mehreren Teilen bestehen. Daher musste ich zuerst MULTILINESTRING-Geometrieobjekte in LINESTRINGS aufteilen, bevor ich sie in Diagramme umwandelte. Das resultierende Diagramm enthält Knoten, die Koordinaten ohne Knoten-IDs enthalten. Das gilt auch für die Kanten. Einer der Nachteile dieses Diagramms ist nicht vollständig verbunden, da die abgerufenen Daten spärlich sind.

    Um den Graphen, den ich habe, zu verbessern, habe ich beschlossen, alle Straßennetze derselben Stadt mit der Funktion graph_from_place des OSMnx-Moduls abzurufen. Da ich weiß, dass beide Daten primär über OSM geholt werden. Irgendwie müssen sie aber irgendwann zusammenpassen. Diese Funktion gibt einen Graphen mit Knoten und Kanten zurück, die von osmid benannt sind.

    Meine Frage ist, wie kann ich den ersteren Graphen in den letzteren integrieren, damit ich die Attribute des ersteren in den letzteren übertragen kann?

    Meine Intuition sagt, dass ich Punktkoordinaten verwenden muss, was die einzig mögliche Gemeinsamkeit zwischen Graphen ist, aber ihre Dezimalgenauigkeit ist nicht gleich.

    Meine zweite Frage wäre, ob ich eine Graphdatenbank benötige, um das zu tun, was ich tun wollte, anstatt Python und die erwähnten Module zu verwenden.


    Geo-Eigenschaften

    OData unterstützt Geodatentypen als neue Gruppe von Primitiven. Sie können wie alle anderen Primitive verwendet werden – in URLs als Literale, als Typen und Werte für Eigenschaften, projiziert in $select usw. Wie bei anderen Primitiven gibt es eine Reihe von kanonischen Funktionen, die mit ihnen verwendet werden können.

    Die einzige Einschränkung gegenüber anderen Primitiven besteht darin, dass Geodatentypen nicht als Entitätsschlüssel oder in ETags verwendet werden dürfen (siehe unten).

    Der Rest dieses Eintrags geht detaillierter auf das von uns unterstützte Geodatentypsystem ein, wie Geodatentypen in $metadata dargestellt werden, wie ihre Werte in Atom- und JSON-Payloads dargestellt werden, wie sie in URLs dargestellt werden und was kanonische Funktionen sind für sie definiert.

    Modellieren

    Primitive Typen

    Unser Schriftsystem ist fest im Geometrie-Schreibsystem OGC Simple Features (OGC SF) verwurzelt. Wir weichen nur in dreierlei Hinsicht von ihrem Typensystem ab.


    Abbildung 1: Die OGC-Typhierarchie für einfache Funktionen

    Zuerst stellen wir eine Teilmenge des Typsystems und eine Teilmenge der Operationen bereit. Einzelheiten finden Sie in den folgenden Abschnitten.

    Zweitens ist das OGC-Typsystem nur für 2-dimensionale Geodaten definiert. Wir erweitern die Definition einer Position, um eine größere Anzahl von Dimensionen verarbeiten zu können. Insbesondere verarbeiten wir 2D-, 3dz-, 3dm- und 4D-Geodaten. Weitere Informationen finden Sie im Abschnitt über Koordinatenreferenzsysteme (CRS).

    Drittens ist das System vom Typ OGC für Geodaten der flachen Erde (im Folgenden als geometrische Daten bezeichnet) ausgelegt. OGC definiert kein System, das Erdrunden-Geodaten (sogenannte geografische Daten) verarbeitet. Daher duplizieren wir das OGC-Typsystem, um einen parallelen Satz von Typen für geografische Daten zu erstellen. Wir beziehen uns darauf, ob ein Typ geographisch oder geometrisch ist als seine Topologie.

    Einige geringfügige Änderungen in der Darstellung sind erforderlich, da sich geografische Daten in einer begrenzten Oberfläche (dem Ellipsoid) befinden, während sich geometrische Daten in einer unendlichen Oberfläche (der Ebene) befinden. Dies zeigt sich beispielsweise in der Definition eines Polygons. Wir nehmen so wenig Änderungen wie möglich vor, siehe unten für Details. Auch bei Änderungen orientieren wir uns nach Möglichkeit am Stand der Technik.

    Koordinatenreferenzsysteme

    Obwohl wir viele Koordinatenreferenzsysteme (CRS) unterstützen, gibt es einige Einschränkungen (im Vergleich zum OGC-Standard):

    • Wir unterstützen nur CRS, die von einer SRID bezeichnet werden. Dies sollte ein offizielles SRID sein, wie es von der EPSG (European Petroleum Survey Group) standardisiert wurde. Insbesondere unterstützen wir keine benutzerdefinierten CRS, die in den Metadaten definiert sind, wie dies bei GML der Fall ist.
      • Daher werden einige Daten nicht ausdrückbar sein. Zum Beispiel gibt es hydrodynamische Messwerte, die in einem Koordinatensystem dargestellt werden, in dem jeder Punkt Koordinaten hat [Breite, Länge, Tiefe, Zeit, Druck, Temperatur]. Dadurch können sie alle möglichen coolen Analysen durchführen (z. B. räumliche Abfragen über eine Oberfläche, die in Bezug auf die Temperatur- und Zeitachsen definiert ist), aber das geht über den Umfang von OData hinaus.
      • Es gibt auch einige Standardkoordinatensysteme, die keine von EPSG standardisierten Codes haben. Wir konnten diese also nicht vertreten. Beispiel: Einige gängige Systeme in Neuseeland und Nordeuropa haben Standards, aber keinen ID-Code.
      • Der CRS ist unter Projektion statisch. Das obige gilt auch zwischen Ergebnissen einer Projektion.
      • Es gibt einen einzelnen "variiert" SRID-Wert. Dadurch kann ein Dienst explizit angeben, dass der CRS von Fall zu Fall variiert. Dies erlaubt immer noch nicht, dass das Koordinatensystem zwischen Unterbereichen einer Form variiert (z. B. den verschiedenen Punkten in einem GeographyMultiPoint).
      • Es gibt clientseitige Bibliotheken, die einige Koordinatentransformationen für Sie durchführen können.
      • Server könnten Koordinatentransformationsfunktionen als Nicht-OGC-Funktionserweiterungen verfügbar machen. Siehe unten für Details.

      Nominell ist die Typunterscheidung Geometrie/Geografie beim CRS überflüssig. Jedes CRS ist von Natur aus entweder runderde oder flacherde. OData löst dies jedoch nicht automatisch. Implementierungen müssen nicht wissen, welches CRS mit welchem ​​Modelltyp übereinstimmt. Der Modellierer muss sowohl den Typ als auch das CRS angeben.

      Es gibt ein nützliches Standard-CRS für Geographie-Daten (Runderde): WGS84 (SRID 4326). Dies ist das Koordinatensystem, das für GPS verwendet wird. Implementierungen verwenden diese Standardeinstellung, wenn keine bereitgestellt wird.

      Das Standard-CRS für Geometriedaten (flache Erde) ist SRID 0. Dies stellt eine beliebige flache Ebene mit einheitenlosen Bemaßungen dar.

      Neue primitive Typen

      Die Punkttypen – Edm.GeographyPoint und Edm.GeometryPoint

      "Punkt" ist gemäß OGC definiert. Grob gesagt besteht es aus einer einzelnen Position in der zugrunde liegenden Topologie und CRS. Edm.GeographyPoint wird für Punkte in der Round-Earth-Topologie (geografisch) verwendet. Edm.GeometryPoint ist ein Punkt in einer flachen (geometrischen) Topologie.

      Diese Grundelemente werden für Eigenschaften mit einem statischen Punkttyp verwendet. Alle Entitäten dieses Typs haben einen Punktwert für diese Eigenschaft.

      Beispiele für Eigenschaften vom Typ Punkt sind der aktuelle Standort eines Benutzers oder der Standort einer Bushaltestelle.

      Die LineString-Typen – Edm.GeographyLineString und Edm.GeometryLineString

      "LineString" ist gemäß OGC definiert. Grob gesagt besteht es aus einem Satz von Positionen mit "linearer" Interpolation zwischen diesen Positionen, alle in derselben Topologie und CRS, und stellt einen Pfad dar. Edm.GeographyLineString wird für geographische LineStrings verwendet. Seine Segmente sind große elliptische Bögen. Edm.GeometryLineString wird für geometrische Koordinaten verwendet und verwendet gewöhnliche lineare Interpolation.

      Diese Grundelemente werden für Eigenschaften mit einem statischen Pfadtyp verwendet. Beispieleigenschaften wären der Pfad für eine Busrouten-Entität oder der Pfad, dem ich heute Morgen beim Joggen gefolgt bin (in einer Run-Entität gespeichert).

      Die Polygon-Typen – Edm.GeographyPolygon und Edm.GeometryPolygon

      "Polygon" ist gemäß OGC definiert. Grob gesagt besteht es aus einem einzigen begrenzten Bereich, der Löcher enthalten kann. Es wird durch eine Reihe von LineStrings dargestellt, die bestimmten Regeln folgen. Diese Regeln unterscheiden sich zwischen geometrischen und geografischen Topologien (siehe unten).

      Diese Grundelemente werden für Eigenschaften mit einem statischen Einzelpolygon-Typ verwendet. Beispiele hierfür sind das Gebiet, das in einem einzigen Zählgebiet eingeschlossen ist, oder das Gebiet, das von einem bestimmten Ausgangspunkt aus über eine bestimmte Zeit mit dem Auto erreicht werden kann.

      Manche Dinge, die man sich als Polygone vorstellt, wie zum Beispiel die Grenzen von Staaten, sind eigentlich keine Polygone. Der Bundesstaat Hawaii umfasst beispielsweise mehrere Inseln, von denen jede ein vollständig begrenztes Polygon ist. Somit kann der Staat als Ganzes nicht als einzelnes Polygon dargestellt werden. Es ist ein Multipolygon.

      Bei Polygonen in geographischen Koordinatensystemen kommen unterschiedliche Darstellungsregeln zum Tragen. Die OGC SF-Definition eines Polygons besagt, dass es aus allen Punkten zwischen einem einzelnen Außenring und einer Reihe von Innenringen besteht. Allerdings ist "äußeres" auf einem Globus nicht genau definiert. Daher müssen wir die Definition leicht ändern.

      OData verwendet dieselbe Definition für Polygon wie SQL Server. Ein Polygon ist die Menge von Punkten "zwischen" einer Menge von Ringen. Genauer gesagt verwenden wir eine Links-Fuß-Wicklungsregel, um zu bestimmen, welcher Bereich sich im Polygon befindet. Wenn Sie jeden Ring in der Reihenfolge der Kontrollpunkte durchqueren, befinden sich alle Punkte links vom Ring im Polygon. Jedes Polygon ist die Menge von Punkten, die sich links von allen Ringen in seiner Begrenzungsmenge befinden.

      Somit ergibt sich der Gesamtsatz der Sonderregeln für die Rand-LineStrings:

      • In jedem Koordinatensystem muss jeder LineString ein Ring sein. Mit anderen Worten, sein Anfang und sein Ende müssen der gleiche Punkt sein.
      • In Edm.GeometryPolygon muss der erste Ring "äußer" und alle anderen "inner" sein. Die inneren Ringe können in beliebiger Reihenfolge zueinander stehen, und jeder Ring kann in beide Richtungen verlaufen.
      • In Edm.GeographyPolygon muss jeder Ring der Links-Fuß-Wicklungsregel folgen. Die Ringe können in beliebiger Reihenfolge zueinander vorliegen.
      Die Union-Typen – Edm.GeographyCollection und Edm.GeometryCollection

      "GeometryCollection" is defined as per the OGC. Roughly, it consists of a union of all points that are contained in a set of disjoint shapes, each of which has the same CRS. Edm.GeographyCollection is used for points in the round-earth (geographic) topology. Edm.GeometryCollection is in a flat-earth (geometric) topology.

      These primitives are used for properties that represent a shape that cannot be defined using any of the other geospatial types. Each value is the represented by unioning together sub-shapes until the right set of positions is represented.

      Example properties that would be of type geography collection are hard to find, but they do show up in advanced geospatial activities, especially as the result of advanced operations.

      The MultiPolygon types—Edm.GeographyMultiPolygon and Edm.GeometryMultiPolygon

      "MultiPolygon" is defined as per the OGC. Roughly, it consists of the shape that is a union of all polygons in a set, each of which has the same CRS and is disjoint from all others in the set. Edm.GeographyMultiPolygon is used for points in the round-earth (geographic) topology. Edm.GeometryMultiPolygon is in a flat-earth (geometric) topology.

      MultiPolygon values are often used for values that seem like polygons at first glance, but have disconnected regions. Polygon can only represent shapes with one part. For example, when representing countries, it seems at first that Polygon would be the appropriate choice. However, some countries have islands, and those islands are fully disconnected from the other parts of the nation. MultiPolygon can represent this, while Polygon cannot.

      MultiPolygon is different from a container of polygons in that it represents a single shape. That shape is described by its sub-regions, but those sub-regions are not actually, themselves, useful values. For example, a set of buildings would be stored as a collection of polygons. Each element in that collection is a building. It has real identity. However, a state is a MultiPolygon. It might contain, for example, a polygon that covers the left two-thirds of the big island in Hawaii. That is just a "bit of a country," which only has meaning when it is unioned with a bunch of other polygons to make Hawaii.

      The MultiLineString types—Edm.GeographyMultiLineString and Edm.GeometryMultiLineString

      "MultiLineString" is defined as per the OGC. Roughly, it consists of the shape that is a union of all line strings in a set, each of which has the same CRS. Edm.GeographyMultiLineString is used for points in the round-earth (geographic) topology. Edm.GeometryMultiLineString is in a flat-earth (geometric) topology.

      MultiLineString values are used for properties that represent the union of a set of simultaneous paths. This is not a sequence of paths—that would be better represented as a collection of line strings. MultiLineString could be used to represent, for example, the positions at which it is unsafe to dig due to gas mains (assuming all the pipes lacked width).

      The MultiPoint types—Edm.GeographyMultiPoint and Edm.GeometryMultiPoint

      "MultiPoint" is defined as per the OGC. Roughly, it consists of the shape that is a union of all points in a set, each of which has the same CRS. Edm.GeographyMultiPoint is used for points in the round-earth (geographic) topology. Edm.GeometryMultiPoint is in a flat-earth (geometric) topology.

      MultiPoint values are used for properties that represent a set of simultaneous positions, without any connected regions. This is not a sequence of positions—that would be better represented as a collection of points. MultiPoint handles the far more rare case when some value can be said to be all of these positions, simultaneously, but cannot be said to be just any one of them. This usually comes up as the result of geospatial operations.

      The base types — Edm.Geography and Edm.Geometry

      The base type represents geospatial data of an undefined type. It might vary per entity. For example, one entity might hold a point, while another holds a multi-linestring. It can hold any of the types in the OGC hierarchy that have the correct topology and CRS.

      Although core OData does not support any functions on the base type, a particular implementation can support operations via extensions (see below). In core OData, you can read & write properties that have the base types, though you cannot usefully filter or order by them.

      The base type is also used for dynamic properties on open types. Because these properties lack metadata, the server cannot state a more specific type. The representation for a dynamic property MUST contain the CRS and topology for that instance, so that the client knows how to use it.

      Therefore, spatial dynamic properties cannot be used in $filter, $orderby, and the like without extensions. The base type does not expose any canonical functions, and spatial dynamic properties are always the base type.

      Edm.Geography represents any value in a geographic topology and given CRS. Edm.Geometry represents any value in a geometric topology and given CRS.

      Each instance of the base type has a specific type that matches an instantiable type from the OGC hierarchy. The representation for an instance makes clear the actual type of that instance.

      Thus, there are no instances of the base type. It is simply a way for the $metadata to state that the actual data can vary per entity, and the client should look there.

      Spatial Properties on Entities

      Zero or more properties in an entity can have a spatial type. The spatial types are regular primitives. All the standard rules apply. In particular, they cannot be shredded under projection. This means that you cannot, for example, use $select to try to pull out the first control position of a LineString as a Point.

      For open types, the dynamic properties will all effectively be of the base type. You can tell the specific type for any given instance, just as for the base type. However, there is no static type info available. This means that dynamic properties need to include the CRS & topology.

      Spatial-Primary Entities (Features)

      This is a non-goal. We do not think we need these as an intrinsic. We believe that we can model this with a pass-through service using vocabularies. If you don't know what the GIS community means by Features, don't worry about it. They're basically a special case of OData's entities.

      Communicating

      Metadata

      We define new types: Edm.Geography, Edm.Geometry, Edm.GeogrpahyPoint, Edm.GeometryPoint, Edm.GeographyPolygon, Edm.GeometryPolygon, Edm.GeographyCollection, Edm.GeometryCollection, Edm.GeographyMultiPoint, Edm.GeometryMultiPoint, Edm.GeographyMultiLineString, Edm.GeometryMultiLineString, Edm.GeographyMultiPolygon, and Edm.GeometryMultiPolygon. Each of them has a facet that is the CRS, called "SRID".

      Entities in Atom

      Entities are represented in Atom using the GML Simple Features Profile, at compliance level 0 (GML SF0). However, a few changes are necessary. This GML profile is designed to transmit spatial-primary entites (features). Thus, it defines an entire document format which consists of shapes with some associated ancillary data (such as a name for the value represented by that shape).

      OData entites are a lot more than just geospatial values. We need to be able to represent a single geospatial value in a larger document. Thus, we use only those parts of GML SF0 that represent the actual geospatial values. This is used within an entity to represent the value of a particular property.

      Entities in JSON

      We will use GeoJSON. Technically, GeoJSON is designed to support the same feature-oriented perspective as is GML SF0. So we are using only the same subset of GeoJSON as we do for GML SF0. We do not allow the use of types "Feature" or "FeatureCollection." Use entities to correlate a geospatial type with metadata.

      Furthermore, "type" SHOULD be ordered first in the GeoJSON object, followed by coordinates, then the optional properties. This allows recipients to more easily distinguish geospatial values from complex type values when, for example, reading a dynamic property on an open type.

      Dynamic Properties

      Geospatial values in dynamic properties are represented exactly as they would be for static properties, with one exception: the CRS is required. The recipient will not be able to examine metadata to find this value, so the value must specify it.

      Geospatial Literals in URIs

      Geospatial URL literals are represented using WKT, with a common extension. There are at least 3 common extensions to WKT (PostGIS, ESRI, and Sql Server). They disagree in many places, but those that allow including an SRID all use the same approach. As such, they all use (approximately) the same representation for values with 2d coordinates. Here are some examples:

      Not usable everywhere

      Geospatial values are neither equality comparable nor partially-ordered. Therefore, the results of these operations would be undefined.

      Furthermore, geospatial types have very long literal representations. This would make it difficult to read a simple URL that navigates along a series of entities with geospatial keys.

      Geospatial primitives MUST NOT be used with any of the logical or arithmetic operators ( lt , eq , not , add , etc).

      Geospatial primitives MUST NOT be used as keys.

      Geospatial primitives MUST NOT be used as part of an entity's ETag.

      Distances

      Some queries, such as the coffee shop search above, need to represent a distance.

      Distance is represented the same in the two topologies, but interpreted differently. In each case, it is represented as a double scalar value. The units are interpreted by the topology and coordinate system for the property with which it is compared or calculated.

      Because a plane is uniform, we can simply define distances in geometric coordinates to be in terms of that coordinate system's units. This works as long as each axis uses the same unit for its coordinates, which is the general case.

      Geographic topologies are not typically uniform, because they use angular measures. The distance between longitude -125 and -124 is not the same at all points on the globe. It goes to 0 at the poles. Thus, the underlying coordinate system measures position well, but does not work for describing a distance.

      For this reason, each geographic CRS also defines a unit that will be used for distances. For most CRSs, this is meters. However, some use US feet, Indian feet, German meters, or other units. In order to determine the meaning of a distance scalar, the developer must read the reference (http://www.epsg-registry.org/) for the CRS involved.

      New Canonical Functions

      Each of these canonical functions is defined on certain geospatial types. Thus, each geospatial primitive type has a set of corresponding canonical functions. An OData implementation that supports a given geospatial primitive type SHOULD support using the corresponding canonical functions in $filter. It MAY support using the corresponding canonical functions in $orderby.

      The canonical functions are named just like Simple Features-compliant extension methods. This means that individual server extensions for standard OGC functions feel like core OData. This works as long as we explicitly state (or reference) the set of functions allowed in geo.

      Currently, these canonical functions are defined in two dimensions, as that is all that is standardized in OGC SF. Each function is calculated by first projecting the points to 2D (dropping the Z & M coordinates).

      Geo.distance

      Geo.distance is a canonical function defined between points. It returns a distance, as defined above. The two arguments must use the same topology & CRS. The distance is measured in that topology. Geo.distance is one of the corresponding functions for points. Geo.distance is defined as equivalent to the OGC SF Distance method for their overlapping domain, with equivalent semantics for geographical points.

      Geo.intersects

      Geo.intersects identifies whether a point is contained within the enclosed space of a polygon. Both arguments must be of the same topology & CRS. It returns a Boolean value. Geo.intersects is a canonical function for any implementation that includes both points and polygons. Geo.intersects is equivalent to OGC SF's Intersects in their area of overlap, extended with the same semantics for geographic data.

      Geo.length

      Geo.length returns the total path length of a linestring. It returns a distance, as defined above. Geo.length is a corresponding function for linestrings. Geo.length is equivalent to the OGC SF Length operation for geometric linestrings, and is extended with equivalent semantics to geographic data.

      All other OGC functions

      OData does not require these, because we want to make it easier to stand up a server that is not backed by a database. Some are very hard to implement, especially in geographic coordinates.

      A provider that is capable of handling OGC SF functions MAY expose those as Functions on the appropriate geospatial primitives (using the new Function support).

      We are reserving a namespace, " geo ," for these standard functions. If the function matches a function specified in Simple Features, you SHOULD place it in this namespace. If the function does not meet the OGC spec, you MUST NOT place it in this namespace. Future versions of the OData spec may define more canonical functions in this namespace. The namespace is reserved to allow exactly these types of extensions without breaking existing implementations.

      In the SQL version of the Simple Features standard, the function names all start with ST_ as a way to provide namespacing. Because OData has real namespaces, it does not need this pseudo-namespace. Thus, the name SHOULD NOT include the ST_ when placed in the geo namespace. Similarly, the name SHOULD be translated to lowercase, to match other canonical functions in OData. For example, OGC SF for SQL's ST_Buffer would be exposed in OData as geo.buffer . This is similar to the Simple Features implementation on CORBA.

      All other geospatial functions

      Any other geospatial operations MAY be exposed by using Functions. These functions are not defined in any way by this portion of the spec. See the section on Functions for more information, including namespacing issues. They MUST NOT be exposed in the geo namespace.

      Beispiele

      Find coffee shops near me
      Find the nearest 3 coffee shops, by drive time

      This is not directly supported by OData. However, it can be handled by an extension. Beispielsweise:

      Note that while geo.distance is symmetric in its args, MyNamespace.driving_time_to might not be. For example, it might take one-way streets into account. This would be up to the data service that is defining the function.

      Compute distance along routes
      Find all houses close enough to work

      For this example, let's assume that there's one OData service that can tell you the drive time polygons around a point (via a service operation). There's another OData service that can search for houses. You want to mash them up to find you houses in your price range from which you can get to work in 15 minutes.

      Then, you'd send the actual search query to the second endpoint:

      Is there any way to make that URL shorter? And perhaps do this in one query? Not yet.

      This is actually an overly-simple polygon for a case like this. This is just a square with a single hole in it. A real driving polygon would contain multiple holes and a lot more boundary points. So that polygon in the final query would realistically be 3-5 times as long in the URL.

      It would be really nice to support reference arguments in URLs (with cross-domain support). Then you could represent the entire example in a single query:

      However, this is not supported in OData today.

      In Closing

      This set of new primitive types for OData allows it to represent many types of geospatial data. It does not handle everything. Future versions may increase the set of values that can be represented in OData.

      For example, the OGC is working to standardize the set of types used for non-linear interpolation. Similarly, many geospatial implementations are just starting to get into the intricacies of geographic topologies. They are discovering cases which do not work with the current geometry-based standards. As the geospatial community solves these problems and extends the standards, OData will likely incorporate new types.

      As ever, please use the mailing list to tell us what you think about this proposal.