实施"搜索附近的用户"服务器上的功能

时间:2014-11-26 08:17:33

标签: c# algorithm data-structures geolocation

假设我有一个数据库,用于存储城市中不同用户的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()获得。

4 个答案:

答案 0 :(得分:3)

通常这些空间操作是使用空间索引完成的。 R-Tress只是其中一个复杂的例子,但你也可能会得到更简单的例子。只需将整个区域划分为较小的块(例如矩形),然后在适合与给定坐标共享其索引的区域内进行搜索。因此,我建议在服务器上启用空间索引,然后使用空间库,例如GDAL。

因此,如果你有一个坐标(4,5),你首先要看看所有与你的点周围的xd缓冲区相交的矩形。现在,您只需搜索位于这些矩形内的所有几何图形。

编辑: 在SQL Server上,您还可以使用其空间扩展来检索附近的功能(请参阅here)。基本上使用STBuffer在输入几何体周围创建一个缓冲区,然后在该缓冲区上执行交叉。使用描述的空间索引,这些操作非常快。

答案 1 :(得分:2)

如果您是初学者并且想避免使用树木......

  1. 创建支持区域的网格地图

    • 只是一个简单的2D单元网格
    • cell grid
    • 每个单元格的坐标为i,j或索引ix=i+j*ni,其中ni为每i轴的单元格数
    • 因此,对于每个点,您只需计算单元所有权
    • 为每个单元格制作一个点列表
    • 类似的东西:
    • Vector<int> map[nj][ni];
    • 并在单元格内填充点索引...
  2. 比较

    • 计算用户单元位置
    • 并且仅比较该单元格中的点数和8个相邻单元格中的点数......
    • 细胞网格越密集,你的速度越快
    • 如果您的单元格小于比较范围,则比较更多的邻居
    • 安全地覆盖整个范围
    • enter image description here

答案 2 :(得分:1)

如果您使用像Mongo这样的数据存储,地理空间查询非常简单且非常好。以下是Docs

您可以尝试查看类似的内容。这是我用于客户端在最近的项目中下载位置相关数据的原因,它是一个梦想。

编辑要使用Lat和Long查找真实世界中的位置,要在使用距离查询时获得正确的结果,必须使用球形索引

This Question将使用mongo c#驱动程序帮助您解决近端查询问题。

编辑2 在了解了您使用MS SQL之后,这里有一些有用的链接,可以在另一个答案中提供一个Phillip。

Query Spatial Data For Nearest Neighbour
Spatial Data

答案 3 :(得分:1)

好吧,如果要将数据存储在SQL Server中,则使用空间索引http://msdn.microsoft.com/en-us/library/bb934196.aspx