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

  • Geojson数据解析

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

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

    GeoJSON集合特征:

  1. {"type":"FeatureCollection",
  2. "features":[
  3. {"type":"Feature",
  4. "id":"001",
  5. "properties":{"name":"新华001"},
  6. "geometry":{"type": "Point", "coordinates":[121.9850,42.6737]}},
  7. {"type":"Feature",
  8. "id":"002",
  9. "properties":{"name":"新华002"},
  10. "geometry":{"type": "Point", "coordinates":[121.8345,42.4898]}},
  11. {"type":"Feature",
  12. "id":"003",
  13. "properties":{"name":"峰山1"},
  14. "geometry":{"type": "LineString", "coordinates":[[121.9850,42.6737],[121.8345,42.4898]]}},
  15. {"type":"Feature",
  16. "id":"004",
  17. "properties":{"name":"新华1001"},
  18. "geometry":{"type": "Point", "coordinates":[128.9850,42.6737]}},
  19. {"type":"Feature",
  20. "id":"005",
  21. "properties":{"name":"新华1002"},
  22. "geometry":{"type": "Point", "coordinates":[125.8345,42.4898]}},
  23. {"type":"Feature",
  24. "id":"006",
  25. "properties":{"name":"峰山2"},
  26. "geometry":{"type": "LineString", "coordinates":[[121.9850,42.6737],[125.8345,42.4898]]}}]}

  • openlayers3代码加载

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

  1. var vector = new ol.layer.Vector( {
  2. source : new ol.source.Vector( {
  3. // url:
  4. // 'http://openlayers.org/en/v3.17.1/examples/data/geojson/countries.geojson',
  5. url : './source/china.json',
  6. format : new ol.format.GeoJSON()
  7. }),
  8. style : selectStyleFunction
  9. });

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

方法的具体实现:

  1. var style;
  2. if(feature.getGeometry().getType()=="Point"){
  3. style = [new ol.style.Style({
  4. image : new ol.style.Circle( {
  5. fill : new ol.style.Fill( {
  6. color : 'rgba(255,255,0,0.4)'
  7. }),
  8. radius : 2,
  9. stroke : new ol.style.Stroke( {
  10. color : 'black',
  11. width : 1
  12. })
  13. }),
  14. text : new ol.style.Text( {
  15. fill : textFill,
  16. stroke : textStroke,
  17. text : view.getZoom()>5?(feature.getId()>2?feature.get("name"):""):""
  18. })
  19. })];
  20. }else if(feature.getGeometry().getType()=="LineString"){
  21. if(view.getZoom()<3){
  22. return ;
  23. }
  24. style = [new ol.style.Style( {
  25. stroke : new ol.style.Stroke( {
  26. color : '#CD950C',
  27. width : 2
  28. }),
  29. text : new ol.style.Text( {
  30. fill : textFill,
  31. stroke : textStroke,
  32. text : view.getZoom()>6?feature.get("name"):""
  33. })
  34. })];
  35. }else if(feature.getGeometry().getType()=="Polygon"){
  36. style = [new ol.style.Style( {
  37. stroke : new ol.style.Stroke( {
  38. color : '#FFE4B5',
  39. width : 3
  40. }),
  41. text : new ol.style.Text( {
  42. fill : textFill,
  43. stroke : textStroke,
  44. text : feature.get("name")
  45. })
  46. })];
  47. }else if(feature.getGeometry().getType()=="MultiLineString"){
  48. style = [new ol.style.Style( {
  49. stroke : new ol.style.Stroke( {
  50. color : 'black',
  51. width : 3
  52. })
  53. })];
  54. }
  55. return style;

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


  • 效果欣赏

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

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

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

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


  • 点击事件

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

  1. map.on('singleclick', mapClick);
  1. function mapClick(e) {
  2. var pixel = map.getEventPixel(e.originalEvent);
  3. var featureInfo = map.forEachFeatureAtPixel(pixel,
  4. function(feature, layer) {
  5. return {
  6. feature : feature,
  7. layer : layer
  8. };
  9. });
  10. var coordinate = e.coordinate;
  11. var hdms = ol.coordinate.toStringHDMS(ol.proj.transform(coordinate,
  12. 'EPSG:3857', 'EPSG:4326'));
  13. if (featureInfo !== undefined && featureInfo !== null
  14. && featureInfo.layer !== null) {
  15. if (featureInfo.feature.get("geometry").B.length == 2) {
  16. // alert(view.getZoom());
  17. alert(hdms + "\n这里属于" + featureInfo.feature.get("name") + "点");
  18. } else if (featureInfo.feature.get("geometry").B.length == 4) {
  19. alert(hdms + "\n这里属于" + featureInfo.feature.get("name") + "线");
  20. alert("两端信息" + featureInfo.feature.get("geometry").B);
  21. } else {
  22. // alert(hdms+"\n这里属于"+featureInfo.feature.get("name")+"省");//显示点击区域的
  23. }
  24. console.log('打印选择要素');
  25. console.log(featureInfo.feature);
  26. console.log('打印选择要素所属Layer');
  27. console.log(featureInfo.layer);
  28. } else {
  29. alert(hdms + "\n这里不属于中国或者这里是大海");// 显示点击区域的
  30. }
  31. }

