当前位置: 首页 > 知识库问答 >
问题:

Postgreql:查找距离海岸的道路终点

茅华灿
2023-03-14

我在一个表中有2.2M的线路几何图形(道路),在另一个表中有1500条线路几何图形(海岸线)。两个表都有一个空间索引。我需要找到距离海岸一定距离内的道路endpoint,并将点几何体与距离一起存储。目前的解决方案,似乎是无效的,需要很多小时才能完成一个非常快的机器;

使用ST_STARTPOINT、ST_ENDPOINT和ST_DWITHIN创建临时表,其中包含距离内道路几何图形的起点和终点。为临时表中的两个几何图形列创建空间索引。

执行两个INSERT INTO操作,一个用于起点,一个用于终点;选择几何形状和距离,使用从点到海岸线的ST_DISTANCE和WHEREST_DWITHIN仅考虑所选距离内的点。

代码大致如下所示:

create temp table roadpoints_temp as select st_startpoint(road.geom) as geomstart, st_endpoint(road.geom) as geomend from 
    coastline_table coast, roadline_table road where st_dwithin(road.geom, coast.geom, 100);

create index on roadpoints_temp (geomstart);

create index on roadpoints_temp (geomend);

create table roadcoast_points as select roadpoints_temp.geomstart as geom, round(cast(st_distance(roadpoints_temp.geomstart,kyst.geom) as numeric),2) as dist 
    from roadpoints_temp, coastline_table coast where st_dwithin(roadpoints_temp.geomstart, coast.geom, 100);

insert into roadcoast_points select roadpoints_temp.geomend as geom, round(cast(st_distance(roadpoints_temp.geomend,kyst.geom) as numeric),2) as dist 
    from roadpoints_temp, coastline_table coast where st_dwithin(roadpoints_temp.geomend, coast.geom, 100);

drop table roadpoints_temp;

欢迎所有意见和建议:-)

共有1个答案

毛景曜
2023-03-14

您需要有效地利用您的索引。似乎最快的计划是为每个海岸找到所有距离之内的道路。分别进行两次重新检查意味着你失去了与道路最近的海岸线的连接,需要一次又一次地重新找到这对海岸线。

您需要使用EXPLAIN检查您的执行计划,以便对海岸线表进行序列扫描,并对道路表进行GiST索引扫描。

select road.* 
from coastline_table coast, roadline_table road
where 
    ST_DWithin(coast.geom, road.geom, 100) -- indexed query    
    and -- non-indexed recheck
    (
        ST_DWithin(ST_StartPoint(road.geom), coast.geom, 100)
        or ST_DWithin(ST_EndPoint(road.geom), coast.geom, 100)
    );
 类似资料:
  • 二叉搜索树(BST)中节点的深度与其与根的距离相同吗?我想是的,但我不确定。我相信距离是树的一般概念,深度是应用于BST的概念。

  • 距离查询 距离查询,是指查询指定几何对象一定距离范围内的地物。对于点几何对象,则查询以该点为圆心,以距离为半径画圆,落在该圆形范围内的地物;对于线和面几何对象,则查询距离对象边界一定范围内的地物。 以 World 数据服务为例。使用接口 ol.supermap.QueryService 在图层 “Capitals@World.1” 中查找距离指定点为10度(地图坐标单位)的矢量要素。 // 添加查

  • 我需要一个算法来找到地图上两点之间的最短路径,其中道路距离由一个数字表示。 给出的内容:开始城市A目的地城市Z 城市间距离列表: A-B: 10 F-K: 23 R-M: 8 K-O: 40 Z-P: 18 J-K: 25 D-B: 11 M-A: 8 P-R: 15 我想我可以用Dijkstra的算法,但是它能找到到所有目的地的最短距离。不仅仅是一个。 如有任何建议,我们将不胜感激。

  • 问题内容: 选项 询问 我有一个包含4列的数据库表: 唯一身份 城市名 纬度(纬度) 经度(lng) 我在顶部使用查询返回距指定坐标距离指定英里数内的位置。它似乎可行,但我不确定它的准确性如何。我很想知道查询是否很好,或者您是否有更好的解决方案。 问题答案: 看起来像是正确的大圆距查询。 您对WRT的准确性有何看法?

  • 范围查询。将距离特定节点3跳以内的所有me节点(及其距离) 带来特定节点和一组节点之间的最短路径(BFS)距离(因为图是无向且未加权的)。 带来特定节点和所有其他图节点之间的最短路径(BFS)距离。 如果这些类型的查询实际上是可能的,没有递归类型实现,而是直接来自Cypher,那么我应该期望什么样的性能(几秒钟、几秒钟或几分钟)?

  • 问题: 这是LeetCode的问题: 给定一个整数数组,返回所有对之间的 k 个最小距离。一对(A,B)的距离定义为A和B之间的绝对差。 例子: 我的问题 我用一个简单的方法解决了它O(n^2),基本上我找到所有的距离并对其进行排序,然后找到第k个最小的。现在这是一个更好的解决方案。这不是我的代码,我在leetcode的讨论论坛上找到了它。但是我很难理解代码的关键部分。 下面的代码基本上是在做一个