假设我有一个数据库,用于存储城市中不同用户的1000000个地理位置。如果我使用列表或数组来保存所有地理位置并逐个比较距离,那么服务器执行命令SearchNearbyUsers(myLocation, 50)
会很痛苦。
服务器使用Web API以C#编码。是否有任何用于使用地理位置进行此类计算的库?
如果没有可用的库,应该使用什么数据结构才能使计算更容易?我之前看过R-tree,但说实话,我不明白逻辑,而且看起来很复杂。
这就是地理位置类的样子:
public class GeoLocation
{
public float latitude { get; set; }
public float longitude { get; set; }
}
纬度和经度均由客户发送。值通过navigator.geolocation.getCurrentPosition()
获得。
答案 0 :(得分:3)
通常这些空间操作是使用空间索引完成的。 R-Tress只是其中一个复杂的例子,但你也可能会得到更简单的例子。只需将整个区域划分为较小的块(例如矩形),然后在适合与给定坐标共享其索引的区域内进行搜索。因此,我建议在服务器上启用空间索引,然后使用空间库,例如GDAL。
因此,如果你有一个坐标(4,5),你首先要看看所有与你的点周围的xd缓冲区相交的矩形。现在,您只需搜索位于这些矩形内的所有几何图形。
编辑: 在SQL Server上,您还可以使用其空间扩展来检索附近的功能(请参阅here)。基本上使用STBuffer在输入几何体周围创建一个缓冲区,然后在该缓冲区上执行交叉。使用描述的空间索引,这些操作非常快。
答案 1 :(得分:2)
如果您是初学者并且想避免使用树木......
创建支持区域的网格地图
i,j
或索引ix=i+j*ni
,其中ni为每i
轴的单元格数Vector<int> map[nj][ni];
比较
答案 2 :(得分:1)
如果您使用像Mongo这样的数据存储,地理空间查询非常简单且非常好。以下是Docs
您可以尝试查看类似的内容。这是我用于客户端在最近的项目中下载位置相关数据的原因,它是一个梦想。
编辑要使用Lat和Long查找真实世界中的位置,要在使用距离查询时获得正确的结果,必须使用球形索引
This Question将使用mongo c#驱动程序帮助您解决近端查询问题。
编辑2 在了解了您使用MS SQL之后,这里有一些有用的链接,可以在另一个答案中提供一个Phillip。
答案 3 :(得分:1)
好吧,如果要将数据存储在SQL Server中,则使用空间索引http://msdn.microsoft.com/en-us/library/bb934196.aspx。