openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解
文章目录
- 1. VectorLayer矢量图层的理解
- 2. openlayers通过坐标点画中国地图
- 2.1 准备边界的 data 数据
- 2.2 准备 china.json 的数据文件
- 2.3 实现区域描边方法详解
- 2.4 完整代码
- 4. 画省,市,区的边界效果
- 4.1 如:四川省(下载对应的geo json数据)
- 4.2 如:成都市,金牛区(下载对应的geo json数据)
- 5. 画多省市区(粤港澳大湾区)效果
1. VectorLayer矢量图层的理解
在我们做什么事情之前,如果想完全搞懂某一样东西 预先善其事必先利其器
,先搞定其原理之后,在去实现他就会非常简单了,而且下次也会牢记于心。好了,下面我们就开始吧!
在openlayers实际项目中,我们经常会遇到这种需求,通过已知道的一些经纬度坐标点位数据在地图上想要得到一块区域,并把他已更显眼的方式呈现出来。如下图所示效果。
要想实现下面效果,我们是用的是VectorLayer矢量图层
去实现,就像在底图上添加一个图层效果。如下图所示
只是我们现在添加的只有一层,在openlayers中,可以添加多个图层信息,会根据你添加图层的顺序一层一层叠加在地图中。
VectorLayer矢量图层: 矢量图层是在客户端渲染的,在 web 环境中,对应的就是浏览器。构成一个矢量图层的包含一个数据(source)和一个样式(style),数据构成矢量图层的要素,样式规定要素显示的方式和外观。一个初始化成功的矢量图层包含一个到多个要素(feature),每个要素由地理属(geometry)和多个其他的属性,可能包含名称等。
更多图层的理解可以访问 openlayers 6【四】地图图层Layers详解 了解更多。
好了,说完矢量图层的简单的理论东西,我们下面来实现画一个中国地图的图层效果。
2. openlayers通过坐标点画中国地图
上面提到,图层包含数据(source)和一个样式(style),现在我们先准备渲染一块区域的数据源。
2.1 准备边界的 data 数据
给大家推荐一个geoJson提供边界数据的网址:geo数据源,大家可以在上面选择需要的区域的边界,下载json数据。
2.2 准备 china.json 的数据文件
红色框中是 geo数据源 中国的边界数据
2.3 实现区域描边方法详解
一个初始化成功的矢量图层包含一个到多个要素(feature),每个要素由地理属(geometry)和多个其他的属性,可能包含名称等
2.3.1 addArea()方法详解:
- 我们先创建一个featureSource 要素的数组和每个要素的areaFeature
- 实例化一个矢量图层 VectorLayer,命名为
areaLayer
- 把图层添加到map地图中,此时图层暂时没有数据
- 遍历上面准备的geo json数据源数据,通过
new MultiPolygon
和new Polygon
的方式去解析 json数据源 geometry (类型,一般的地图边界可能会存在两种格式),如果是MultiPolygon则使用new MultiPolygo
去解析,如果是 Polygon则使用new Polygon
去解析json数据,把解析的数据返回到一个参数 areaFeature要素中。 - 通过
setStyle
去设置图层的样式信息,这里只设置了填充和描边样式 - 把要素添信息添加到
areaFeature
图层的数据源中
2.3.2 addArea() 方法完整代码:
/*** 设置区域*/
addArea(geo = []) {if (geo.length == 0) return false;let areaFeature = null;// 设置图层this.c = new VectorLayer({source: new VectorSource({features: []})});// 添加图层this.map.addLayer(this.areaLayer);geo.forEach(g => {let lineData = g.features[0];if (lineData.geometry.type == "MultiPolygon") {areaFeature = new Feature({geometry: new MultiPolygon(lineData.geometry.coordinates).transform("EPSG:4326", "EPSG:3857")});} else if (lineData.geometry.type == "Polygon") {areaFeature = new Feature({geometry: new Polygon(lineData.geometry.coordinates).transform("EPSG:4326", "EPSG:3857")});}});areaFeature.setStyle(new Style({fill: new Fill({ color: "#4e98f444" }),stroke: new Stroke({width: 3,color: [71, 137, 227, 1]})}));this.areaLayer.getSource().addFeatures([areaFeature]);
},
2.4 完整代码
<template><div id="app"><div id="Map" ref="map"></div></div>
</template>
<script>
import "ol/ol.css";
import TileLayer from "ol/layer/Tile";
import VectorLayer from "ol/layer/Vector";
import VectorSource from "ol/source/Vector";
import XYZ from "ol/source/XYZ";
import { Map, View, Feature, ol } from "ol";
import { Style, Stroke, Fill } from "ol/style";
import { Polygon, MultiPolygon } from "ol/geom";
import { defaults as defaultControls, OverviewMap } from "ol/control";
import { fromLonLat } from "ol/proj";import areaGeo from "@/geoJson/china.json";
export default {data() {return {map: null,areaLayer: null};},methods: {/*** 初始化地图*/initMap() {this.map = new Map({target: "Map",controls: defaultControls({zoom: true}).extend([]),layers: [new TileLayer({source: new XYZ({url:"http://map.geoq.cn/ArcGIS/rest/services/ChinaOnlineStreetPurplishBlue/MapServer/tile/{z}/{y}/{x}"})},{ zoomOffset: 1 })],view: new View({center: fromLonLat([108.522097, 37.272848]),zoom: 4.7,maxZoom: 19,minZoom: 4})});},/*** 设置区域*/addArea(geo = []) {if (geo.length == 0) return false;let areaFeature = null;// 设置图层this.areaLayer = new VectorLayer({source: new VectorSource({features: []})});// 添加图层this.map.addLayer(this.areaLayer);geo.forEach(g => {let lineData = g.features[0];if (lineData.geometry.type == "MultiPolygon") {areaFeature = new Feature({geometry: new MultiPolygon(lineData.geometry.coordinates).transform("EPSG:4326", "EPSG:3857")});} else if (lineData.geometry.type == "Polygon") {areaFeature = new Feature({geometry: new Polygon(lineData.geometry.coordinates).transform("EPSG:4326", "EPSG:3857")});}});areaFeature.setStyle(new Style({fill: new Fill({ color: "#4e98f444" }),stroke: new Stroke({width: 3,color: [71, 137, 227, 1]})}));this.areaLayer.getSource().addFeatures([areaFeature]);},},mounted() {this.ini tMap();//初始化地图方法this.addArea(areaGeo);//添加区域图层方法}
};
</script>
<style lang="scss" scoped>
// 此处非核心内容,已删除
</style>
4. 画省,市,区的边界效果
道理一样,只需要换成对应的 geo边界数据文件即可
4.1 如:四川省(下载对应的geo json数据)
import areaGeo from "@/geoJson/sichuan.json";
4.2 如:成都市,金牛区(下载对应的geo json数据)
import areaGeo from "@/geoJson/chengdu.json";
import areaGeo from "@/geoJson/jinniu.json";
5. 画多省市区(粤港澳大湾区)效果
5.1 如:粤港澳大湾区项目需要如下展示效果,把下载的多个geo数据源的文件放在一个json里面,用逗号隔开。
9area.json 数据文件截图。(分别下载的是粤港澳范围的9块区域数据geoJson数据)
import areaGeo from "@/geoJson/9area.json";
openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解相关推荐
- openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解
文章目录 1. 写在前面 2. Heatmap 类实现热力图 2.1 Heatmap 参数 2.2 实现热力图 3. 完整代码 4. 添加删除map图层的方法 5. 热力图自身的get,set方法 1 ...
- python可以画动态图吗_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
学习python的道路是漫长的,今天又遇到一个问题,所以想写下来自己的理解方便以后查看. 在使用matplotlib的过程中,常常会需要画很多图,但是好像并不能同时展示许多图.这是因为python可视 ...
- Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解
Vue 路由导航守卫(全局守卫.路由独享守卫.组件内守卫)详解: 路由守卫 官方解释 "导航"表示路由正在发生改变.正如其名,vue-router提供的导航守卫主要用来通过跳转或取 ...
- openlayers6【十六】vue overlay类实现gif动态图标效果详解
文章目录 1. 写在前面 2. 效果图 3. 使用overlay类,地图添加动态图标 4. css设置gif图标 5. 完整代码 1. 写在前面 openlayer 里面支持 gif 图标上图的只有 ...
- python画三维平面-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解
vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for {{ item.message }} var example1 = new Vue({ el: '#example-1', ...
- python画3d图-Python 绘制酷炫的三维图步骤详解
通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...
- matlab导数曲线怎样画,matlab三次样条曲线的绘制(spline和csape函数详解)
matlab三次样条函数的绘制(spline和csape函数详解) 样条函数是工程中常用的插值函数.早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿 ...
- vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解
一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...
最新文章
- 基于OpenGL编写一个简易的2D渲染框架-03 渲染基本几何图形
- CCIE试验备考之冗余备份VRRP
- 另一鲜为人知的单例写法-ThreadLocal
- Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 解决过程
- 管理员访客身份登录用户账户,java web/springboot/mybatis实现只能看用户信息但不允许修改
- 计算机在现代教育主要应用,探讨计算机科学技术在现代教育中的应用
- python思想读后感_《Deep Learning with Python》读后感精选
- 怎么下载完整的python_怎么下载python并安装
- Java中常见的排序算法代码演示
- 2008服务器维护,Windows 2008 R2 服务器维护
- ACM-树重心的性质及动态维护
- Windows下搭建elasticsearch集群案例
- 23. Linux 主机上的用户信息传递
- 自助友情链接php源码,基于ThinkPHP内核开发的友情链接交易系统平台源码_支持在线支付宝及时到账支付...
- 手机点餐系统概述_餐厅点餐系统需求分析
- 【英语写作】以亚太杯为例
- SMAA算法详解 - SMAABlendingWeightCalculationVS
- wps怎么减少行间距,WPS的word怎么不能缩小行间距
- 蒟蒻的五周总结(解释引用)《挑战》
- 申请工作居住证办事指南
热门文章
- python统计excel某一列中文字数
- 华为数学建模2021 D题
- 卡牌游戏战斗系统的设计和实现一
- 模电学习笔记(上交郑老师)12.派生电路和场效应管放大电路
- 深入理解OnOK与OnCancel
- Dundas Chart Demo For New User
- Pytorch中NLLLoss
- 在linux下如何制作usb启动盘,正式推出:如何在Linux下制作USB启动盘
- python中删除unnamed_python-删除包含NaN,NaT和nans的任何列的行
- 未定义标识符 “uint“ “uint8_t” 解决