2017-07-25 89 views
6

Yerin adını (kullanıcı tarafından manuel olarak girilen) ve yerin enlemi ve boylamı (otomatik olarak yakalanan) içeren bir DimPlace boyutu var. Yerler manuel olarak girildiği için aynı yerde farklı isimlerle birden fazla zaman olabilir, ayrıca iki ayrı yer birbirine çok yakın olabilir.Veri ambarı için geozones veya Lat & Long boyutu

İki "yer" arasındaki MPG'yi analiz edebilmek istiyoruz, ancak bunları daha geniş bir alan oluşturmak için gruplamak istiyoruz. Örneğin, & uzunluğunu kullanarak, bir konumdaki tüm çeşitli yazımların yanı sıra farklı ama çok Bir kayıtta yakın yerler.

Bunun için yeni bir boyut oluşturmayı planlıyorum - DimPlaceGeozone gibi bir şey. Bir şey için eşlenmiş tüm lat & uzun değerleri yükleme ile yardımcı olacak bir kaynak arıyorum. Belki posta kodu veya şehir adı? Bazen ortak boyutları (DimTime gibi) yüklemek için bir komut dosyası bulabilirsiniz - Kuzey Amerika'da lat & uzun değerler için benzer bir şey isterim?

+0

bu downvoted neden, ilginç bir sorudur emin değilim. Gruplandırmanız için ISO-3166 ve ISO-3166-2 (https://en.wikipedia.org/wiki/ISO_3166-2) gibi bir yapı kullanmayı düşünün ve yer isimleriniz için bir coğrafi kodlama API'si kullanın. –

+0

Herhangi bir API önerebilir misiniz? Öyleyse, bir yer adı döndürmek için API üzerinden lat ve long arama yapmak için bir betik yazıyor (SQL'de değil). – tember

+1

İşte bir tane: https://developers.google.com/maps/documentation/javascript/examples/geocoding-reverse –

cevap

2

Geçmişte benzer bir şey yaptım ... Ön tarafa çarpan bir tökezleme bloğu, iki noktanın, bir sınırın üzerini örttüğü, aynı bölgede bulunan 2 konumdan fiziksel olarak birbirine yakın olabileceğiydi.

Her bir konumun 4 alana düşmesine neden olan bir "çift ızgara" sistemi oluşturarak etrafımdan geçtim. Bu sayede en az 1 "alan" paylaşan 2 lokasyon olduğunu biliyorsunuz.

İşte

IF OBJECT_ID('tempdb..#LatLngAreas', 'U') IS NOT NULL 
DROP TABLE #LatLngAreas; 
GO 

WITH 
    cte_Lat AS (
     SELECT 
      t.n, 
      BegLatRange = -37.9 + (t.n/10.0), 
      EndLatRange = -37.7 + (t.n/10.0) 
     FROM 
      dbo.tfn_Tally(1030, 0) t 
     ), 
    cte_Lng AS (
     SELECT 
      t.n, 
      BegLngRange = -159.7 + (t.n/10.0), 
      EndLngRange = -159.5 + (t.n/10.0) 
     FROM 
      dbo.tfn_Tally(3050, 0) t 
     ) 
SELECT 
    Area_ID = ROW_NUMBER() OVER (ORDER BY lat.n, lng.n), 
    lat.BegLatRange, 
    lat.EndLatRange, 
    lng.BegLngRange, 
    lng.EndLngRange 
    INTO #LatLngAreas 
FROM 
    cte_Lat lat 
    CROSS JOIN cte_Lng lng; 


SELECT 
    b3.Branch_ID, 
    b3.Name, 
    b3.Lat, 
    b3.Lng, 
    lla.Area_ID 
FROM 
    dbo.ContactBranch b3 -- replace with DimPlace 
    JOIN #LatLngAreas lla 
     ON b3.Lat BETWEEN lla.BegLatRange AND lla.EndLatRange 
     AND b3.lng BETWEEN lla.BegLngRange AND lla.EndLngRange; 

HTH ... Amerika Birleşik Devletleri'nin en kapsayan bir örnek, Jason

+0

Bu işe yarayacak gibi görünüyor ya da zaten çok iyi bir başlangıç. Teşekkür ederim! – tember

+0

Sorun değil. Yardım etmekten memnun oldum. –