आप GEOGRAPHY
. को देखने से भी बुरा कर सकते हैं डेटाटाइप, उदाहरण के लिए:
CREATE TABLE Places
(
SeqID INT IDENTITY(1,1),
Place NVARCHAR(20),
Location GEOGRAPHY
)
GO
INSERT INTO Places (Place, Location) VALUES ('Coventry', geography::Point(52.4167, -1.55, 4326))
INSERT INTO Places (Place, Location) VALUES ('Sheffield', geography::Point(53.3667, -1.5, 4326))
INSERT INTO Places (Place, Location) VALUES ('Penzance', geography::Point(50.1214, -5.5347, 4326))
INSERT INTO Places (Place, Location) VALUES ('Brentwood', geography::Point(52.6208, 0.3033, 4326))
INSERT INTO Places (Place, Location) VALUES ('Inverness', geography::Point(57.4760, -4.2254, 4326))
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
CROSS JOIN Places p2
GO
SELECT p1.Place, p2.place, p1.location.STDistance(p2.location) / 1000 AS DistanceInKilometres
FROM Places p1
INNER JOIN Places p2 ON p1.SeqID > p2.SeqID
GO
geography::Point
अक्षांश और देशांतर के साथ-साथ एक SRID (विशेष संदर्भ आईडी संख्या) लेता है। इस मामले में, SRID 4326 है जो मानक अक्षांश और देशांतर है। जैसा कि आपके पास पहले से ही अक्षांश और देशांतर है, आप बस ALTER TABLE
भूगोल कॉलम जोड़ने के लिए UPDATE
इसे भरने के लिए।
मैंने तालिका से डेटा प्राप्त करने के दो तरीके दिखाए हैं, हालांकि आप इसके साथ एक अनुक्रमित दृश्य नहीं बना सकते हैं (अनुक्रमित दृश्यों में स्वयं-जुड़ना नहीं हो सकता है)। हालाँकि आप एक द्वितीयक तालिका बना सकते हैं जो प्रभावी रूप से एक कैश है, जो कि ऊपर के आधार पर आबाद है। फिर आपको इसे बनाए रखने के बारे में चिंता करने की ज़रूरत है (ट्रिगर या किसी अन्य प्रक्रिया के माध्यम से किया जा सकता है)।
ध्यान दें कि क्रॉस जॉइन आपको 250,000,000,000 पंक्तियाँ देगा, लेकिन खोजना आसान है क्योंकि आपको केवल एक स्थान कॉलम को देखने की आवश्यकता है (यानी, SELECT * FROM table WHERE Place1 = 'Sheffield' AND distance < 100
, दूसरा आपको काफी कम पंक्तियाँ देगा, लेकिन फिर क्वेरी को प्लेस1 और प्लेस2 कॉलम दोनों पर विचार करने की आवश्यकता है)।