2016-09-22 3 views
1

Ich habe eine Antwort auf diese Frage von dieser Website, aber die Antwort, die ich bekomme, ist falsch.Finden Sie den Abstand zwischen zwei Punkten mit Längen- und Breitengrad

DECLARE @orig_lat DECIMAL 
DECLARE @orig_lng DECIMAL 
SET @orig_lat=52.676 set @orig_lng=-1.6193 
DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326); 
SELECT @orig.STDistance(geography::Point(Latitude, longitude, 4326)) AS distance 
From ... 

Allerdings erhalte ich die falsche Antwort z.B. Abstand 234229 Breite 55.0853 und Länge -1.595

Ich muss zugeben, ich habe nur den Code kopiert und verstehe es nicht. Die Antwort sollte 166 Meilen sein, was 267 km ist.

Irgendwelche Ideen?

Antwort

0

Kurze Antwort:

Make @orig_lat und @orig_lng vom Typ decimal(19,6) (zum Beispiel) oder float.

Lange Antwort:

Das Problem ist, weil Ihr decimals keine tatsächlichen Dezimalstellen haben (Sie können die Standardgenauigkeit verwenden, die decimal(18,0) ist), so dass sie am Ende 53 sein und -2. Sie sollten ihre Genauigkeit definieren (z. B. decimal(19,6)) oder einfach float verwenden, was der Typ ist, den die Funktion sowieso erwartet. Wenn Sie einfach nur das ändern, es funktioniert gut:

DECLARE @orig_lat float 
DECLARE @orig_lng float 
SET @orig_lat=52.676 set @orig_lng=-1.6193 
DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326); 
DECLARE @dest geography = geography::Point(55.0853, -1.595, 4326); 
select @orig.STDistance(@dest) 

Das gibt 268166.415685712.

ich dies durch einfaches Drucken den varchar Äquivalent der geography entdeckt:

DECLARE @orig_lat decimal 
DECLARE @orig_lng decimal 
SET @orig_lat=52.676 set @orig_lng=-1.6193 
DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326); 
select cast(@orig as varchar) 

Die POINT (-2 53) gedruckt wird, was gibt Ihnen auch ein weiteres Stück von Informationen neben der Rundung: dass varchar-Format verwendet Länge-Breite statt Längengrad. Also, wenn Sie diese Punkte auf die andere Weise erstellen wollten, sollten Sie verwenden:

DECLARE @orig geography = 'POINT(-1.6193 52.676)' 
DECLARE @dest geography = 'POINT(-1.595 55.0853)' 
SELECT @orig.STDistance(@dest) 
+0

Hallo, danke für deine volle Antwort, das macht Sinn und funktioniert jetzt mit den Nachkommastellen. Das Tauschen von Breitengrad und Längengrad ist sicherlich verwirrend und in Bezug auf, aber ich denke, https://msdn.microsoft.com/en-us/library/bb933811.aspx sagt der Grund ist, dass, wenn es gedruckt wird es ausgetauscht wird, so ist es wie Kartenkoordinaten. – Panda

-1

Eine einfachere Art und Weise, ist dies:

DECLARE @source geography = 'POINT(52.676 -1.6193)' 
DECLARE @target geography = 'POINT(55.0853 -1.595)' 

SELECT @source.STDistance(@target) 
+0

Das hilft nicht, er hat die Punkte in einer Tabelle, und außerdem tauschen Sie Längen- und Breitengrad dort. – Andrew

0

Die Antwort ist in Metern, Division durch 1000 und Sie haben km.

Ich versuche, es Ihnen zu brechen:

-- I assume you already know that this part is only declaring variables 
-- and setting them. 
-- In this case they are the variables for your starting coordinates. 
DECLARE @orig_lat DECIMAL 
DECLARE @orig_lng DECIMAL 
SET @orig_lat=52.676 set @orig_lng=-1.6193 

-- MS SQL has built in geography functions 
-- like a function to determine the distance between 2 points. 
-- But it uses an own unit instead of longitude/latitude: point. 
-- So you have to use the geography::Point-function to convert 
-- a lat/lon coordinate into a point value: 
DECLARE @orig geography = geography::Point(@orig_lat, @orig_lng, 4326); 

-- The rest is basically the same again with the target coordinates, 
-- namely this part: geography::Point(Latitude, longitude, 4326) 
-- embedded in the STDistance function. This function calculates the distance 
-- between 2 point values. 
SELECT @orig.STDistance(geography::Point(Latitude, Longitude, 4326)) AS distance 
From ... 
-- where Latitude and Longitude would be your destination coordinates. 

Wenn Sie möchten, können Sie Ihre eigene Erklärung, der mathematische Hintergrund hierfür ist die Formel Haversine schreiben grundsätzlich den Abstand zwischen zwei Punkten auf einer Kugel zu messen.

+0

Sein Code funktioniert nicht. '234229/1000! = 267'. Das Problem waren die Variablentypen, wie in meiner Antwort angegeben. – Andrew

Verwandte Themen