Der geography-Datentyp und warum die Länge einer Linie nicht unbedingt auch die Distanz zwischen deren Endpunkten ist

by post@example.com (Admin) Juli 28, 2009 23:52

Seltsamer Titel? Stimmt. Das war aber heute eine Frage in einem Microsoft-Forum. Warum ist die Länge nicht gleich der Distanz zwischen 2 Punkten?

Nun, das stimmt natürlich nicht - zum Glück. Bei der Fehlersuche ist allerdings eine Besonderheit des SQL Servers aufgefallen. Zuerst aber mal ein Beispiel

DECLARE @line geography, @pointStart geography, @pointEnd geography
SELECT @line = geography::STGeomFromText('LINESTRING(1 2, 3 4)', 4326),
       @pointStart = geography::Point(1, 2, 4326),
       @pointEnd = geography::Point(3, 4, 4326)

SELECT @line.STLength() AS Length,
       @pointEnd.STDistance(@pointStart) AS Distance

Heraus kommen die Werte

Length Distance
313588,386985478 313705,435222058

Doch warum sollte hier ein Unterschied bestehen... STLength() gibt die Länge des LINESTRINGs zurück und STDistance() berechnet die Distanz zwischen 2 Punkten. Wie bereits vorweggenommen ist das Ergebnis so an sich also falsch - trotzdem ist es so, dass der SQL Server korrekt rechnet. Bleibt als einzige Fehlerquelle also nur noch der Code selbst übrig...

Laut MSDN-Referenz zu geography::Point werden 3 Parameter erwartet: Latitude, Longitude und die SRID. Die Funktion geography::STGeomFromText interpretiert die Angaben aber anders herum. Um genauer zu sein in der Reihenfolge Longitude (geographischer Länge) und danach Latitude (geographischer Breite).

Und das war auch schon das ganze Geheimnis ;) Warum geography::Point hier die Werte anders herum erwartet ist mir ein Rätsel und wird es wohl auch bleiben - die Reihenfolge wie sie geography::STGeomFromText interpretiert entspricht den Vorgaben der OGC und erscheinen damit in allen möglichen Bereichen eben in dieser Reihenfolge (und damit u.a. auch in GML).

Wie dem auch sei. Es ist alles noch korrekt - man muss nur dran denken ;)

Warning LNK4075: /EDITANDCONTINUE wird aufgrund der Angabe von /INCREMENTAL:NO ignoriert

by wolfgang@gehirnwindung.de (Wolfgang) Juli 07, 2009 13:00

Wenn der C++ Linker die Warnung LNK4075 ausgibt, so kann man entweder die Einstellung /INCREMENTAL von NO auf YES stellen, oder - so kann man meinen - /EDITANDCONTINUE deaktivieren.

 Die Einstellung Enable Incremental Linking

Während man die erstgenannte Einstellung in den Projekteigenschaften unter "Linker" -> "General" -> "Enable Incremental Linking" findet, ist die Einstellung für "Edit And Continue" allerding nicht auffindbar.

Diese ist über den Visual Studio Dialog nicht direkt einstellbar. Stattdessen gibt es eine Einstellung unter "C/C++" -> "General" -> "Debug Information Format". Ist hier "/ZI" (also Program Database for Edit & Continue) eingestellt, so impliziert das die (interne) Linkeroption /EDITANDCONTINUE.

Die Einstellung Debug Information Format

Powered by BlogEngine.NET 1.6.1.6
Theme by Mads Kristensen | Modified by Mooglegiant and me ;)