【问题标题】:Searching nearest neighbour in same Table GIS Postgrsql在同一个表QGIS Postgresql中搜索最近的邻居
【发布时间】:2020-07-15 07:55:39
【问题描述】:

我们在数据库中有一个包含地理位置的单个树木的数据库,我们似乎有一个几何点,该点由经纬度组合而成,命名为estimated_geometric_location。我们每月都会定期更新这些树。我想获得具有两个属性的树列表。我正在寻找确定特定树的最可能更新,即。当来自一个跟踪事件的一组新树出现时,我们需要运行一个例程,建议日期条目 x.2 是数据点 x.1 的更新。理想情况下,此例程然后更新新数据点(子),添加较旧的母数据点,然后希望代表同一棵树。

到目前为止,我有类似的东西,但数据库没有响应(或者我等待的时间不够长......到目前为止等了大约 10 分钟)

SELECT
     i.id
    ,ST_Distance(i.estimated_geometric_location, i.b_estimated_geometric_location) AS dist
FROM(
SELECT
     a.id
    ,b.id AS b_id
    ,a.estimated_geometric_location
    ,b.estimated_geometric_location AS b_estimated_geometric_location
    ,rank() OVER (PARTITION BY a.id ORDER BY ST_Distance(a.estimated_geometric_location, b.estimated_geometric_location)) AS pos
FROM trees a, trees b 
WHERE a.id <> b.id) i
WHERE pos = 1

如果能就此获得一些想法会很棒。我从某处的帖子中得到了这个并对其进行了改编,但到目前为止还没有运气。

【问题讨论】:

标签: postgresql postgis


【解决方案1】:

有几件事要提一下。如果数据来自跟踪事件,为什么要相互比较现有的树?我希望有类似的东西

SELECT id
FROM trees
ORDER BY st_distance(estimated_geometric_location, st_makepoint(15, 30))
LIMIT 1

它返回最接近经度 15 和纬度 30 的点的树。看看你是否需要做那个连接。


假设您这样做了,这样的查询的问题就是复杂性。如果您的数据库中有任何数量(例如 1000 棵)树,那么您实际上是在计算 1000 棵树与其所有 999 棵树之间的距离,计算出 999.000 个距离!只是说如果A和B之间的距离与B和A之间的距离相同,那么您应该可以通过说a.id &lt; b.id将它们剃掉一半。

此外,想想你在做什么。您想找到任意两棵树之间的最小距离以及与该距离相对应的树的 id,对吗?只要您知道它们不是最小距离,就无需计算任何距离。

SELECT a.id, b.id, ST_Distance(a.estimated_geometric_location, b.estimated_geometric_location)) distance
FROM trees a, trees b 
WHERE a.id < b.id
ORDER BY distance
LIMIT 1

到达那里的方式要简单得多,而且对我来说也快得多。

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 2018-06-16
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多