为了账号安全,请及时绑定邮箱和手机立即绑定

POSTGIS:有效地查询最近点

POSTGIS:有效地查询最近点

墨色风雨 2022-07-20 16:27:44
我有以下问题:我有数百万个条目(地图中的点),我想将它们映射到最近的道路(OSM 数据)。我在 java 中实现了一种蛮力方法,在其中查询 OSM 数据库以定位最近的道路,然后将 osm 对象(road-id)分配给相应的条目。然而,这种方法效率低下,因为对每个条目的查询几乎需要 1 秒,这使得整个过程无休止。        PreparedStatement psWithLastPosition = this.conn.prepareStatement(sql);        int i = 0;        for (FCDEntry entry : dataset.getEntries()) {            i += 1;            String sqlQueryRoad = "SELECT osm_id,highway FROM planet_osm_roads ORDER BY "             + "ST_DISTANCE('SRID=4326;"             + ST_SetSRID.setSRID(new ST_MakePoint().createPoint(entry.getLongitude(),entry.getLatitude()), 4326).toString()            + "'::geometry, "             + "ST_Transform(way::geometry,4326)) ASC LIMIT 1;";            PreparedStatement psID = this.conn.prepareStatement(sqlQueryRoad);            ResultSet rs = psID.executeQuery();            String osm_id ="";            while (rs.next()) {                osm_id = rs.getString("osm_id");            }            log.info(osm_id);            PreparedStatement ps = psWithLastPosition;            ps.setString(1, entry.getAssetId());            ...            ps.setInt(18, Integer.valueOf(osm_id));            ps.addBatch();            // Execute every 1000 items            if (i % 1000 == 0 || i == dataset.getEntries().size()) {                log.info(i + "/" + dataset.getEntries().size());                psWithLastPosition.executeBatch();                psWithoutLastPosition.executeBatch();            }关于如何加快映射过程的任何想法?
查看完整描述

1 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

该解决方案基于评论(感谢@JGH)。


我必须使用<->运算符更改st_distance命令。现在的查询快了近 1000 倍。


即,我现在的查询是:


String sqlQueryRoad = "SELECT osm_id,highway FROM planet_osm_roads ORDER BY " 

                    + "way <-> ST_Transform(ST_GeomFromText('POINT ("+ entry.getLongitude() + " " 

                    + entry.getLatitude()+ ")',4326), 3857) ASC LIMIT 1;";

由于某种原因,而不是geom列,我有与几何相关的way列(我发现的几乎所有帖子都有 geom 列,最好猜测他们更改了 OSM 数据的 osm2pgsql 插入函数)。


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 488 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信