文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处: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/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^