我有以下問題:我有數百萬個條目(地圖中的點),我想將它們映射到最近的道路(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條經驗 獲得超3個贊
該解決方案基于評論(感謝@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
提交
取消