亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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條經驗 獲得超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 插入函數)。


查看完整回答
反對 回復 2022-07-20
  • 1 回答
  • 0 關注
  • 523 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號