文章目录

  • 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()方法详解:

  1. 我们先创建一个featureSource 要素的数组和每个要素的areaFeature
  2. 实例化一个矢量图层 VectorLayer,命名为 areaLayer
  3. 把图层添加到map地图中,此时图层暂时没有数据
  4. 遍历上面准备的geo json数据源数据,通过 new MultiPolygonnew Polygon 的方式去解析 json数据源 geometry (类型,一般的地图边界可能会存在两种格式),如果是MultiPolygon则使用 new MultiPolygo 去解析,如果是 Polygon则使用new Polygon 去解析json数据,把解析的数据返回到一个参数 areaFeature要素中。
  5. 通过setStyle 去设置图层的样式信息,这里只设置了填充和描边样式
  6. 把要素添信息添加到 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矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解相关推荐

  1. openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

    文章目录 1. 写在前面 2. Heatmap 类实现热力图 2.1 Heatmap 参数 2.2 实现热力图 3. 完整代码 4. 添加删除map图层的方法 5. 热力图自身的get,set方法 1 ...

  2. python可以画动态图吗_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解

    学习python的道路是漫长的,今天又遇到一个问题,所以想写下来自己的理解方便以后查看. 在使用matplotlib的过程中,常常会需要画很多图,但是好像并不能同时展示许多图.这是因为python可视 ...

  3. Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解

    Vue 路由导航守卫(全局守卫.路由独享守卫.组件内守卫)详解: 路由守卫 官方解释 "导航"表示路由正在发生改变.正如其名,vue-router提供的导航守卫主要用来通过跳转或取 ...

  4. openlayers6【十六】vue overlay类实现gif动态图标效果详解

    文章目录 1. 写在前面 2. 效果图 3. 使用overlay类,地图添加动态图标 4. css设置gif图标 5. 完整代码 1. 写在前面 openlayer 里面支持 gif 图标上图的只有 ...

  5. python画三维平面-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  6. vue.js根据数据循环生成表格_vue.js循环for(列表渲染)详解

    vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for {{ item.message }} var example1 = new Vue({ el: '#example-1', ...

  7. python画3d图-Python 绘制酷炫的三维图步骤详解

    通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维矢量(SVG)图. 八面体 我们先以下面这个八面体 ...

  8. matlab导数曲线怎样画,matlab三次样条曲线的绘制(spline和csape函数详解)

    matlab三次样条函数的绘制(spline和csape函数详解) 样条函数是工程中常用的插值函数.早期工程师制图时,把富有弹性的细长木条(所谓样条)用压铁固定在样点上,在其他地方让它自由弯曲,然后沿 ...

  9. vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解

    一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...

最新文章

  1. 基于OpenGL编写一个简易的2D渲染框架-03 渲染基本几何图形
  2. CCIE试验备考之冗余备份VRRP
  3. 另一鲜为人知的单例写法-ThreadLocal
  4. Anaconda建立新的环境,出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 解决过程
  5. 管理员访客身份登录用户账户,java web/springboot/mybatis实现只能看用户信息但不允许修改
  6. 计算机在现代教育主要应用,探讨计算机科学技术在现代教育中的应用
  7. python思想读后感_《Deep Learning with Python》读后感精选
  8. 怎么下载完整的python_怎么下载python并安装
  9. Java中常见的排序算法代码演示
  10. 2008服务器维护,Windows 2008 R2 服务器维护
  11. ACM-树重心的性质及动态维护
  12. Windows下搭建elasticsearch集群案例
  13. 23. Linux 主机上的用户信息传递
  14. 自助友情链接php源码,基于ThinkPHP内核开发的友情链接交易系统平台源码_支持在线支付宝及时到账支付...
  15. 手机点餐系统概述_餐厅点餐系统需求分析
  16. 【英语写作】以亚太杯为例
  17. SMAA算法详解 - SMAABlendingWeightCalculationVS
  18. wps怎么减少行间距,WPS的word怎么不能缩小行间距
  19. 蒟蒻的五周总结(解释引用)《挑战》
  20. 申请工作居住证办事指南

热门文章

  1. python统计excel某一列中文字数
  2. 华为数学建模2021 D题
  3. 卡牌游戏战斗系统的设计和实现一
  4. 模电学习笔记(上交郑老师)12.派生电路和场效应管放大电路
  5. 深入理解OnOK与OnCancel
  6. Dundas Chart Demo For New User
  7. Pytorch中NLLLoss
  8. 在linux下如何制作usb启动盘,正式推出:如何在Linux下制作USB启动盘
  9. python中删除unnamed_python-删除包含NaN,NaT和nans的任何列的行
  10. 未定义标识符 “uint“ “uint8_t” 解决