C# 实施";“搜索附近的用户”;服务器上的函数

C# 实施";“搜索附近的用户”;服务器上的函数,c#,algorithm,data-structures,geolocation,C#,Algorithm,Data Structures,Geolocation,假设我有一个数据库,存储一个城市中不同用户的1000000个地理位置。如果我使用一个列表或数组来保存所有地理位置并逐个比较距离,那么服务器执行SearchNearbyUsers(myLocation,50)命令将非常痛苦 服务器是用C#和Web API 2编码的。是否有专门为地理位置进行此类计算而设计的库 如果没有可用的库,应使用什么样的数据结构来简化计算?我以前看过,但老实说,我不清楚逻辑,它似乎相当复杂 这是geolocation类的外观: public class GeoLocation

假设我有一个数据库,存储一个城市中不同用户的1000000个地理位置。如果我使用一个列表或数组来保存所有地理位置并逐个比较距离,那么服务器执行SearchNearbyUsers(myLocation,50)命令将非常痛苦

服务器是用C#和Web API 2编码的。是否有专门为地理位置进行此类计算而设计的库

如果没有可用的库,应使用什么样的数据结构来简化计算?我以前看过,但老实说,我不清楚逻辑,它似乎相当复杂

这是geolocation类的外观:

public class GeoLocation
{
    public float latitude { get; set; }
    public float longitude { get; set; }
}

纬度和经度都由客户端发送。值是通过获取的。

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

所以如果你有一个坐标(4,5),你首先看一下所有的矩形,它们在你的点周围与一个缓冲区witdh x相交。现在你只需搜索那些矩形中的所有几何图形

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

如果您使用的是Mongo之类的数据存储,那么地理空间查询非常简单,也非常好。这是你的电话号码

你可以试着调查类似的事情。这是我在最近的一个项目中为客户下载与位置相关的数据所用的工具,它可以实现一个梦想

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

将使用mongo c#驱动程序帮助您完成近距离查询

编辑2了解您使用MS SQL后,以下是一些有用的链接,可以与Phillip在另一个答案中提供的一个链接一起使用



如果您将数据存储在SQL Server中,您应该使用空间索引

如果你是初学者,想避免使用树

  • 创建受支持区域的栅格地图

    • 只是一个简单的二维网格
    • 每个单元都有其坐标
      i,j
      或索引
      ix=i+j*ni
      ,其中ni是每个
      i
      轴的单元数
    • 因此,对于每个点,您可以简单地计算单元所有权
    • 列出每个单元格的点
    • 比如:
    • 矢量地图[nj][ni]
    • 并用单元格内的点索引填充列表
  • 比较

    • 计算用户小区位置
    • 只比较该单元格和8个相邻单元格中的点
    • 单元格网格越密集,速度就越快
    • 如果您的单元格较小,则比较范围较小,然后比较更多的邻居
    • 安全地覆盖整个范围

  • 如果这两个用户实际上彼此非常接近,但位于不同的空间块中,该怎么办?@Aldorcheng,R-树的设计就是为了避免这种问题。。。查询机制将保证您能找到给定空间区域中的每个对象(存储在树中)。它们通常是数据库系统中空间索引的核心:)这就是为什么我写了一篇文章,看看与缓冲区相交的矩形。因此,一个点最多可以有四个矩形(比搜索整个区域要少得多)。它适用于MS SQL server吗?遗憾的是,MongoDB本身就是一个数据库。您是否与MS SQL紧密相连?您在使用MS SQL处理地理空间查询时遇到了障碍。Mongo甚至不是唯一的选择。有很多数据库对地理空间查询的支持比MS Sql好得多。感谢您提供的信息。MS SQL现在似乎正在添加更多处理空间数据的功能。我指的是PhillipH发布的链接。这里有更多信息。我将用更多的链接更新我的答案。如果所有地理位置数据最初都存储在数据库中,而不是存储在代码中定义的字典中,该怎么办?@Aldorcheng您只需编写一个遍历所有点的for循环,并在实现添加/删除点例程之前用点索引填充地图…@Aldorcheng是唯一有意义的缺点是删除点需要更新比删除的点索引大的所有点索引,方法是将其减一。。。在所有细胞中。但这可以通过在点列表中添加_deleted标志来避免……如果您使用的是MongoDB或MySQL之类的数据库系统,它可以为您完成这项工作,您只需先进行设置。对于MySQL,请仔细阅读本章:。否则(我希望你有一个很好的理由不这样做),R-树是一条路要走,你必须研究它们!