在这里我需要讲解一下:

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

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

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


  • 定位

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

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

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

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

  1. view.setCenter(ol.proj.fromLonLat( [
  2. Number(document.getElementById('jd').value),
  3. 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

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

  1. var select = null; // ref to currently selected interaction
  2. // select interaction working on "singleclick"
  3. var selectSingleClick = new ol.interaction.Select();
  4. // select interaction working on "click"
  5. var selectClick = new ol.interaction.Select( {
  6. condition : ol.events.condition.click
  7. });
  8. // select interaction working on "pointermove"
  9. var selectPointerMove = new ol.interaction.Select( {
  10. condition : ol.events.condition.pointerMove
  11. });
  12. var selectAltClick = new ol.interaction.Select( {
  13. condition : function(mapBrowserEvent) {
  14. return ol.events.condition.click(mapBrowserEvent)
  15. && ol.events.condition.altKeyOnly(mapBrowserEvent);
  16. }
  17. });
  18. var selectElement = document.getElementById('type');
  19. var changeInteraction = function() {
  20. if (select !== null) {
  21. map.removeInteraction(select);
  22. }
  23. var value = selectElement.value;
  24. if (value == 'singleclick') {
  25. select = selectSingleClick;
  26. } else if (value == 'click') {
  27. select = selectClick;
  28. } else if (value == 'pointermove') {
  29. select = selectPointerMove;
  30. } else if (value == 'altclick') {
  31. select = selectAltClick;
  32. } else {
  33. select = null;
  34. }
  35. if (select !== null) {
  36. map.addInteraction(select);
  37. select.on('select', function(e) {
  38. document.getElementById('status').innerHTML = '&nbsp;'
  39. + e.target.getFeatures().getLength()
  40. + ' selected features (last operation selected '
  41. + e.selected.length + ' and deselected '
  42. + e.deselected.length + ' features)';
  43. });
  44. }
  45. };

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

带你剖析WebGis的世界奥秘----Geojson数据加载(高级)的更多相关文章

  1. 带你剖析WebGis的世界奥秘----Geojson数据加载(高级)(转)

    带你剖析WebGis的世界奥秘----Geojson数据加载(高级) 转:https://zxhtom.oschina.io/zxh/20160819.html  编程  java  2016/08/ ...

  2. 带你剖析WebGis的世界奥秘----瓦片式加载地图(转)

    带你剖析WebGis的世界奥秘----瓦片式加载地图 转:https://zxhtom.oschina.io/zxh/20160805.html  编程  java  2016/08/05 0留言,  ...

  3. 带你剖析WebGis的世界奥秘----瓦片式加载地图

    WebGIS应用程序的页面能够通过HTML.JSP.ASP或任何任何类型的Web页文件构成,其特殊之处在于,它的请求提交的方法并不是通过常用的 "超链接"形式,而是使用鼠标与Web ...

  4. 带你剖析WebGis的世界奥秘----点和线的世界(转)

    带你剖析WebGis的世界奥秘----点和线的世界 转:https://zxhtom.oschina.io/zxh/20160813.html  编程  java  2016/08/13 0留言, 0 ...

  5. 带你剖析WebGis的世界奥秘----点和线的世界

    前言 昨天写了好久的博文我没保存,今天在来想继续写居然没了,气死人啊这种情况你们见到过没,所以今天重新写,我还是切换到了HTML格式的书写上.废话不多说了,我们现在就进入主题,上周我仔细研究了WebG ...

  6. Cocos Creator 资源加载流程剖析【一】——cc.loader与加载管线

    这系列文章会对Cocos Creator的资源加载和管理进行深入的剖析.主要包含以下内容: cc.loader与加载管线 Download部分 Load部分 额外流程(MD5 Pipe) 从编辑器到运 ...

  7. Tomcat增加Context配置不带项目名访问导致启动的时候项目加载两次

    eclipse发布web应用至tomcat,默认方式下访问该项目是需要带项目名称的,例http://localhost:8080/myapp/.现在需要改成这样访问http://localhost.修 ...

  8. 远景WEBGIS平台实现客户端SHP文件加载

    远景WEBGIS平台的研发目前取得新进展,实现客户端shp文件的加载,可以不经过PC上的数据转换工具转换. 远景WEBGIS平台(RemoteGIS)是基于HTML5自主研发的新一代WEBGIS基础平 ...

  9. Spring源码剖析2:Spring IOC容器的加载过程

    spring ioc 容器的加载流程 1.目标:熟练使用spring,并分析其源码,了解其中的思想.这篇主要介绍spring ioc 容器的加载 2.前提条件:会使用debug 3.源码分析方法:In ...

随机推荐

  1. NetCore 获取appsetting.json 文件中的配置

    1. using Microsoft.Extensions.Configuration public class HomeController : Controller { public IConfi ...

  2. 深入学习Spring框架(三)- AOP面向切面

    1.什么是AOP? AOP为 Aspect Oriented Programming 的缩写,即面向切面编程, 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术..AOP是OOP的延续, ...

  3. MYSQL千万级别数据量迁移Elasticsearch5.6.1实战

    从关系型库中迁移数据算是比较常见的场景,这里借助两个工具来完成本次的数据迁移,考虑到数据量并不大(不足两千万),未采用snapshot快照的形式进行. Elasticsearch-jdbc,Githu ...

  4. 通过sparkstreaming分析url的数据

    spark version 1.6.2 scala verson 2.10.6 此代码参考官方例子---- 自定义接收器 import java.io.BufferedReader import or ...

  5. Maven(三)使用 IDEA 创建一个 Maven 项目

    利用 IDEA 创建一个 Maven 项目 创建 Maven 项目 选择 File --> New --> Project 选中 Maven 填写项目信息 选择工作空间 目录结构 ├─sr ...

  6. python基础知识六 文件的基本操作+菜中菜

    基础知识六 文件操作 ​ open():打开 ​ file:文件的位置(路径) ​ mode:操作文件模式 ​ encoding:文件编码方式 ​ f :文件句柄 f = open("1.t ...

  7. 【译】深入理解G1的GC日志(一)

    本文翻译自:https://www.redhat.com/en/blog/collecting-and-reading-g1-garbage-collector-logs-part-2?source= ...

  8. 动手造轮子:实现一个简单的 EventBus

    动手造轮子:实现一个简单的 EventBus Intro EventBus 是一种事件发布订阅模式,通过 EventBus 我们可以很方便的实现解耦,将事件的发起和事件的处理的很好的分隔开来,很好的实 ...

  9. 2019年7月20日 - LeetCode0002

    https://leetcode-cn.com/problems/add-two-numbers/submissions/ 我的方法: /** * Definition for singly-link ...

  10. FJNUOJ 1002 画葫芦。。

    画图就是..找..规..律 #include <iostream>using namespace std;int main(){ int T; cin>>T; while(T- ...