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

转:https://zxhtom.oschina.io/zxh/20160819.html

 编程  java  2016/08/19 0留言, 0参与 view : 4次

本文于533天之前发表,文中内容可能已经过时。

GeoJSON是一种对各种地理数据结构进行编码的格式。

前言:前两周我带你们分析了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加载地图已经讲解完毕了,上述只是为了帮助各位梳理思路,并不是项目的完整代码,如果新入门的没有看明白,可以在博客下方留言,我会将源码发送给你。

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

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

    前言:前两周我带你们分析了WebGis中关键步骤瓦片加载+点击事件(具体的看前两篇文章),下面呢,我带大家来看看Geojson的加载及其点击事件 Geojson数据解析 GeoJSON是一种对各种地理 ...

  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. linux C使用strerror来追查错误信息

    最近工作中有个需求:程序将文件进行处理,然后将处理完毕的文件挪走.我用了rename函数来挪动文件,可是在docker化的环境中,文件却无法挪动.不知道什么原因.现在,对程序进行调整,如果rename ...

  2. Java [Leetcode 383]Ransom Note

    题目描述: Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 al ...

  3. bzoj 4472 salesman

    Written with StackEdit. Description 某售货员小\(T\) 要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇 之间都只有唯一的可能经过其它城镇的路线. ...

  4. linux操作系统安全防护

    Linux系统攻防对抗实践 一.实践内容 在Metasploit渗透攻击框架软件中寻找一个针对Linux系统服务的渗透攻击模块,在网络安全攻防实验环境中部署有漏洞的环境(如渗透利用第三方网络服务,需要 ...

  5. kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance

    from:http://www.jianshu.com/p/5aa8776868bb kafka系列之(3)——Coordinator与offset管理和Consumer Rebalance 时之结绳 ...

  6. 洛谷 P2945 [USACO09MAR]沙堡Sand Castle

    传送门 题目大意: ai,ai+1,ai+2... 变成 bi,bi+1,bi+2.. 不计顺序,增加和减少a数组均有代价. 题解:贪心+排序 小的对应小的 代码: #include<iostr ...

  7. gulp 集成其他基于流的工具

    1. 流.缓冲.vinyl 文件对象 gulp 的流是虚拟文件对象 包含的属性有 base 文件名 path 文件路径 content 缓冲.nodejs 流 2. gulp 集成 browserif ...

  8. bzoj 2159 Crash 的文明世界 && hdu 4625 JZPTREE ——第二类斯特林数+树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2159 学习材料:https://blog.csdn.net/litble/article/d ...

  9. Python学习之变量的作用域

    学习地址:http://www.jianshu.com/p/17a9d8584530 1.变量作用域LEGB 1.1变量的作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空 ...

  10. java实现一个最简单的tomcat服务

    在了解tomcat的基本原理之前,首先要了解tomcatt最基本的运行原理. 1.如何启动? main方法是程序的入口,tomcat也不例外,查看tomcat源码,发现main是在Bootstrap  ...