2011-06-17 28 views
8

İlk kez SQL Server 2008 R2'nin mekansal özelliklerini kullanmaya çalışıyorum, lütfen bana çıplak bakın.SQL Server 2008 R2 Coğrafya Mesafe?

aşağıdaki sütunları içeren bir tablo oluşturduk:

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) 

istediğim için: verileri (google maps koordinatları var) olarak

Text:varchar(255) 
Location:geography 

Onlar Hollanda'dan birkaç şehrin içerirler Rotterdam'daki tüm şehirler arasındaki mesafeyi bilin, bu yüzden şu sorguyu gerçekleştiriyorum:

Ama sonuç olarak her şehir için 6800000'e yakın bir uzaklık elde ediyorum.

Buna neden olabilir?

Düşünebilmemin tek nedeni, yanlış SRID kullanıyorum, ancak bunun yerine hangisini kullanmam gerektiğini anlayamıyorum.

Teşekkürler!

Düzenleme:

bunun halt sayılarla oynayarak gitti ve bazı garip sonuçlar elde ettim Sadece için: ilginç nereden Şimdi burada

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 

Bu değerler kabaca bu şehirler arasındaki mesafelerdir.

cevap

2

bu test vakası göre sadece çok iyi çalışıyor görünüyor:

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 

Yani gerçek sorgu sorun Tablonuzdaki hatalı veriler nedeniyle olup olmadığını merak yapar iyi görünüyor. Verilerin doğru şekilde tabloda saklandığını onaylayabilir misiniz?

Ayrıca ben @TrickyNixons örnekte olduğu gibi ayrı bir değer ile karşılaştırmak coğrafya değerini muhafaza etmenizi öneriyoruz.

+0

Hala neyi yanlış yaptığımı bilmiyorum, ancak kodunuz çalışır, böylece bundan gideceğim. Teşekkürler =) – SaphuA

+2

@SaphuA Rica ederim. Bir sidenote olarak NULL olabilecek bir GEOGRAPHY veri türü sütununda bir uzamsal indeks kullanma ÇOK dikkatli olun. Bazı ciddi performans sorunları var, bu yüzden ŞEMA KILAVUZU'nu şemayı yeniden biçimlendirmeniz gerekse bile null yapamazsınız. – Tomas

+1

Tomas'ın, nilüfer coğrafya türlerinde uzamsal bir endeksle performans sorunları hakkındaki yorumu harika. Daha fazla bilgi burada: http://stackoverflow.com/questions/4954875/sql-server-2008-performance-on-nullable-geography-column-with-spatial-index – TTT

4

Böyle bir yapıyı deneyin.

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)