2011-06-17 20 views
8

पहली बार मैं SQL Server 2008 R2 की स्थानिक सुविधाओं का उपयोग करने का प्रयास कर रहा हूं, इसलिए कृपया मेरे साथ बेकार करें।एसक्यूएल सर्वर 2008 आर 2 भूगोल दूरी?

मैं निम्नलिखित कॉलम के साथ एक टेबल बनाया है:

Text:varchar(255) 
Location:geography 

वे नीदरलैंड से कुछ ही शहर के होते हैं के रूप में डेटा (Google नक्शे से निर्देशांक मिल गया):

Rotterdam - POINT (51.925637 4.493408 4326) 
Utrecht - POINT (52.055868 5.103149 4326) 
Nijmegen - POINT (51.801822 5.828247 4326) 
Breda - POINT (51.542919 4.77356 4326) 

मैं चाहता हूँ करने के लिए रॉटरडैम से डीबी में सभी शहर के बीच की दूरी को जानें, इसलिए मैं यह क्वेरी करता हूं:

Select 
    Text, Location, 
    Location.STDistance(geography::Point(51.925638, 4.493408, 4326)) as Distance 
from Messages 

लेकिन परिणामस्वरूप मुझे हर शहर के लिए 6800000 के करीब दूरी मिलती है।

इसका कारण क्या हो सकता है?

एकमात्र कारण यह है कि मैं सोच सकता हूं कि मैं गलत एसआरआईडी का उपयोग कर रहा हूं, लेकिन मुझे पता नहीं लगा कि मुझे किसके लिए उपयोग करना चाहिए।

धन्यवाद!

संपादित करें:

बस के लिए यह की बिल्ली मैं संख्या के साथ खेल चला गया और मैं कुछ अजीब परिणाम मिला:

Distance from Rotterdam to Rotterdam: 6828459.57 (A) (weird but true) 
Distance from Rotterdam to Breda: 6779956.10 (B) 
Distance from Rotterdam to Nijmegen: 6695336.38 (C) 

अब यहाँ है जहाँ यह दिलचस्प हो गया है:

(A) - (B) = 48504 m = 48 km 
(A) - (C) = 133123 m = 133 km 

ये मूल्य मोटे तौर पर इन शहर के बीच की दूरी हैं।

उत्तर

2

इस परीक्षण का मामला अनुसार यह ठीक काम करने के लिए लगता है:

DECLARE @rotterdam geography = geography::Point(51.925637, 4.493408,4326); 
with tmp(txt, geo) 
as 
    (
    select 'Rotterdam',geography::Point(51.925637, 4.493408,4326) 
    UNION ALL 
    select 'Utrecht',geography::Point(52.055868, 5.103149,4326) 
    UNION ALL 
    select 'Nijmegen',geography::Point(51.801822, 5.828247,4326) 
    UNION ALL 
    select 'Breda',geography::Point(51.542919, 4.77356,4326) 
) 
    SELECT t.txt, t.geo.STDistance(geography::Point(51.925637, 4.493408,4326)) from tmp t 

तो अपने वास्तविक क्वेरी, ठीक लग रहा है जो मुझे आश्चर्य है कि अगर समस्या अपनी तालिका में गलत डेटा की वजह से है बनाता है। क्या आप पुष्टि कर सकते हैं कि डेटा तालिका में सही ढंग से संग्रहीत है?

इसके अलावा मैं भूगोल मूल्य को संग्रहीत करने की अनुशंसा करता हूं जिसे आप अलग-अलग मान में तुलना करते हैं जैसे @TrickyNixons उदाहरण में।

+0

मुझे अभी भी यकीन नहीं है कि मैंने क्या किया है, लेकिन आपका कोड काम करता है इसलिए मैं उससे जाऊंगा। धन्यवाद =) – SaphuA

+2

@ सफुआ आपका स्वागत है। एक sidenote एक शून्य सूचकांक डेटाटाइप कॉलम पर एक स्थानिक सूचकांक का उपयोग करने के बहुत सावधान रहना चाहिए। कुछ गंभीर प्रदर्शन समस्याएं हैं, इसलिए यदि आप अपनी स्कीमा को फिर से तैयार करना चाहते हैं तो भी उस भौगोलिक कॉलम को गैर-शून्य कर दें। – Tomas

+1

टॉमस की निरर्थक भूगोल प्रकारों पर एक स्थानिक इंडेक्स के साथ प्रदर्शन समस्याओं के बारे में टिप्पणी बहुत अच्छी है। यहां अधिक जानकारी: http://stackoverflow.com/questions/4954875/sql-server-2008-performance-on-nullable-geography-column-with-spatial-index – TTT

4

इस तरह की एक संरचना का प्रयास करें।

DECLARE @a geography, @b geography 
SET @a = geography::Point(51.925637, 4.493408,4326) 
SET @b= geography::Point(51.542919, 4.77356,4326) 
SELECT @a.STDistance(@b) 
संबंधित मुद्दे