आइए STDistance
. का उपयोग करने का एक सरल उदाहरण देखें SQL सर्वर 2008 (और बाद में) में कार्य करता है।
मैं SQL सर्वर को बताने जा रहा हूँ कि मैं लंदन में हूँ, और मैं देखना चाहता हूँ कि मेरा प्रत्येक कार्यालय कितनी दूर है। यहां वे परिणाम दिए गए हैं जो मैं चाहता हूं कि SQL सर्वर मुझे दे:
सबसे पहले, हमें कुछ नमूना डेटा की आवश्यकता होगी। हम Microsoft कार्यालयों के कुछ स्थानों वाली एक तालिका बनाएंगे, और हम उनके देशांतर और अक्षांश मानों को geography
में संग्रहीत करेंगे। फ़ील्ड.
CREATE TABLE [Offices] (
[Office_Id] [int] IDENTITY(1, 1) NOT NULL,
[Office_Name] [nvarchar](200) NOT NULL,
[Office_Location] [geography] NOT NULL,
[Update_By] nvarchar(30) NULL,
[Update_Time] [datetime]
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Zurich', 'POINT(8.590847 47.408860 )', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft San Francisco', 'POINT(-122.403697 37.792062 )', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Paris', 'POINT(2.265509 48.833946)', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Sydney', 'POINT(151.138378 -33.796572)', 'mike', GetDate())
INSERT INTO [dbo].[Offices] VALUES ('Microsoft Dubai', 'POINT(55.286282 25.228850)', 'mike', GetDate())
अब मान लीजिए हम लंदन में हैं। geography
बनाने का तरीका यहां दिया गया है लंदन के देशांतर और अक्षांश मानों में से मान:
DECLARE
@latitude numeric(12, 7),
@longitude numeric(12, 7)
SET @latitude = 51.507351
SET @longitude = -0.127758
DECLARE @g geography = 'POINT(' + cast(@longitude as nvarchar) + ' ' + cast(@latitude as nvarchar) + ')';
और अंत में, देखते हैं कि हमारा प्रत्येक कार्यालय कितनी दूर है।
SELECT [Office_Name],
cast([Office_Location].STDistance(@g) / 1609.344 as numeric(10, 1)) as 'Distance (in miles)'
FROM [Offices]
ORDER BY 2 ASC
और इससे हमें वे परिणाम मिलते हैं जिनकी हम उम्मीद कर रहे थे।
जाहिर है, आप TOP(1)
. में फिसल सकते हैं यदि आप केवल निकटतम . देखना चाहते हैं कार्यालय।
बढ़िया, हे ?
बस एक रोड़ा है। जब आपके पास बहुत सारे geography
हों तुलना करने के लिए अंक, प्रदर्शन शानदार नहीं है, भले ही आप उस डेटाबेस फ़ील्ड पर एक स्थानिक सूचकांक जोड़ते हैं।
मैंने 330,000 geography
. की तालिका के विरुद्ध एक बिंदु का परीक्षण किया अंक। यहां दिखाए गए कोड का उपयोग करते हुए, इसे लगभग 8 सेकंड . में निकटतम बिंदु मिल गया .
जब मैंने देशांतर और अक्षांश मानों को संग्रहीत करने के लिए अपनी तालिका को संशोधित किया, और [dbo].[fnCalcDistanceMiles]
का उपयोग किया। इस StackOverflow लेख से कार्य करने के बाद, इसे लगभग 3 सेकंड . में निकटतम बिंदु मिल गया ।
हालांकि...
इंटरनेट पर मिले सभी "दो बिंदुओं के बीच की दूरी" के नमूने या तो SQL सर्वर STDistance
का उपयोग करते हैं फ़ंक्शन, या गणितीय सूत्र जिसमें (CPU-गहन) cos, sin और tan फ़ंक्शन शामिल हैं।
एक तेज़ समाधान यह था कि समय पर वापस हाई स्कूल की यात्रा की जाए, और याद रखें कि पाइथागोरस ने दो बिंदुओं के बीच की दूरी की गणना कैसे की।
मान लीजिए हम लंदन और पेरिस के बीच की दूरी जानना चाहते हैं।
और यहाँ मेरा SQL सर्वर फ़ंक्शन है:
CREATE FUNCTION [dbo].[uf_CalculateDistance] (@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)
SET @d = sqrt(square(@[email protected]) + square(@[email protected]))
RETURN @d
END
अब, याद रखें कि यह फ़ंक्शन मील, किलोमीटर आदि में कोई मान नहीं लौटाता... यह केवल देशांतर और अक्षांश मानों की तुलना कर रहा है। और पाइथागोरस का उपयोग 2डी में किया जाना है, न कि किसी गोल ग्रह पर बिंदुओं की तुलना करने के लिए!
हालांकि, मेरे परीक्षणों में, इसे 1 सेकंड . के भीतर निकटतम बिंदु मिल गया , और SQL सर्वर के STDistance
. का उपयोग करने के समान परिणाम दिए समारोह।
तो, सापेक्ष दूरियों . की तुलना करने के लिए इस फ़ंक्शन का उपयोग करने के लिए स्वतंत्र महसूस करें , लेकिन अगर आपको वास्तविक दूरी की आवश्यकता है तो इस फ़ंक्शन का उपयोग न करें।
आशा है कि यह सब मदद करता है।