2012-01-19 92 views
0

我有一個包含文本和地理欄目的數據庫。文本是關鍵字的CSV,地理位置是地圖上的點。SQL空間數據從特定區域獲取數據

我想查詢一個特定的地理區域的前X個循環關鍵字,並按照從最頻繁到最不頻繁的順序返回它們。我不知道這是甚至可能的,或者從哪裏開始。任何指針都會很棒!

我正在運行SQL Server 2012.

+0

你可以更改數據庫模式嗎? – cha0site

+0

是的,我可以完全控制db –

+0

您是否有對數據庫服務器的控制權?拋棄它並使用PostGIS - 免費的空間擴展來釋放RDBMS PostgreSQL。然後你有空間數據結構和操作。它微不足道。 – Spacedman

回答

1

是的,這是可能的。 SQL Server(2008及更高版本)確實有兩種空間類型,幾何和地理。

您的數據模型可能包含兩個表格,一個是幾何圖形,另一個是每個區域的術語/關鍵字。

例如:

create table a(id int, geo geometry); 
create table b(a_id int, term nvarchar(50)); 

-- geometry with id 1 
insert into a values(1, geometry::STGeomFromText('polygon((0 0,0 4,4 4,4 0,0 0))', 0)); 

-- keywords for geometry with id 1 
insert into b values(1, 'term 1'); 
insert into b values(1, 'term 2'); 
insert into b values(1, 'term 2'); -- twice this term, on purpose 

-- geometry with id 2 
insert into a values(2, geometry::STGeomFromText('polygon((10 0,10 4,14 4,14 0,10 0))', 0)); 

-- keywords for geometry with id 2 
insert into b values(2, 'term 3'); 
insert into b values(2, 'term 4'); 
insert into b values(2, 'term 1'); -- shared between 1 and 2 

,然後創建一個空間查詢,例如看起來像這樣:

select a.id,b.term,COUNT(1) as frequency from a 
join b on a.id=b.a_id 
where a.geo.STIntersects(geometry::STGeomFromText('polygon((2 2,2 12,12 12,12 2,2 2))', 0)) = 1 
group by a.id,b.term 
order by frequency desc 

這將導致到:

1 'term 2' 2 
2 'term 3' 1 
2 'term 4' 1 
1 'term 1' 1 
2 'term 1' 1 

這是什麼被要求。

+0

+1我昨晚想到這個:)但是這幾乎就是我最終的結果。謝謝 –