要在Google地图上显示数据,我在SQL Server 2005中拥有> 50k行数据,具有以下(简化)结构
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 :(得分:0)
我最终做的是以下内容:
扩展我的表格以包含给定纬度/经度的Hierarchical Triangular Mesh ID。
PointID
Latitude
Longitude
TypeID
HTMID
HTMID是使用“Using Table Valued Functions in SQL Server 2005 to Implement a Spatial Data Library”空间数据库中的函数生成的,源代码可从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计算更精确的东西而不深入研究技术细节 - 但它确实达到了我想要的目标。