2

我有一个应用程序,用户将他们的通勤路线存储在我们的数据库中。

路线存储为折线(线串)。数据库还存储事故、交通事故之类的东西。我们需要定期查询一条路线,以查看该路线 1k 半径内是否有任何事件。

查询的连接结构如下:

    Route r left outer join Incident i on
    r.PolyLine.STDistance(i.Location) < 1000

现在我也尝试了这样的事情:

Route r left outer join Incident i on   
r.PolyLine.STBuffer(1000).STIntersects(i.Location) = 1

到目前为止,我们为提高速度所做的尝试是:

  1. 减少沿线串的点数
  2. 添加空间索引(虽然我不知道如何调整它)

1)上述工作但还不够好,这让我相信该事件正在与路线上的每个点进行比较,这似乎真的效率低下。

我们正在考虑将长纬度作为几何与地理的对比,因此我们可以访问 Bounding Box 并获得 STContains。

还考虑在检查事件之前在 PolyLine 上调用 reduce。

4

1 回答 1

2

我建议几何存储。在这种情况下,去地理的好处似乎并没有超过成本。

空间索引非常重要。通过使用适当调整的空间索引,我使用空间查询的一个过程从约 15 分钟到约 1 分钟。但是,我还没有找到关于自动获得最佳设置的好方法的文档。我已经回答了关于空间索引调整的类似问题。我为每个数据集提供的存储过程需要一段时间,但可以在您做其他工作时在后台运行。

就您的查询而言,我设置了一个不同的查询并将其性能与您在上面提供的两个进行比较。通过将路线缓冲区放入几何变量并在空间比较中使用该变量,性能似乎有所提高。我这样做的原因是它只需要创建一次缓冲区(或评估距离),而不是为其比较的每一行创建一次。你可以试试这个,看看你会得到什么结果。

DECLARE @routeBuff geometry
SET @routeBuff = (SELECT r.PolyLine.STBuffer(1000) FROM route r WHERE recordID = 2778) --how ever you select the particular route

SELECT
    *
FROM
    incident i
WHERE
    i.location.STIntersects(@routeBuff) = 1
于 2013-04-08T15:41:39.173 回答