2011-09-20 25 views
6

का उपयोग कर SQL सर्वर 2008 में दो स्थानों के बीच रिटर्न दूरी हमारे पास स्थान और उनके अक्षांश और अक्षांश के साथ एक सारणी है।अक्षांश और देशांतर

हम केंद्र बिंदु के रूप में एक विशिष्ट अक्षांश और देशांतर का उपयोग करके अगले 25 किलोमीटर के भीतर स्थानों को सूचीबद्ध करने के लिए SQL Server 2008 में एक फ़ंक्शन बनाने का प्रयास कर रहे हैं।

ALTER FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @myCurrentLatitude float, 
    @myCurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @radiusOfTheEarth int 
    SET @radiusOfTheEarth = 6371--km 

    DECLARE @distance int 
    SELECT @distance = (@radiusOfTheEarth 
     * acos(cos(radians(@myCurrentLatitude)) 
     * cos(radians(@latitude)) 
     * cos(radians(@longitude) - radians(@myCurrentLongitude)) + sin(radians(@myCurrentLatitude)) 
     * sin(radians(@latitude)))) 

    RETURN @distance 

END 

:

अगर यह एक अच्छा तरीका शुरू करने और हमारे समारोह और एक केंद्र बिंदु के बीच वर्तमान दूरी हो रही (वर्तमान स्थान) और एक लक्ष्य स्थान (@ अक्षांश/@ देशांतर) का परीक्षण करने के लिए है मैं भटक रहा था क्या यह सही है या हम कुछ याद कर रहे हैं?

उत्तर

11

ऐसा लगता है कि आप great-circle distance फ़ॉर्मूला का उपयोग कर रहे हैं, जो शायद आपके लिए पर्याप्त सटीक है, हालांकि आपको इसका जज होना होगा।

आप अपने सूत्र के परिणामों की जांच करना चाहते हैं, तो आप geography डेटा प्रकार का उपयोग कर सकते हैं:

declare @geo1 geography = geography::Point(@lat1, @long1, 4326), 
     @geo2 geography = geography::Point(@lat2, @long2, 4326) 

select @geo1.STDistance(@geo2) 

और जब से तुम एक proximity search कर रहे हैं, तो आप geography डेटा आगे टाइप की जांच कर सकते हैं।

+0

4326 क्या है? मैंने एमएसडीएन देखने की कोशिश की लेकिन इसके बारे में कोई जानकारी नहीं है। –

+0

4326 विश्व भूगर्भीय संदर्भ प्रणाली के लिए स्थानिक संदर्भ आईडी है। अधिक जानकारी के लिए http://technet.microsoft.com/en-us/library/bb933811.aspx http://en.wikipedia.org/wiki/SRID और http://en.wikipedia.org/wiki/WGS84 देखें –

0

क्या यह मान्य होगा?

CREATE FUNCTION [dbo].[GetDistanceFromLocation] 
( 
    @CurrentLatitude float, 
    @CurrentLongitude float, 
    @latitude float, 
    @longitude float 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @geo1 geography = geography::Point(@lat1, @long1, 4268), 
      @geo2 geography = geography::Point(@lat2, @long2, 4268) 

    DECLARE @distance int 
    SELECT @distance = @geo1.STDistance(@geo2) 

    RETURN @distance 

END 

धन्यवाद!

+0

स्टैक ओवरफ़्लो में आपका स्वागत है! यह वास्तव में एक टिप्पणी है, जवाब नहीं। थोड़ा और प्रतिनिधि के साथ, [आप टिप्पणियां पोस्ट करने में सक्षम होंगे] (// stackoverflow.com/privileges/comment)। मैं इस पोस्ट को हटाने के लिए फ़्लैग कर रहा हूं। –

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