2012-06-14 9 views
6

Wir befinden uns in diesem Konflikt in einem internen Konflikt und können nicht zu einem glücklichen Ergebnis kommen.Sollte ich SqlGeometry oder SqlGeography verwenden?

Wir speichern nur Breiten- und Längengrade und möglicherweise einfache Polygone. Alles, was wir dafür benötigen, ist die Berechnung der Entfernung zwischen zwei Punkten (und möglicherweise, um zu sehen, ob ein Punkt innerhalb eines Polygons liegt), und die Gesamtheit der Daten ist so nahe beieinander, dass planare Schätzungen akzeptabel sind.

Da unsere Anforderungen so entspannt sind, schlägt die Hälfte des Entwicklerteams vor, SqlGeometry Typen zu verwenden, die scheinbar einfacher sind. Ich habe jedoch Schwierigkeiten, dies zu akzeptieren, da wir geographische Daten speichern, was scheint, als ob sie in SqlGeography speichern, ist das Richtige zu tun. Ich finde auch keinen substanziellen Beweis, dass der SqlGeometry Datentyp viel einfacher zu bearbeiten ist als der SqlGeography Typ.

Hat jemand einen Rat, welcher Typ für dieses relativ einfache Szenario geeigneter wäre?

+0

Gibt es * irgendeine * Möglichkeit, dass Ihre Anwendung so weit wächst, dass sphärische Daten zu einer Anforderung werden? – swasheck

+0

Hmm ... Ich habe nicht genug mit den räumlichen Daten in SQL Server getan, um eine fundierte Meinung zu haben. Code die Dinge, die Sie in beide Richtungen beschrieben haben und sehen, welche einfacher ist. Wenn es sich um eine Wäsche handelt, würde ich sagen, dass der geografische Typ angemessener ist. Aber Sie könnten ihre Beklemmung im Spiking-Prozess aufdecken. –

Antwort

5

Es geht nicht darum, Features, Genauigkeit oder Einfachheit zu vergleichen - die beiden räumlichen Datentypen dienen zum Arbeiten mit verschiedenen Arten von Daten.

Nehmen wir als Analogie an, Sie würden den besten Datentyp für eine Spalte auswählen, die für jede Zeile einen eindeutigen Bezeichner enthält. Wenn diese UID nur ganzzahlige Werte enthält, würden Sie int verwenden. Wenn es sich um einen 6-stelligen alphanumerischen Wert handelt, verwenden Sie char (6). Und wenn es Unicode-Werte variabler Länge hätte, würden Sie stattdessen nvarchar verwenden, richtig?

Die gleiche Logik gilt für räumliche Daten - Sie wählen den geeigneten Datentyp basierend auf den Werten, die diese Spalte enthält; Wenn Sie mit geografischen Koordinaten arbeiten (d. h. geografische Breite/Länge), verwenden Sie den SqlGeography Datentyp. So einfach ist das.

Sie können Verwendung SqlGeometry zu speichern Breite/Länge-Werte, aber es wäre wie mit nvarchar (max) eine ganze Zahl zu speichern ... und ich verspreche Ihnen, es zu weiteren Problemen auf der ganzen Linie führen (wenn alle Ihre Flächenberechnungen zum Beispiel in Quadratquadrate gemessen werden)

+1

Obwohl ich Ihnen zustimme, scheint das von der OP beschriebene Problem sehr einfach zu sein. Er erwähnt sogar, dass die Gesamtheit der Daten in unmittelbarer Nähe ist, so dass der Entfernungsberechnungsfehler vernachlässigbar sein sollte. Machen Sie niemals eine Ausnahme in Bezug auf lat/lon -> Geographie? Ich frage das, weil ich meinen Anteil an Problemen mit SqlGeography und Ogr2ogr, NH Spatial, QGIS, Sharpmap usw. hatte, und manchmal, vor allem, wenn die räumlichen Daten nicht der Kern der Lösung sind, sondern etwas Zusätzliches, mit SqlGeography scheint einfach nicht die Mühe wert (IMHO). – psousa

+0

@psousa, haben Sie Links, die Sie mit Ihren spezifischen Problemen bezüglich des SqlGeography-Typs teilen können? –

+0

