前言:前两周我带你们分析了WebGis中关键步骤瓦片加载+点击事件(具体的看前两篇文章),下面呢,我带大家来看看Geojson的加载及其点击事件

  • Geojson数据解析

    GeoJSON是一种对各种地理数据结构进行编码的格式。GeoJSON对象可以表示几何、特征或者特征集合。GeoJSON支持下面几何类型:点、线、面、多点、多线、多面和几何集合。GeoJSON里的特征包含一个几何对象和其他属性,特征集合表示一系列特征。

    一个完整的GeoJSON数据结构总是一个(JSON术语里的)对象。在GeoJSON里,对象由名/值对–也称作成员的集合组成。对每个成员来说,名字总是字符串。成员的值要么是字符串、数字、对象、数组,要么是下面文本常量中的一个:”true”,”false”和”null”。数组是由值是上面所说的元素组成。

    GeoJSON集合特征:

{"type":"FeatureCollection","features":[{"type":"Feature","id":"001","properties":{"name":"新华001"},"geometry":{"type": "Point", "coordinates":[121.9850,42.6737]}},{"type":"Feature","id":"002","properties":{"name":"新华002"},"geometry":{"type": "Point", "coordinates":[121.8345,42.4898]}},{"type":"Feature","id":"003","properties":{"name":"峰山1"},"geometry":{"type": "LineString", "coordinates":[[121.9850,42.6737],[121.8345,42.4898]]}},{"type":"Feature","id":"004","properties":{"name":"新华1001"},"geometry":{"type": "Point", "coordinates":[128.9850,42.6737]}},{"type":"Feature","id":"005","properties":{"name":"新华1002"},"geometry":{"type": "Point", "coordinates":[125.8345,42.4898]}},{"type":"Feature","id":"006","properties":{"name":"峰山2"},"geometry":{"type": "LineString", "coordinates":[[121.9850,42.6737],[125.8345,42.4898]]}}]}

  • openlayers3代码加载

    至于如何加载地图在第一篇的加载瓦片式地图已经提过了,看完第一篇的你应该知道我是将地图map交接给页面的div中,而map中包含了很多遮罩层,我现在加载GeoJSON就是在最上面的层上在加载url数据。

var vector = new ol.layer.Vector( {source : new ol.source.Vector( {// url:// 'http://openlayers.org/en/v3.17.1/examples/data/geojson/countries.geojson',url : './source/china.json',format : new ol.format.GeoJSON()}),style : selectStyleFunction
});

我这是引用本地准备好的数据(可以从服务器上获得,从服务器上只需要将url地址改写成服务地址),加载url完成后并不会在map中显示出来,我们还需要指定数据的显示样式,这里和之前瓦片是加载不同,样式很重要我调节了好久才调通的,这里我将封装在方法里。

方法的具体实现:

    var style;if(feature.getGeometry().getType()=="Point"){style = [new ol.style.Style({image : new ol.style.Circle( {fill : new ol.style.Fill( {color : 'rgba(255,255,0,0.4)'}),radius : 2,stroke : new ol.style.Stroke( {color : 'black',width : 1})}),text : new ol.style.Text( {fill : textFill,stroke : textStroke,text : view.getZoom()>5?(feature.getId()>2?feature.get("name"):""):""})})];}else if(feature.getGeometry().getType()=="LineString"){if(view.getZoom()<3){return ;}style = [new ol.style.Style( {stroke : new ol.style.Stroke( {color : '#CD950C',width : 2}),text : new ol.style.Text( {fill : textFill,stroke : textStroke,text : view.getZoom()>6?feature.get("name"):""})})];}else if(feature.getGeometry().getType()=="Polygon"){style = [new ol.style.Style( {stroke : new ol.style.Stroke( {color : '#FFE4B5',width : 3}),text : new ol.style.Text( {fill : textFill,stroke : textStroke,text : feature.get("name")})})];}else if(feature.getGeometry().getType()=="MultiLineString"){style = [new ol.style.Style( {stroke : new ol.style.Stroke( {color : 'black',width : 3})})];}return style;

申明 里面有些参数没有进行申明,因为定义了全局变量,因为在之前的js中改的,所以并没贴出所有代码。这里需要完整代码的请CSDN上私信我或者在留言板上留言


  • 效果欣赏

    1、地图加载完毕 这里你看到的地图不是上次的了,这次这个地图就是GeoJSON里的数据,只不过将数据以图形化的形式展现在我们的面前,看到地图右上方的两个点和一条线了吗,那都是通过数据动态加载出来的,换句话来说就是,我只需要将GeoJSON里的数据进行修改一下,这个地图就不一样了,这很方便我们在后台修改地图。还有这个中国的框架也是数据里的,总之一句话你看到的这个地图里所有元素都是数据里设置的(除了样式)

    2、放大缩小地图和之前效果一样,值得注意的是我在js中设置了显示级别,就是放大缩小的不同级别显示的数据也是不同的,比如说那条线吧,我设置在6级以上的才能看到,下面我缩小地图线就不见了,下面是消失了的并不是太小看不见的

    3、在放大到一定级别我设置了点的周围显示点的名称!看效果

    这里就是加载的效果,下面我们继续探讨。下面就是点击事件了,点击事件在上篇文章我是着重讲了原理及实现,而在新技术中我们的点击事件就很Easy了


  • 点击事件

    我们要在map中绑定事件,也就是注册事件

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};});var coordinate = e.coordinate;var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate,'EPSG:3857', 'EPSG:4326'));if (featureInfo !== undefined && featureInfo !== null&& featureInfo.layer !== null) {if (featureInfo.feature.get("geometry").B.length == 2) {
//          alert(view.getZoom());alert(hdms + "\n这里属于" + featureInfo.feature.get("name") + "点");} else if (featureInfo.feature.get("geometry").B.length == 4) {alert(hdms + "\n这里属于" + featureInfo.feature.get("name") + "线");alert("两端信息" + featureInfo.feature.get("geometry").B);} else {// alert(hdms+"\n这里属于"+featureInfo.feature.get("name")+"省");//显示点击区域的}console.log('打印选择要素');console.log(featureInfo.feature);console.log('打印选择要素所属Layer');console.log(featureInfo.layer);} else {alert(hdms + "\n这里不属于中国或者这里是大海");// 显示点击区域的}
}

在这里我需要讲解一下:

这里的featureInfo是我们在方法里拼接的(feature+layer)组成的,在if条件判断里我们featureInfo.feature.get(“geometry”).B.length == 2是判断feature里数字点的个数,大家想一想如果是点是不是有两个数字点,如果是线就是两个点也就是四个数字点,如果是区域的话那就是至少是超过4的偶数了,这样我们就可以区别出点线和区域了,这也就是说我们在这里就实现了之前很难解决的点线问题了,区域问题我们就不多加讨论了。

var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate,'EPSG:3857', 'EPSG:4326'));

