2010-04-28 48 views
0

要在谷歌地图显示数据,我在SQL服务器2005> 50,000列数据的以下的(简化的)结构确保地理数据的良好扩散从SQL数据库

PointID 
Latitude 
Longitude 
TypeID 

我可以选择一个小的子集边界框之内,以确保类型的这样一个体面组合:

..... 
(
@NELat float, 
@NELong float, 
@SWLat float, 
@SWLong float 
) 
as 
select top 100 PointID, Latitude, Longitude, 
rank() over (partition by PointTable.TypeID order by newid()) as NewRank 
from PointTable 
where 
(
CONVERT(float, PointTable.Latitude) >= @SWLat and CONVERT(float, PointTable.Latitude) <= @NELat and 
CONVERT(float, PointTable.Longitude) >= @SWLong and CONVERT(float, PointTable.Longitude) <= @NELong 
) 
order by NewRank 

不幸的是初始数据被朝向一个特定地理位置偏置。

什么是确保检索到的数据具有良好地理分布的最有效/计算最快的方法?

我不想对数据进行聚类,只是为了在边界框中显示更均匀的数据传播。 我可能创建边界框网格的一个子集,并对它们进行分区? 任何建议将是一个很大的帮助!

我一直在寻找可用于SQL sever 2008的地理数据类型,但它看起来不像2005年的可用。我也知道float不是用于存储坐标的最佳数据类型,但这不是最好的对我来说。

回答

0

我最终什么事做的是以下几点:

扩展我的表,包括Hierarchical Triangular Mesh ID为给定的纬度/经度。使用在空间数据库中的函数从“Using Table Valued Functions in SQL Server 2005 to Implement a Spatial Data Library”生成

PointID 
Latitude 
Longitude 
TypeID 
HTMID 

HTMID,与源代码下载从Codeplex(注意我不得不生成新sampleKey.snk构建示例项目。我跟着these instructions

然后HTMID可以被四舍五入并用于将附近的点组合在一起。

..... 
(
@NELat float, 
@NELong float, 
@SWLat float, 
@SWLong float 
) 
as 
select top 100 PointID, Latitude, Longitude, 
rank() over (partition by PointTable.TypeID order by newid()) as NewRank, 
rank() over (partition by round(PointTable.HTMID,-7) order by newid()) as HTMRank 
from PointTable 
where 
(
CONVERT(float, PointTable.Latitude) >= @SWLat and CONVERT(float, PointTable.Latitude) <= @NELat and 
CONVERT(float, PointTable.Longitude) >= @SWLong and CONVERT(float, PointTable.Longitude) <= @NELong 
) 
order by HTMRank, NewRank 

这可能不完全准确,我也不会用这个HTMID来计算任何更精确,而不深入到技术细节更深入地 - 但它确实达到了我想要它。