POSTGIS:有效地查询最近点

我有以下问题:我有数百万个条目(地图中的点),我想将它们映射到最近的道路(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();

            }

关于如何加快映射过程的任何想法?


墨色风雨
浏览 491回答 1
1回答

DIEA

该解决方案基于评论(感谢@JGH)。我必须使用<->运算符更改st_distance命令。现在的查询快了近 1000 倍。即,我现在的查询是:String sqlQueryRoad = "SELECT osm_id,highway FROM planet_osm_roads ORDER BY "&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + "way <-> ST_Transform(ST_GeomFromText('POINT ("+ entry.getLongitude() + " "&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; + entry.getLatitude()+ ")',4326), 3857) ASC LIMIT 1;";由于某种原因,而不是geom列,我有与几何相关的way列(我发现的几乎所有帖子都有 geom 列,最好猜测他们更改了 OSM 数据的 osm2pgsql 插入函数)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java