这个是将坐标进行转换的,这个不多说


  • 定位

    在之前我们的定位就是以某个点中心显示并加上图标那就是所谓的定位,那么在我们的新技术中定位是不是有所改变呢?让我们来一探究竟。

    如果你认为既然是新技术了就一定要有突破,那么我的回答可能会让你很失望,新技术里仍然是用上述的思想来实现定位的,但多多少少还是有不同的。

    新旧对比 openlayers2 openlayers3
    点击 获取经纬度查询 点线类别区分
    定位 map中心显示 view中心显示

    由上图的表格我们可以看出我们的定位还是有所区别的,在新技术中我么能采用的是view中心显示法,什么叫view中心显示法呢,就是通过view来调用设置中心的方法。

view.setCenter(ol.proj.fromLonLat( [Number(document.getElementById('jd').value),Number(document.getElementById('wd').value) ]));

  • 其他常用的事件介绍

事件句柄

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

具体事件

属性 当以下情况发生时,出现此事件 FF N IE
onabort 图像加载被中断 1 3 4
onblur 元素失去焦点 1 2 3
onchange 用户改变域的内容 1 2 3
onclick 鼠标点击某个对象 1 2 3
ondblclick 鼠标双击某个对象 1 4 4
onerror 当加载文档或图像时发生某个错误 1 3 4
onfocus 元素获得焦点 1 2 3
onkeydown 某个键盘的键被按下 1 4 3
onkeypress 某个键盘的键被按下或按住 1 4 3

此处参考的w3School

在我的地图中我就随便加了几个试试效果的。

var select = null; // ref to currently selected interaction
// select interaction working on "singleclick"
var selectSingleClick = new ol.interaction.Select();// select interaction working on "click"
var selectClick = new ol.interaction.Select( {condition : ol.events.condition.click
});// select interaction working on "pointermove"
var selectPointerMove = new ol.interaction.Select( {condition : ol.events.condition.pointerMove
});var selectAltClick = new ol.interaction.Select( {condition : function(mapBrowserEvent) {return ol.events.condition.click(mapBrowserEvent)&& ol.events.condition.altKeyOnly(mapBrowserEvent);}
});var selectElement = document.getElementById('type');var changeInteraction = function() {if (select !== null) {map.removeInteraction(select);}var value = selectElement.value;if (value == 'singleclick') {select = selectSingleClick;} else if (value == 'click') {select = selectClick;} else if (value == 'pointermove') {select = selectPointerMove;} else if (value == 'altclick') {select = selectAltClick;} else {select = null;}if (select !== null) {map.addInteraction(select);select.on('select', function(e) {document.getElementById('status').innerHTML = '&nbsp;'+ e.target.getFeatures().getLength()+ ' selected features (last operation selected '+ e.selected.length + ' and deselected '+ e.deselected.length + ' features)';});}
};

