3

I Abstand zwischen zwei lat lange Werte in Metern am Berechnung - 40,1844441 -77,2252771 und
40,319166 -76,7880552SQL Server GEOGRAPHY STDistance Funktion zurückkehrt großen Unterschied als andere Testergebnisse

testete ich den Abstand zwischen diesen beiden Punkte in unter zwei Websites - http://www.nhc.noaa.gov/gccalc.shtml und http://www.movable-type.co.uk/scripts/latlong.html
Beide Websites liefern etwa 40014 Meter.

Also verwende ich den GEOGRAPHY-Datentyp von SQL Server, um den Abstand zwischen diesen beiden Punkten erneut zu berechnen, und es gibt 48927 Meter zurück. Es ist ein großer Unterschied für mich.
Unten ist mein Code und jeder Vorschlag wird geschätzt.

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 
DECLARE @distance float 

set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)', 4326) 
set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)', 4326) 

SET @distance = @latlong1.STDistance(@latlong2) 
SELECT @distance -- this returns 48927 meters 

Antwort

1

Auch ich habe einige seltsame Ergebnisse bemerkt, so neige ich dazu, Geographie verwenden :: Point() die sauberere Ergebnisse zu erzeugen scheint. Selbst dann ist Option 2 80 Meter von der UDF entfernt, die genau richtig zu sein scheint.

Beispiel

declare @latlong1 GEOGRAPHY 
declare @latlong2 GEOGRAPHY 

Set @latlong1 = GEOGRAPHY::STGeomFromText('POINT(40.1844441 -77.2252771)',4326) 
Set @latlong2 = GEOGRAPHY::STGeomFromText('POINT(40.319166 -76.7880552)',4326) 

Select VeryOdd = @latlong1.STDistance(@latlong2) 
     ,SQLGeo = geography::Point(40.1844441, -77.2252771, 4326).STDistance(geography::Point(40.319166,-76.7880552, 4326)) 
     ,UDFGeo = [dbo].[udf-Geo-Meters](40.1844441,-77.2252771,40.319166,-76.7880552) 

Returns

VeryOdd    SQLGeo    UDFGeo 
48927.1485292471 40093.8055001913 40014.8833526855 

Die UDF, wenn Sie interessieren

CREATE Function [dbo].[udf-Geo-Meters](@Lat1 FLOAT, @Lng1 FLOAT, @Lat2 FLOAT, @Lng2 FLOAT) 
Returns Float as 
Begin 
    Return ACOS(SIN(PI()*@Lat1/180.0)*SIN(PI()*@Lat2/180.0)+COS(PI()*@Lat1/180.0)*COS(PI()*@Lat2/180.0)*COS(PI()*@Lng2/180.0-PI()*@Lng1/180.0)) * 6371008.8 
    -- 6.371 mean radius of earth in meters 
End 
+0

John C: ich habe Sie UDFGE bestätigen O Ergebnis ist korrekt zu 12 signifikanten Zahlen, basierend auf der Erde als eine Kugel mit Radius 6371008,8 Meter. –

+0

@JohnMachin Danke für den zusätzlichen Aufwand und Bestätigung –

+0

@JohnCappelletti - danke. Ich bestätigte auch mit "Sphärisches Gesetz der Kosinus", die genau das ist, was Sie berechnet haben und es gibt 40014.8833526855 Meter zurück. Ja. Ich benutzte den Radius der Welt als 6371008.8. – Shwe

0

Try rev das lat und lon im "VeryOdd" -Fall verwenden, d. h. POINT(-77.2252771 40.1844441) und POINT(-76.7880552 40.319166) verwenden.

Meine offline "sphärische Gesetz der Kosinus" Ergebnis ist 48733 Meter, die nur etwa 0,4% Unterschied von der ursprünglichen VeryOdd 48927 Meter ist.

Ich schlage vor, ein paar weitere Tests mit verschiedenen Lats und Lons zu versuchen, plus die Dokumente für die relevanten Funktionen/Methoden zu überprüfen.

Spät breaking news: STGeomFromText ('POINT (Länge Breite)' etc - verglichen mit dem häufigeren Protokoll: Breitengrad zuerst, dann Länge

die gewählte Antwort auf diese Frage finden: Create Geometry/Geography Field from Latitude & Longitude fields (SQL Server)

die verbleibenden Unterschiede zu klären, braucht jemand, zu welchem ​​Radius/Radien suchen ist/von der 4326 Magie aufgerufen werden ...

Verwandte Themen