使用OPENLAYERS3实现点选的方法


Posted in Javascript onSeptember 24, 2020

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的客户端,才能使用,如果是wms图层就不能用了。
2 第三种方法:wms图层,这时候前两种矢量方式没法处理,第三种方法就可以解决这个问题。
3 第四种方法:一二三无论矢量还是wms,都是要加载到客户端才能使用,但有时候因需求不同导致的,Geoserver发布的图层不加载到客户端,那么就都不能使用了。但只要被发布了,通过wfs的url请求就一定能查询到结果,即使这个查询对象不在客户端而在服务端。
4 第五种方法:与第四种方法一样,因为业务需求不同导致,有时数据连发布都没发布,仅仅停留在数据库中,而要求能够查询,这时候第五个方法即可。当然数据库中的方法,一般用在大数据量,复杂事务查询中使用较好。单单一个点击查询使用有点牛刀杀鸡。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 获取元素位置的快速方法 getBoundingClientRect()
Nov 26 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
JavaScript实现N皇后问题算法谜题解答
Dec 29 Javascript
JS+CSS实现Div弹出窗口同时背景变暗的方法
Mar 04 Javascript
详解JavaScript 中的 replace 方法
Jan 01 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
Jul 07 Javascript
基于Vue.js 2.0实现百度搜索框效果
Dec 28 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
Sep 25 Javascript
AngularJS $http post 传递参数数据的方法
Oct 09 Javascript
微信打开网址添加在浏览器中打开提示的办法
May 20 Javascript
ant-design表单处理和常用方法及自定义验证操作
Oct 27 Javascript
vue component组件使用方法详解
Jul 14 #Javascript
vue-cli单页应用改成多页应用配置详解
Jul 14 #Javascript
Vue filters过滤器的使用方法
Jul 14 #Javascript
vue.js如何更改默认端口号8080为指定端口的方法
Jul 14 #Javascript
Vue computed计算属性的使用方法
Jul 14 #Javascript
JS实现上传图片的三种方法并实现预览图片功能
Jul 14 #Javascript
JS实现数组去重方法总结(六种方法)
Jul 14 #Javascript
You might like
删除数组元素实用的PHP数组函数
2008/08/18 PHP
PHP中的array数组类型分析说明
2010/07/27 PHP
php自定义函数之递归删除文件及目录
2010/08/08 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
PHP使用自定义方法实现数组合并示例
2016/07/07 PHP
PHP解决中文乱码
2017/04/28 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
isArray()函数(JavaScript中对象类型判断的几种方法)
2009/11/26 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
jQuery选择器全面总结
2014/01/06 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
Javascript柯里化实现原理及作用解析
2020/10/22 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
Python3 入门教程 简单但比较不错
2009/11/29 Python
Python分割指定页数的pdf文件方法
2018/10/26 Python
在python中将list分段并保存为array类型的方法
2019/07/15 Python
python 实现让字典的value 成为列表
2019/12/16 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
10个最常见的HTML5面试题 附答案
2016/06/06 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
现代生活方式的家具和装饰:Dot & Bo
2018/12/26 全球购物
英国No.1体育用品零售商:SportsDirect.com
2019/10/16 全球购物
EJB2和EJB3在架构上的不同点
2014/09/29 面试题
大学生自我评价怎样写好
2013/10/23 职场文书
红旗方阵解说词
2014/02/12 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书
Nginx 负载均衡是什么以及该如何配置
2021/03/31 Servers
pytorch 实现在测试的时候启用dropout
2021/05/27 Python
一文搞懂php的垃圾回收机制
2021/06/18 PHP
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android