我有以下问题:我有数百万个条目(地图中的点),我想将它们映射到最近的道路(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 插入函数)。
添加回答
举报
0/150
提交
取消