2013-02-22 13 views
10

मैं, जीपीएस से डेटा के साथ तालिका है उदा .: Latitude, Longitude, Time, UserIdSQL सर्वर में एकाधिक बिंदुओं के बीच दूरी की गणना कैसे करें?

कैसे निर्दिष्ट समय सीमा में कुल दूरी उपयोगकर्ता के सभी अंक (समय द्वारा आदेश दिया) और समूह डेटा द्वारा सभी दूरियों संक्षेप एकत्र करने के लिए?

धन्यवाद

+0

दूरी गणना ही आप को देखने के लिए चाहते हो सकता है के लिए < http://williams.best.vwh.net/avform.htm#Dist> –

उत्तर

7

आप एसक्यूएल सर्वर का उपयोग कर रहे हैं, तो आप डेटाबेस समर्पित विधि और भौगोलिक सूचकांक का उपयोग कर अनुरोध कर सकते हैं भूगोल डेटा प्रकार का उपयोग करने में रुचि हो सकती है।

http://msdn.microsoft.com/en-us/library/cc280766.aspx

एक बार जब आप भूगोल स्तंभ में डेटा है, तो आप गणना करने में सक्षम हो जाएगा:

भूगोल डेटा प्रकार एसक्यूएल सर्वर 2008, आप अधिक जानकारी कर सकते हैं यहीं के बाद से उपलब्ध है STDistance का उपयोग कर() पद्धतियों दो अंक के बीच की दूरी, MSDN देखें:

http://msdn.microsoft.com/en-us/library/bb933808.aspx

यहाँ (एक उदाहरण है जहां STDistance() दूरी की गणना करने के लिए प्रयोग किया जाता है के साथ भौगोलिक विरूपण) दो अंक मीटर में लौटे के बीच (अंतरराष्ट्रीय मानक इकाई):

DECLARE @pointA geography; 
DECLARE @pointB geography; 
SET @pointA = geography::STGeomFromText('POINT(-122.34900 50)', 4326); 
SET @pointB = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @pointA.STDistance(@pointB); 

आप SQL सर्वर 2005 उपयोग कर रहे हैं (या यदि आप भूगोल डेटा प्रकार) का उपयोग कर से बचना चाहते हैं, तो आप पर एक नज़र ले जा सकते हैं CodePlex पर MsSQLSpatial परियोजना, यहाँ उपलब्ध है: http://mssqlspatial.codeplex.com/wikipage?title=Features&referringTitle=Home

+0

और किसी कारण से, एसटीडिस्टेंस केस संवेदनशील है। – David

+1

वास्तविक कारण के कारण है।स्थानिक सुविधाओं में अंतर्निहित शुद्ध कार्यान्वयन (भूगोल या ज्यामिति के लिए समान)। वास्तव में, ओजीसी परिभाषित कर रहा है कि यह मानक में ST_Distance होना चाहिए, जो मुझे लगता है, सामान्य SQL सर्वर सम्मेलन में अनुकूलित किया गया है। –

5

नीचे समारोह दोनों के बीच दूरी मील में geocoordinates देता

create function [dbo].[fnCalcDistanceMiles] (@Lat1 decimal(8,4), @Long1 decimal(8,4), @Lat2 decimal(8,4), @Long2 decimal(8,4)) 
returns decimal (8,4) as 
begin 
declare @d decimal(28,10) 
-- Convert to radians 
set @Lat1 = @Lat1/57.2958 
set @Long1 = @Long1/57.2958 
set @Lat2 = @Lat2/57.2958 
set @Long2 = @Long2/57.2958 
-- Calc distance 
set @d = (Sin(@Lat1) * Sin(@Lat2)) + (Cos(@Lat1) * Cos(@Lat2) * Cos(@Long2 - @Long1)) 
-- Convert to miles 
if @d <> 0 
begin 
set @d = 3958.75 * Atan(Sqrt(1 - power(@d, 2))/@d); 
end 
return @d 
end 

नीचे समारोह देता किलोमीटर में दो geocoordinates के बीच दूरी

CREATE FUNCTION dbo.fnCalcDistanceKM(@lat1 FLOAT, @lat2 FLOAT, @lon1 FLOAT, @lon2 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()*@lon2/180.0-PI()*@lon1/180.0))*6371 
END 

उपयोग:

select [dbo].[fnCalcDistanceKM](13.077085,80.262675,13.065701,80.258916) 

नीचे समारोह दोनों के बीच दूरी किलोमीटर का उपयोग करने में geocoordinates देता है Geography जो एसक्यूएल सर्वर में पेश किया गया था डेटा प्रकार 2008

DECLARE @g geography; 
DECLARE @h geography; 
SET @g = geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656)', 4326); 
SET @h = geography::STGeomFromText('POINT(-122.34900 47.65100)', 4326); 
SELECT @g.STDistance(@h); 

संदर्भ:Ref1, Ref2

मुझे आशा है कि इस मदद करता है

+1

ध्यान दें कि इन जैसे स्फेरॉयड कंप्यूटेशंस हजारों किमी से अधिक 10 मीटर के लिए सटीक हैं। यदि उच्च सटीकता की आवश्यकता है, तो विन्सेंटी या कर्ण के एल्गोरिदम का उपयोग करें। – N8allan

+0

@ N8allan इंगित करने के लिए धन्यवाद ** विन्सेंटी और कर्ण के एल्गोरिदम ** –

+1

@ N8allan मुझे इस एल्गोरिदम के लिए कोई एसक्यूएल स्क्रिप्ट नहीं मिल सका। जब मैं खाली समय लेता हूं तो मैं एल्गोरिदम को एसक्यूएल स्क्रिप्ट में परिवर्तित करने की कोशिश करने जा रहा हूं। –

संबंधित मुद्दे