1.1 传统流程
在⼀般情况下,⼈们使⽤PostGIS存储空间数据,以Geoserver发布数据服务,以OpenLayer客户端展⽰地图。客户端操作与地理查询,如果查询等⽐较复杂,⼀般会使⽤ajax将ol的请求参数传给后台,由后台完成操作
1.2 框架问题说明
1 GeoServer只是简单发布了地理数据,单个图层,只能接受简单的wms显⽰,wfs查询,wps分析。产⽣的问题是,⾯对多个图层的叠加分析与查询,⼏乎做不到,所以很多图层的分析只能交由后台服务器完成。2 使⽤后台服务器处理地理数据,产⽣的问题是,对数据库的访问⽐较频繁,分析的结果,由于是空间数据,对数据的解析存储有要求,⼯作量增⼤。
3 作为GIS专业开发⼈员的苦恼是我曾加⼊⼀个j2ee项⽬组,作为Java的门外汉,我做⼀个哪怕最简单的查询,都要写好多个java类⽂件与数据结构类⽂件,为了满⾜j2ee框架需求。这令我感到很苦恼,在我看来,作⼒。能不能有个gis开发框架,使我专注于地理数据的查询与分析⽽脱离业务框架本⾝的束缚,这让我感到很有必要。
⼆ 独⽴于业务的地理数据操作框架
结构说明:1 复杂的多图层的分析,全是在数据库中以function脚本编写。
2 geoserver发布要显⽰地图表。发布function作为视图参数。 对geoserver来说,table,view,function本质都是数据源,是⼀样的,所以都可以发布。3 使⽤时,普通的表⽤来显⽰地图,function⽤来分析地图。
优势:⽆论加⼊哪个项⽬组,我根本不⽤关⼼他们的框架与数据结构,集成时,⾃⼰负责地图,业务负责业务,各司其职。原来后台服务全被改写到数据库中,这样,在运算速度上也⽐驱动的快且少了⼀个额外的后台。
三 框架使⽤⽰例
以最最简单的需求作为说明⽰例:
需求: 我要根据道路名称,查询道路某个距离的缓冲区内的兴趣点。3.1 实现具体分析功能的数据库function脚本[sql] view plain copy print?
1. CREATE OR REPLACE FUNCTION queryplottingbyroad( 2. IN roadname text,
3. in distance double precision, 4. OUT gid int,
5. OUT shapearea double precision, 6. out swglm text, 7. out idcode text, 8. out gljg_dm text,
9. out editdate timestamp without time zone, 10. out geom geometry 11. )
12. returns SETOF record AS
13. $BODY$ 14. DECLARE 15. queryGeom geometry; 16. rec record; 17. sql text; 18. BEGIN 19. --依据道路名称查询道路图形 20. sql:='select geom from road where name='''||roadname||''''; 21. raise notice 'sql:%',sql; 22. EXECUTE sql into rec; 23. --对查询的道路进⾏缓冲 24. queryGeom:=ST_Buffer(rec.geom,distance); 25. --查询落在缓冲区内或与缓冲区相交的指定图层数据 26. sql:='select * from plottingwithqx t where ST_Within(t.geom,ST_GeomFromText('''||st_astext(queryGeom)||''',3857)) or ST_Intersects(t.geom,ST_GeomFromText('''||st_astext(queryGeom)||''',3857))'; 27. raise notice 'sql:%',sql; 28. --查询数据搜集返回调⽤者 29. for rec in execute sql loop 30. gid:= rec.gid; 31. shapearea:= rec.shapearea; 32. swglm:= rec.swglm; 33. idcode:= rec.idcode; 34. gljg_dm:= rec.gljg_dm; 35. editdate:= rec.editdate; 36. geom:= rec.geom; 37. return next; 38. end loop; 39. return; 40. END; 41. $BODY$ 42. LANGUAGE 'plpgsql' VOLATILE STRICT; CREATE OR REPLACE FUNCTION queryplottingbyroad(IN roadname text, in distance double precision, OUT gid int, OUT shapearea double precision, out swglm text, out idcode text, out gljg_dm text, out editdate timestamp without time zone, out geom geometry)returns SETOF record AS$BODY$DECLARE queryGeom geometry; rec record; sql text;BEGIN --依据道路名称查询道路图形 sql:='select geom from road where name='''||roadname||''''; raise notice 'sql:%',sql; EXECUTE sql into rec; --对查询的道路进⾏缓冲 queryGeom:=ST_Buffer(rec.geom,distance); --查询落在缓冲区内或与缓冲区相交的指定图层数据 sql:='select * from plottingwithqx t where ST_Within(t.geom,ST_GeomFromText('''||st_astext(queryGeom)||''',3857)) or ST_Intersects(t.geom,ST_GeomFromText('''||st_astext(queryGeom)||''',3857 raise notice 'sql:%',sql; --查询数据搜集返回调⽤者 for rec in execute sql loop gid:= rec.gid; shapearea:= rec.shapearea; swglm:= rec.swglm; idcode:= rec.idcode; gljg_dm:= rec.gljg_dm; editdate:= rec.editdate; geom:= rec.geom; return next; end loop; return;END;$BODY$LANGUAGE 'plpgsql' VOLATILE STRICT;3.2 Geoserer发布function在 图层》发布视图服务中发布⼀个视图服务,具体参照geoserver官⽹。3 客户端调⽤以wms查询为例:[plain] view plain copy print?1. http://localhost:8090/geoserver/nkstarTax/wms?LAYERS=nkstarTax:queryPlottingbyroad&TRANSPARENT=TRUE&VIEWPARAMS=name:'东⽅红路';distance:100&BBOX=1.3304724687752E7,38128.1757509,1.33235855208E7,38291.4938807&WIDTH=512&HEIGHT=434&SRS=EPSG:900913&format=image/png&SERVICE=WMS&VERhttp://localhost:8090/geoserver/nkstarTax/wms?LAYERS=nkstarTax:queryPlottingbyroad&TRANSPARENT=TRUE&VIEWPARAMS=name:'东⽅红路';distance:100&BBOX=1.3304724687752E7,38128.1757509,1.33235855208viewparams是客户端把参数放这个⾥⾯,传给geoserver,然后服务器解析参数,查询数据库并返回结果。上⽅的url请求返回 道路名称为'东⽅红路'的100⽶范围内的查询图层的符合要求数据。查询 200⽶范围内的指定图层符号要求数据[plain] view plain copy print?
1. http://localhost:8090/geoserver/nkstarTax/wms?LAYERS=nkstarTax:queryPlottingbyroad&TRANSPARENT=TRUE&VIEWPARAMS=name:'东⽅红
路';distance:200&BBOX=1.3304724687752E7,38128.1757509,1.33235855208E7,38291.4938807&WIDTH=512&HEIGHT=434&SRS=EPSG:900913&format=image/png&SERVICE=WMS&VER
http://localhost:8090/geoserver/nkstarTax/wms?LAYERS=nkstarTax:queryPlottingbyroad&TRANSPARENT=TRUE&VIEWPARAMS=name:'东⽅红路';distance:200&BBOX=1.3304724687752E7,38128.1757509,1.33235855208
效果如下,范围扩⼤之后,多了⼀条记录。
使⽤wfs查询也是⼀样的,使⽤viewparams将参数传给服务器,服务器查询数据库。
总的来说,将传统流程的复杂分析,摒弃了后台,直接放在数据库中的function中完成,由geoserver作为后台,响应客户端请求,⽆论wms,wfs都可以,并根据参数返回图⽚或数据。
后续⼩编的主要精⼒放到GIS理论开发知识的⼤众化的道路了,通过浅显易懂的语⾔,结合多年⾏业应⽤开发,通过微信订阅号传播(每周更新三篇⽂章及相关GIS编码知识),为GIS的发展尽微博之⼒。维码,感兴趣的可以交流沟通!⽂章来源:http://blog.csdn.net/freeland1/article/details/42171949
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务