1

鉴于这种情况:

  1. 我们在全球有 1,000,000 个点,由经度和纬度指定;
  2. 我们有一个基于点 pc(由经度和纬度指定)和半径 rc 的圆 c
  3. 我们想要有效地确定哪些点在圆中

我正在使用 C# 和存储在 SQL Server 2008 中的位置进行开发。

所以在我看来,我有以下 3 个选项:

  1. 将位置存储为经度纬度浮点数并在 C# 中执行计算。

  2. 将位置存储为地理数据类型并在 SQL Server 2008 中执行计算,如下所示:

    CREATE TABLE UserLocations
    [UserId] [bigint] NOT NULL,
    [CurrentLocation] [geography] NOT NULL
    
    ALTER PROCEDURE sp_GetCurrentUsersInRange
    @userPoint geography, 
    @RangeInMeters int
    AS
    BEGIN
    
    select  UserId from UserLocations
    where @userPoint.STDistance(CurrentLocation) <= @RangeInMeters
    and UserId <> @userId
    
    END
    

    缺点:在 LinqToSQL 和 LinqToEntities 中使用地理数据存在问题。

    优点:对大数据使用 dbms 处理能力,以及使用 SQL Server 空间索引。

3.使用一些网络服务,如谷歌的地理定位和计算服务。到目前为止,我还没有找到这样的网络服务。

你认为哪个效率最高?请证明你的回答。

谢谢

4

2 回答 2

1

我天真的方法是在点 pc 周围定义一个纬度/经度边界框,并使用BETWEEN这些框坐标从数据库中进行选择。据统计,大约 79% 的通过该测试的点将在圆圈内。对代码的简单检查将清除圆圈外的代码。

我说幼稚是因为我不熟悉 SQL Server 的几何功能。

于 2012-04-18T15:53:23.037 回答
0

作为使用几何圆的替代方法,您可以选择距圆中心一定距离(使用 STDistance)内的所有记录。但我不知道它是否会比您列出的交叉路口解决方案更快或更慢。

如果 100,000 个点是静态的,您可能会在 C# 中编写代码,将列表加载到内存中并使用边界框来最小化距离计算的使用(即,Haversine)。它可能会更快,因为您正在最小化 I/O。

但是,如果这些点不是静态的(或者您将它们存储在 SQL Server 中),我会选择使用 SQL Server,这样会容易得多。您肯定想要创建正确的空间索引。SQL Server 的空间索引非常好,您可能会发现它甚至可以胜过我上面列出的内存解决方案。

我没有将 LINQ 用于此类工作,我通常使用 SqlConnection 和 Reader 进行老式操作。我读过 LINQ 与 Spatials 混合是一个问题。

我不知道谷歌,他们有这样的网络服务吗?

于 2012-04-18T15:28:10.283 回答