耀极客论坛

 找回密码
 立即注册
查看: 405|回复: 0

解析OpenLayers 3加载矢量地图源的问题

[复制链接]

193

主题

176

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2022-5-8 02:13:56 | 显示全部楼层 |阅读模式
  矢量图形最大的优点是无论放大、缩小或旋转等不会失真。在地图中存在着大量的应用,是地图数据中非常重要的组成部分,这篇文章主要介绍了OpenLayers 3加载矢量地图源的相关资料,需要的朋友可以参考下
一、矢量地图
  矢量图使用直线和曲线来描述图形,这些图形的元素是一些点、线、矩形、多边形、圆和弧线等等,它们都是通过数学公式计算获得的。由于矢量图形可通过公式计算获得,所以矢量图形文件体积一般较小。矢量图形最大的优点是无论放大、缩小或旋转等不会失真。在地图中存在着大量的应用,是地图数据中非常重要的组成部分。
  为了便于存储,传递,使用,矢量地图会按照一定的格式来表达,比如常见的GeoJSON,TopoJSON,GML,KML,ShapeFile等等。 除了最后一个ShapeFile,其他几个格式的矢量地图OpenLayers 3都支持。
二、使用GeoJson格式加载矢量地图
  1、项目结构

  2、map.geojson
  1. {"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[104.08859252929688,30.738294707383368],[104.18060302734375,30.691068801620155],[104.22042846679688,30.739475058679485],[104.08859252929688,30.738294707383368]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[104.08859252929688,30.52323029223123],[104.08309936523438,30.359841397025537],[104.1998291015625,30.519681272749402],[104.08859252929688,30.52323029223123]]]}},{"type":"Feature","properties":{},"geometry":{"type":"Polygon","coordinates":[[[103.70269775390624,30.675715404167743],[103.69308471679688,30.51494904517773],[103.83316040039062,30.51494904517773],[103.86474609375,30.682801890953776],[103.70269775390624,30.675715404167743]]]}}]}
复制代码
  3、map.html
  1. ‹!Doctype html>
  2. ‹html xmlns='http://www.w3.org/1999/xhtml'>
  3. ‹head>
  4.     ‹meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
  5.     ‹meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
  6.     ‹meta content='always' name='referrer'>
  7.     ‹title>OpenLayers 3 :加载矢量地图‹/title>
  8.     ‹link href='ol.css ' rel='stylesheet' type='text/css'/>
  9.     ‹script type='text/javascript' src='ol.js' charset='utf-8'>‹/script>
  10. ‹/head>
  11. ‹body>
  12. ‹div id='map' style='width: 1000px;height: 800px;margin: auto'>‹/div>
  13. ‹script>
  14.     /**
  15.      *  创建地图
  16.      */
  17.     new ol.Map({
  18.         // 设置地图图层
  19.         layers: [
  20.             //创建一个使用Open Street Map地图源的图层
  21.             new ol.layer.Tile({
  22.                 source: new ol.source.OSM()
  23.             }),
  24.             //加载一个geojson的矢量地图
  25.             new ol.layer.Vector({
  26.                 source: new ol.source.Vector({
  27.                     url: 'geojson/map.geojson',     // 地图来源
  28.                     format: new ol.format.GeoJSON()    // 解析矢量地图的格式化类
  29.                 })
  30.             })
  31.         ],
  32.         // 设置显示地图的视图
  33.         view: new ol.View({
  34.             center: [104,30],       // 设置地图显示中心于经度104度,纬度30度处
  35.             zoom: 10,           // 设置地图显示层级为10
  36.             projection: 'EPSG:4326'     //设置投影
  37.         }),
  38.         // 让id为map的div作为地图的容器
  39.         target: 'map'
  40.     })
  41. ‹/script>
  42. ‹/body>
  43. ‹/html>
复制代码
  4、运行结果

三、获取矢量地图上的所有Feature,并设置样式
  1、map2.html
  1. ‹!Doctype html>
  2. ‹html xmlns='http://www.w3.org/1999/xhtml'>
  3. ‹head>
  4.     ‹meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
  5.     ‹meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
  6.     ‹meta content='always' name='referrer'>
  7.     ‹title>OpenLayers 3 :获取矢量地图上的所有Feature,并设置样式‹/title>
  8.     ‹link href='ol.css ' rel='stylesheet' type='text/css'/>
  9.     ‹script type='text/javascript' src='ol.js' charset='utf-8'>‹/script>
  10. ‹/head>
  11. ‹body>
  12. ‹div id='map' style='width: 800px;height:500px;margin: auto'>‹/div>
  13. ‹br>
  14. ‹div style='width: 800px;margin: auto'>
  15.     ‹button type="button" onclick = 'updateStyle()' >修改Feature样式‹/button>
  16. ‹/div>
  17. ‹script>
  18.     /**
  19.      *  创建地图
  20.      */
  21.     var map = new ol.Map({
  22.         // 设置地图图层
  23.         layers: [
  24.             //创建一个使用Open Street Map地图源的图层
  25.             new ol.layer.Tile({
  26.                 source: new ol.source.OSM()
  27.             }),
  28.         ],
  29.         // 设置显示地图的视图
  30.         view: new ol.View({
  31.             center: [104,30],       // 设置地图显示中心于经度104度,纬度30度处
  32.             zoom: 10,           // 设置地图显示层级为10
  33.             projection: 'EPSG:4326'     //设置投影
  34.         }),
  35.         // 让id为map的div作为地图的容器
  36.         target: 'map'
  37.     });
  38.     //创建一个矢量地图源图层,并设置样式
  39.     var  vectorLayer =  new ol.layer.Vector({
  40.             source: new ol.source.Vector({
  41.                 url: 'geojson/map.geojson',     // 地图来源
  42.                 format: new ol.format.GeoJSON()    // 解析矢量地图的格式化类
  43.             }),
  44.             // 设置样式,颜色为绿色,线条粗细为1个像素
  45.             style: new ol.style.Style({
  46.                 stroke: new ol.style.Stroke({
  47.                     color: 'green',
  48.                     size: 1
  49.                  })
  50.             })
  51.         });
  52.     map.addLayer(vectorLayer);
  53.     /**
  54.      * 获取矢量图层上所有的Feature,并设置样式
  55.      */
  56.     function updateStyle(){
  57.         //创建样式,颜色为红色,线条粗细为3个像素
  58.         var  featureStyle = new ol.style.Style({
  59.             stroke: new ol.style.Stroke({
  60.                 color: 'red',
  61.                 size: 3
  62.             })
  63.         })
  64.         //获取矢量图层上所有的Feature
  65.         var features =  vectorLayer.getSource().getFeatures()
  66.         //遍历所有的Feature,并为每个Feature设置样式
  67.         for (var i = 0;i‹features.length;i++){
  68.             features[i].setStyle(featureStyle)
  69.         }
  70.     }
  71. ‹/script>
  72. ‹/body>
  73. ‹/html>
复制代码
  2、运行结果


  4、矢量地图坐标系转换
  矢量地图用的是EPSG:4326,我们可以通过OpenLayers 3内置了地图格式解析器,将坐标转换为EPSG:3857
  1、map3.html
  1. ‹!Doctype html>
  2. ‹html xmlns='http://www.w3.org/1999/xhtml'>
  3. ‹head>
  4.     ‹meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
  5.     ‹meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
  6.     ‹meta content='always' name='referrer'>
  7.     ‹title>OpenLayers 3 :矢量地图坐标系转换‹/title>
  8.     ‹link href='ol.css ' rel='stylesheet' type='text/css'/>
  9.     ‹script type='text/javascript' src='ol.js' charset='utf-8'>‹/script>
  10.     ‹script src="jquery-3.6.0.js">‹/script>
  11. ‹/head>
  12. ‹body>
  13. ‹div id='map' style='width: 1000px;height: 800px;margin: auto'>‹/div>
  14. ‹script>
  15.     /**
  16.      *  创建地图
  17.      */
  18.     var map = new ol.Map({
  19.         // 设置地图图层
  20.         layers: [
  21.             //创建一个使用Open Street Map地图源的图层
  22.             new ol.layer.Tile({
  23.                 source: new ol.source.OSM()
  24.             })
  25.         ],
  26.         // 设置显示地图的视图
  27.         view: new ol.View({
  28.             center: ol.proj.fromLonLat([104,30]),       // 设置地图显示中心于经度104度,纬度30度处
  29.             zoom: 10,           // 设置地图显示层级为10
  30.         }),
  31.         // 让id为map的div作为地图的容器
  32.         target: 'map'
  33.     });
  34.     // 加载矢量地图
  35.     function addGeoJSON(data) {
  36.         var layer = new ol.layer.Vector({
  37.             source: new ol.source.Vector({
  38.                 features: (new ol.format.GeoJSON()).readFeatures(data, {     // 用readFeatures方法可以自定义坐标系
  39.                     dataProjection: 'EPSG:4326',                            // 设定JSON数据使用的坐标系
  40.                     featureProjection: 'EPSG:3857'                          // 设定当前地图使用的feature的坐标系
  41.                 })
  42.             })
  43.         });
  44.         map.addLayer(layer);
  45.     };
  46.     $.ajax({
  47.         url: 'geojson/map.geojson',
  48.         success: function(data, status) {
  49.             // 成功获取到数据内容后,调用方法将矢量地图添加到地图
  50.             addGeoJSON(data);
  51.         }
  52.     });
  53. ‹/script>
  54. ‹/body>
  55. ‹/html>
复制代码
  2、运行结果

  到此这篇关于OpenLayers 3加载矢量地图源的文章就介绍到这了,更多相关OpenLayers 3加载矢量地图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|耀极客论坛 ( 粤ICP备2022052845号-2 )|网站地图

GMT+8, 2022-11-28 20:37 , Processed in 0.075190 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表