Ich habe keine Links auf meinem Kopf, aber zum Beispiel: ogr2ogr manchmal die lat/lon Felder beim Importieren von Geographie Daten (in einer der neueren Versionen), QuantumGIS (die neueste Version) SQL-Geographie nicht zu öffnen Daten, SharpMap unterstützt keine SQL-Geography-Daten, NH Spatial erfordert einige spezielle Überschreibungen, um geographische Daten zu verarbeiten, ein Polygon ist schwieriger zu erstellen, weil Sie die richtige Ringausrichtung liefern müssen ... Alastair hat theoretisch einen Punkt, theoretisch scheint es logisch Verwenden Sie SqlGeography. Messen Sie einfach die Vor- und Nachteile. – psousa

5

Der SqlGeography-Typ verfügt über weniger Methoden als SqlGeometry (besonders in Sql 2008).

SqlGeography reference

SqlGeometry reference

Beispiel: Angenommen, Sie den Schwerpunkt eines Polygons in SQL2008 erhalten möchten. Sie haben dafür eine native Methode in Geometrie, aber nicht in Geografie.

Auch hat es die folgenden Einschränkungen:

  • Sie können eine Geographie nicht haben mehr als eine Halbkugel
  • Die Ring Ordnung Angelegenheiten, wenn das Polygon zu schaffen

Auch die meisten API und Bibliotheken (die ich kenne) handhaben Geometrien besser als Geographien.

Das heißt, wenn die Entfernungsberechnung genau sein muss, Sie große Entfernungen haben und Koordinaten auf der ganzen Welt haben, würde Geographie besser passen. Andernfalls und entsprechend Ihrer Beschreibung des Problems würden Sie mit dem Geometrietyp gut bedient.

In Bezug auf Ihre Frage: "Ist das viel einfacher zu arbeiten?". Es kommt darauf an. Wie auch immer, und als Faustregel wähle ich für einfache Szenarien normalerweise SqlGeometry.

Wie auch immer, IMHO sollten Sie sich nicht zu viele Gedanken über diese Entscheidung machen. Es ist relativ einfach, eine neue Spalte mit dem anderen Typ zu erstellen und die Daten bei Bedarf zu migrieren.

+0

danke, @psousa, für dieses pragmatische Argument. Ich frage mich, was es braucht, um das reine geometrische Ergebnis einer Berechnung in eine geeignete Maßeinheit zu übersetzen? Zum Beispiel, um den Abstand zwischen zwei Punkten zu berechnen oder die Fläche eines Polygons zu berechnen? –

+0

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe ... – psousa

+0

Zum Beispiel würde die Berechnung der Entfernung zwischen den Punkten (1,2) und (2,2) '1' für Geometrie zurückliefern, würde aber' ~ 111,252' für Geographie liefern (Ich benutze zum Beispiel falsche Koordinaten). Es scheint sehr nett zu sein, dass Sql Server Ihnen die Entfernung in Meter (oder was immer Sie angeben) gibt, anstatt das reine geometrische Ergebnis in das zu konvertieren, was Sie wollen. Gibt es noch andere Probleme bei Berechnungen mit geometrischen Daten, die dann konvertiert werden müssen? –

1

Vier Jahre später ist es offensichtlich geworden, dass wir die Daten in SqlGeometry anstelle von SqlGeography hätten speichern sollen.

Warum?

Wir importierten Informationen aus Landkarten des Landkreises, und ihre Daten wurden in SqlGeometry gespeichert. Bei der Bestimmung, ob ein bestimmter Breitengrad/Längenbereich innerhalb einer bestimmten legislativen Bezirksgrenze liegt, erhalten wir inkonsistente Ergebnisse, wenn der Punkt nahe zwei Grenzen liegt.

Dies erforderte von uns zusätzliche Arbeiten, um Orte zu identifizieren, die sich in der Nähe einer Grenze befanden, und manuell zu überprüfen, ob sie dem richtigen Bezirk zugewiesen waren. Nicht ideal.

Moral der Geschichte: Wenn Sie sich auf irgendwelche Daten verlassen, überlegen Sie, in welcher Art es gespeichert ist, um Ihre Entscheidung zu leiten.

Verwandte Themen