OpenLayers 3+Geoserver+PostGIS实现点击查询
WebGIS开发中,点击查询是最经常使用的一种查询方式,在ArcGIS api 中。这样的查询叫IdentifyTask,主要作用是前台提交參数。交ArcServer查询分析返回。
本文从开源框架的角度。从前台到服务端到数据库等多个角度,多种方式实现点击查询。
干货例如以下:
1.1 Select控制器
对于矢量数据,Ol3中的官网demo提供了一个Select控件,实现鼠标的选择查询。代码例如以下:
//定义select控制器
var select= new ol.interaction.Select();
map.addInteraction(select);//map载入该控件。默认是激活可用的
select.on('select', function(e) {
console.log(e.selected); //打印已选择的Feature
});
详细Example參考:http://openlayers.org/en/v3.14.2/examples/select-features.html?q=Select
1.2 map的click事件
该方法,通过鼠标点击的坐标,与当前矢量图层做相交分析查询。得到查询的要素及其所属的Layer对象
//地图单机事件
map.on('singleclick',mapClick);
function mapClick(e){
var pixel = map.getEventPixel(e.originalEvent);
var featureInfo = map.forEachFeatureAtPixel(pixel,
function (feature, layer) {
return {feature:feature,layer:layer};
});
if (featureInfo!==undefined&&featureInfo!==null
&&featureInfo.layer!==null)
{
console.log('打印选择要素');
console.log(featureInfo .feature);
console.log('打印选择要素所属Layer');
console.log(featureInfo .layer);
}
}
1.3 WMS图层的GetFeatureInfo
对于矢量图层,我们能够通过第一,另外一种方法实现点击查询。
可是。非常多时候我们底图是wms服务,这时候我们能够通过wms协议的GetFeatureInfo实现点点选查询。
//模拟查询的wms图层名称比方是wmsLayer
//该wmsLayer的数据源是墨卡托的3857举例
map.on('click',mapClick);
function mapClick(evt){
var viewResolution = map.getView().getResolution();
var url = wmsLayer.getSource().getGetFeatureInfoUrl(
evt.coordinate, viewResolution, 'EPSG:3857',
{
'INFO_FORMAT': 'text/javascript',//geoserver支持jsonp才干输出为jsonp的格式
'FEATURE_COUNT': 50 //点击查询能返回的数量上限
});
$.ajax({
type: 'GET',
url:url,
dataType: 'jsonp',
jsonp:'format_options',
jsonpCallback:"callback:success_jsonpCallback"
});
}
//回调函数接收查询结果
var geojsonFormat=new ol.format.GeoJSON({defaultDataProjection:"EPSG:3857"});
function success_jsonpCallback(res)
{
var features=geojsonFormat.readFeatures(res);
console.log('点击查询返回的结果例如以下:');
console.log(features);
}
1.4 通过Geoserver的wfs查询
wfs能够通过Filter提交条件或者图形进行属性查询或者空间查询,本段用干货来表达怎样使用wfs查询。
map.on('click',mapClick);
//点击地图查询
function mapClick(evt)
{
var coor=evt.coordinate;
coor=coor.join(',');
//注意这里直接将点坐标提交,与图层做intersrct分析。对于面图层是没关系的。如果是查询,点或者线图形,一定要将coor先设置一个容差,经行buffer之后的图形。再去与图层叠加分析。不设置容差差点儿就找不到了
//图层的图形字段是geom。不同图层的图形字段都要自己先看下自己的,有的是the_geom。有的是shape等等,详细分析就可以。
var FILTER='<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"><Intersects><PropertyName>geom</PropertyName><gml:Point><gml:coordinates>'+coor+'</gml:coordinates></gml:Point> </Intersects></Filter>';
getFeature({
typename:'road:road_grid',//查询的服务图层名称
filter:FILTER,//查询条件
callback:'getIdentifyroadGrid'//查询的回调函数
});
}
var geojsonFormat=new ol.format.GeoJSON({defaultDataProjection:"EPSG:3857"});
function getIdentifyroadGrid(res)
{
var features=geojsonFormat.readFeatures(res);
console.log('点击查询返回的结果例如以下:');
console.log(features);
}
//请求wfs数据
function getFeature(options)
{
$.ajax(gisserverhost+'geoserver/wfs',{
type: 'GET',
data: {
service: 'WFS',
version: '1.1.0',
request: 'GetFeature',
typename: options.typename,
srsname: options.srid,
outputFormat: 'text/javascript',
viewparams:options.viewparams,
bbox:(options.extent===undefined)?undefined:options.extent.join(',') + ','+options.srid,
filter:options.filter
},
dataType: 'jsonp',
jsonpCallback:'callback:'+options.callback,
jsonp:'format_options'
});
}
1.5 通过PostGIS实现点击查询
pg的方法真要用起来应该是最简单的。就是将点击的地理坐标发送到后台提交数据库运行下。
//其它省略。如果x,y是前台点击地图获取的坐标,坐标系如果仅仅3857。
//这里如果后台获取了參数拼接sql提交数据库
运行sql例如以下: select * from t where ST_Intersect(t.geom,ST_GeomfromText('Point(x y)',3857));
完成。
总结
触类旁通,融会贯通,一个问题的解决一定有非常多方式,并不是“自古华山一条路”。当然,不同的路的目的同样,风景当然是各异。
我们已经起码能使用5种方法去获取点击查询的结果。那么一般人就会疑问,5种方法到底谁好谁坏了? 事实上方法没有好坏,仅仅有是否合适。
1 第一种,另外一种方法:矢量数据。一定要加到map的client,才干使用,如果是wms图层就不能用了。
2 第三种方法:wms图层,这时候前两种矢量方式没法处理,第三种方法就能够解决问题。
3 第四种方法:一二三不管矢量还是wms。都是要载入到client才干使用,但有时候因需求不同导致的,Geoserver公布的图层不载入到client,那么就都不能使用了。但仅仅要被公布了。通过wfs的url请求就一定能查询到结果。即使这个查询对象不在client而在服务端。
4 第五种方法:与第四种方法一样。由于业务需求不同导致,有时数据连公布都没公布,仅仅停留在数据库中。而要求能够查询,这时候第五个方法就可以。当然数据库中的方法,一般用在大数据量,复杂事务查询中使用较好。
单单一个点击查询使用有点牛刀杀鸡。
关于Ol3+GeoServer+PostGIS框架交流请进入qq群:445307545
关于Ol3交流请进入qq群:274788071
有偿GIS技术指导请联系:674834420
OpenLayers 3+Geoserver+PostGIS实现点击查询的更多相关文章
- postgresql+postgis+pgrouting实现最短路径查询(2)---openlayers+geoserver实现最短路径
自己的最短路径实现基本上是按照参考博文的1.2和3进行的,实现的时候也是问题不断,只能是一个一个解决. 问题1:自己发布的geoserver服务无法和OSM底图叠加到一起. 解决:参考博文2提到发布服 ...
- geoserver + postgis+postgresql+agslib.swc
运用开源的geoserver+postgis+postgresql+arcgis for flex api 开发地图应用系统. 1.Geoserver GeoServer 是 OpenGIS Web ...
- bind绑定事件,摁回车键提交查询,点击查询也可以提交查询
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- asp.mvc中的vue分页实例,分页组件无法重置reload,解决点击查询按钮后,分页不刷新的问题
刚刚接触Vue.js,现在需要做一个查询功能,并且进行服务端分页.主要思路是在页面中注册一个分页组件,然后进行调用.代码如下 1.引用vue.js,具体去网上下载 2.在html的body中添加如下代 ...
- <asp:Button点击查询后,调用js中函数展现加载圈
<div> <div id='paneloading' style='display:none;position:fixed;top:0px;left:0px;z-index:999 ...
- AE三维点击查询(3D Identify)的实现(转)
AE三维点击查询(3D Identify)的实现,类似ArcGIS的Identify对话框/////////////////////////////////////////////////////// ...
- Android GIS开发系列-- 入门季(4) GraphicsLayer的点击查询要素
上一讲中我们学会了如何在MapView中添加Graphic要素,那么在百度或高德地图中,当我们点击要素时,会显示出相应的详细信息.在GraphicsLayer中也提供了这样的方法.下面我们来学习在Gr ...
- Layui 点击查询分页,页码不刷新解决方法
Layui 点击查询分页,页码不刷新解决方法 function queryDataGrid() { layui.table.reload(tableName, { where: { //设定异步数据接 ...
- GeoServer+PostgreSQL+PostGIS+pgRouting实现最短路径查询
一.软件安装 GeoServer下载地址: http://geoserver.org/download/ PostgreSQL下载地址: https://www.postgresql.org/down ...
随机推荐
- 经常遇到的js兼容问题大总结----最全总结
001.获取滚动条滚动的距离 var sTop = document.documentElement.scrollTop || document.body.scrollTop 002.获取非行间样式 ...
- C3P0连接池参数配置说明
C3P0连接池参数配置说明 created by cjk on 2017.8.15 常用配置 initialPoolSize:连接池初始化时创建的连接数,default : 3(建议使用) minPo ...
- 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数
查询SQLServer2005中某个数据库中的表结构.索引.视图.存储过程.触发器以及自定义函数 2013-03-11 09:05:06| 分类: SQL SERVER|举报|字号 订阅 ( ...
- selenium click radio
radio = dr.find_element_by_xpath('//*[@id="contentTable"]/tbody/tr[1]/td[1]/input') webdri ...
- Spring Data Redis入门示例:数据序列化 (四)
概述 RedisTemplate默认使用的是基于JDK的序列化器,所以存储在Redis的数据如果不经过相应的反序列化,看到的结果是这个样子的: 可以看到,出现了乱码,在程序层面上,不会影响程序的运行, ...
- Spring对象类型——单例和多例
由于看淘淘商城的项目,涉及到了项目中处理spring中bean对象的两种类型,分别是单例和多例,就在此记录一下,方便加深理解,写出更加健壮的代码. 一.单例和多例的概述 在Spring中,bean可以 ...
- Android实战简易教程-第四十九枪(两种方式实现网络图片异步加载)
加载图片属于比较耗时的工作,我们需要异步进行加载,异步加载有两种方式:1.通过AsyncTask类进行:2.通过Handler来实现,下面我们就来看一下如何通过这两种方式实现网络图片的异步加载. 一. ...
- 【牛客小白月赛6】 J 洋灰三角 - 快速幂&逆元&数学
题目地址:https://www.nowcoder.com/acm/contest/136/J 解法一: 推数学公式求前n项和: 当k=1时,即为等差数列,Sn = n+pn(n−1)/2 当k≠1时 ...
- Python 反射-isinstance-issubclass-__str__-__del__
用到的 isinstance(对象,类) ------------------- 判断一个对象是否是一个类的实例 issubclass(子类,父类) ---------------- 判断一个 ...
- java1.8学习-什么样的匿名内部类能被lambda语法代替?
java1.8学习-什么样的匿名内部类能被lambda语法代替? java1.8好多新的特性真的很有意思,特别是Lambda.在学习的时候发现并不是所有的匿名内部类都可以用Lambda代替. lamb ...