Postgresql:在距离海岸的距离内找到道路终点

时间:2015-11-12 10:22:10

标签: postgresql postgis

我在一个表中有2.2M线几何(道路),在另一个表中有1500线几何(海岸线)。两个表都有空间索引。 我需要找到距离海岸一定距离的道路的终点,并将点几何与距离一起存储。 当前的解决方案似乎效率低下,并且需要花费很多时间才能在非常快的机器上完成;

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

执行两次INSERT INTO操作,一次用于起点,一次用于端点; 选择几何和距离,使用ST_DISTANCE从点到海岸线,使用WHERE ST_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 个答案:

答案 0 :(得分:0)

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

您需要使用EXPLAIN检查执行计划,以便在海岸线表上进行Seq Scan并在路线表上进行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)
    );