到这里整个GeoJSON加载地图已经讲解完毕了,上述只是为了帮助各位梳理思路,并不是项目的完整代码,如果新入门的没有看明白,可以在博客下方留言,我会将源码发送给你。

转载于:https://www.cnblogs.com/zhangxinhua/p/8319246.html

带你剖析WebGis的世界奥秘----Geojson数据加载(高级)相关推荐

  1. pytorch中的数据加载(dataset基类,以及pytorch自带数据集)

    目录 pytorch中的数据加载 模型中使用数据加载器的目的 数据集类 Dataset基类介绍 数据加载案例 数据加载器类 pytorch自带的数据集 torchvision.datasets MIN ...

  2. 我的世界服务器如何修改加载规模,我的世界服务器预加载区域怎么调小

    满意答案 首先我们先停止服务器 为了服务器的健康着想,我们先关掉服务器,即输入[stop]命令后敲回车,我想大家都会哈! 我的世界服务器怎么调整困难度 找到[server.properties]文件, ...

  3. ceisum 加载geojson,webgl 加载geojson数据没有贴地

    我有一份geojson数据: const smc={"type":"FeatureCollection", "features": [ {& ...

  4. 我的世界服务器无限制区块,我的世界所有区块同时加载,内存多惊人?162万个100T硬盘装不下...

    如果把Minecraft地图中,所有的区块都加载出来,那么这个存档将会有多大? 当我突然冒出这个想法,并决定去<我的世界>找出答案的时候.才发现自己给自己挖了一个巨大的坑! 下面是一个绞尽 ...

  5. [译]带你揭开Kotlin中属性代理和懒加载语法糖衣

    翻译说明: 原标题: How Kotlin's delegated properties and lazy-initialization work 原文地址: https://medium.com/t ...

  6. spring bean加载过程_Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  7. WebGIS入门(一)--------在线加载ESRI地图

    一.首先要添加在线的arcGIS的样式css库和js库,代码如下: <link rel="stylesheet" href="http://js.arcgis.co ...

  8. 爬虫项目(二)---采集从03月02号以来的世界各国疫情数据

    该内容出自黑马程序员教程 采集从03月02号以来的世界各国疫情数据 步骤: Ⅰ,重构项目(一)的代码,以提高扩展性 把功能封装到一个类中 每一个小功能变成一个方法 通过run方法启动爬虫 import ...

  9. 开源GIS(九)——openlayers中简单要素的添加与geojson数据修改添加

    目录 一.引言 二.简单要素点线面的添加 1.创建feature 2.创建style,添加source.style到layer 3.添加layer到map 三.WFS获取geojson数据并修改 四. ...

最新文章

  1. python的语法结构_Python特点、语法结构、编码知识
  2. hc05与单片机连接图_单片机科普:单片机的IO口不够用了怎么办?如何扩展单片机的IO口...
  3. canvas并查集画随机迷宫
  4. 计算成本缩减100倍!港中文提出语义分割新方法:张量低秩重建|ECCV2020
  5. 3台机器配置hadoop集群_Hadoop学习之路(三)Hadoop集群搭建和简单应用
  6. AUTOSAR从入门到精通100讲(十八)-AUTOSAR操作系统OS
  7. wamp2 php配置,wamp安装后自定义配置的方法
  8. 细说 Form (表单)
  9. http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/
  10. Subscription expires on 2017/2/25. Usage of PhpStorm will no longer be possible.
  11. 小凡模拟器(DynamipsGUI)打不开的简单解决方法
  12. WPE封包外挂教程(上)
  13. Remoting整理
  14. NYOJ 412 Same binary weight题解
  15. java 制作圆形按钮_Java制作圆形按钮
  16. Pearson correlation coefficient与Cosine Similarity的区别
  17. NeuroImage:慢性疼痛病人功能脑社区变化的网络结构
  18. 百度人脸识别测试环境配置教程
  19. 微信小程序如何添加业务域名
  20. 社会热点和网络营销的关联

热门文章

  1. [UE4]集合:TSet容器
  2. sql 中实现打乱数据的排序
  3. 理解面向连接和无连接协议之间的区别
  4. 设计模式学习笔记九:原型模式(Prototype Pattern)
  5. java扫描指定package注解_java随笔-扫描使用指定注解的类与方法
  6. java返回两个string_java – 为什么String.intern()方法返回两个不同的结果?
  7. mysql redo原子写_InnoDB如何保证redolog的完整性?
  8. CMake 入门与进阶
  9. STM32使用SPI通信驱动2.4G无线射频模块发送数据
  10. linux 内核驱动的名字,Linux内核驱动的的platform机制