文章版權由做者李曉暉和博客園共有,若轉載請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/sql
在上一篇博客中我提到了格網編碼的兩個優勢:緩存
可是,實際項目上,這種優化效果明顯嗎?微信
select * from tc_geo_address a where a.coordinate_x>504625 and a.coordinate_x<504825 and a.coordinate_y>309858 and a.coordinate_y<310058
select * from tc_geo_address a where a.grid_code=3300000110
其中coordinate_x和coordinate_y以及grid_code上都創建了索引 對比結果:markdown
表大小 | 範圍查詢 | 單個編碼查詢 |
---|---|---|
2K條 | 0.002S | 0.002S |
17W條 | 1.08S | 0.84S |
爲了提升緩存命中度,咱們以單個格網編碼爲主鍵進行緩存:app
/*** * 經過傳入網格編碼進行搜索,提供緩存功能 * @param gridcodefield * @param gridcode * @return */ @Cacheable(value="cacheOneHour",key="'getaddcode'+#gridcode+#gridcodefield") public List<GeoAddress> getAddressBySingleCode(String gridcodefield,String gridcode){ try{ if(gridcodefield.equals("")){ gridcodefield="Grid_Code"; } String sql=gisConfigManager.getSQL("GeoCode.GeoCodeReverseGridCode"); sql+=" where "+gridcodefield+"="+gridcode; return jdbcTemplate.query(sql,new Object[]{},new DataRowMapper(GeoAddress.class)); }catch(Exception e){ return null; } }
List<Long> searchResult=GridCodeUtils.GridCodeSearch(OperConst.MapBounds.get(0), OperConst.MapBounds.get(1), x, y, gridsize, gridsize, radius); if(searchResult==null){ LogUtils.error("查詢地理編碼結果爲空!", logger,null); return null; } //分開利用code查詢是爲了充分製造緩存命中 for(int i=0;i<searchResult.size();i++){ List<GeoAddress> temAddList=cacheManager.getAddressBySingleCode(gridHashField,searchResult.get(i).toString()); if(temAddList!=null&&temAddList.size()>0){ list.addAll(temAddList); } }
以上僅僅是根據座標去進行過濾查詢。若是附帶上對查詢結果的進一步條件篩選呢? 這類狀況分幾種狀況進行討論。工具
好比:查詢條件永遠都是離目前範圍500M的視頻。
那麼針對編碼查詢時同樣能夠歸入緩存機制中。測試
好比:查詢條件會不斷變化,多是500M內的視頻,多是500M內的井蓋等等。能夠先進行格網編碼查詢並緩存,再對查詢結果依據查詢條件進行過濾:優化
//由於address常常變化,不利於緩存,因此用代碼進行過濾 if(address!=""){//查詢條件過濾 List<GeoAddress> addlist=new ArrayList<GeoAddress>(); for(int i=0;i<list.size();i++){ GeoAddress addressObj=list.get(i); if(addressObj.getAddress().contains(address)){ addlist.add(addressObj); } } }
此時緩存機制可能致使數據不是最新的,依然需sql進行查詢。ui
當咱們想使用編碼機制而存入的數據只有XY沒有編碼值時,這裏咱們針對性開發了一個地理編碼賦值工具:
編碼
-----歡迎轉載,但保留版權,請於明顯處標明出處:http://www.cnblogs.com/naaoveGIS/
若是您以爲本文確實幫助了您,能夠微信掃一掃,進行小額的打賞和鼓勵,謝謝 ^_^