OpenLayers - Vector绘制地图省市区(十)

2023-11-10

简介

本文讲解经常在开发中出现的功能,绘制地图省市区。主要使用Vector图层通过绘制多边行的方法,绘制出省市区的多边行,把该图层添加到地图图层上,就实现了绘制省市区图形。

Vector

  • 矢量图层: 在客户端呈现的矢量数据。构成一个矢量图层需要一个数据源(source)和一个样式(style),数据源构成矢量图层的要素,样式规定要素显示的方式和外观。一个矢量图层包含一个到多个要素(feature),每个要素由地理属(geometry)和其他属性组成。
  • 常用于从数据库中请求数据,接受数据,并将接收的数据解析成图层上的信息。如将鼠标移动到中国,相应的区域会以红色高亮显示出来,高亮便是矢量图层的行为。

绘制省市区

初始化地图

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <style type="text/css">
    .map {
      height: 500px;
      width: 100%;
    }
  </style>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.6.1/css/ol.css" />
  <script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v6.6.1/build/ol.js"></script>
  <body>
    <div id="map" class="map"></div>
  </body>
  <script>
    var map = new ol.Map({
      target: 'map'
    })

    // 图层
    var layerTile = new ol.layer.Tile({
      source: new ol.source.XYZ({
        url: 'https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
      })
    })
    // 视图
    var view = new ol.View({
      center: ol.proj.fromLonLat([130.41, 28.82]),
      zoom: 4
    })

    map.setView(view)
    map.addLayer(layerTile)
  </script>
</html>

组装数据源

image.png

  • 得到数据后第一步组装数据。直接下载下来的数据是对象格式的。由于我们需要同时绘制多个省市区,这里创建一个数组把每个数据加入进去。
var geo = [{...上海市.json},{...重庆市.json}]

绘制图层

    // 设置图层
    var areaLayer = new ol.layer.Vector({
      source: new ol.source.Vector({
        features: []
      })
    })
    // 添加图层
    map.addLayer(areaLayer)

    let areaFeature = []
    geo.forEach((g) => {
      var areaFeatureTem = null
      let lineData = g.features[0]
      if (lineData.geometry.type == 'MultiPolygon') {
        areaFeatureTem = new ol.Feature({
          geometry: new ol.geom.MultiPolygon(lineData.geometry.coordinates).transform('EPSG:4326', 'EPSG:3857')
        })
      } else if (lineData.geometry.type == 'Polygon') {
        areaFeatureTem = new ol.Feature({
          geometry: new ol.geom.Polygon(lineData.geometry.coordinates).transform('EPSG:4326', 'EPSG:3857')
        })
      }
      areaFeatureTem.setStyle(
        new ol.style.Style({
          fill: new ol.style.Fill({ color: '#4e98f444' }),
          stroke: new ol.style.Stroke({
            width: 3,
            color: [71, 137, 227, 1]
          })
        })
      )
      areaFeature.push(areaFeatureTem)
    })

    // 加入组装好的数据
    areaLayer.getSource().addFeatures([...areaFeature])
  • 先创建图层,然后创建要素。多边行在要素中主要分为两种,MultiPolygonPolygon,都是表示多边行的。不同的是MultiPolygon数据格式是4维数组,Polygon是3维数组。最后把创建好的要素放入图层中。

image.png

总结

矢量图层就是通过很多坐标点来绘制图形,除了绘制省市区也可以通过他来绘制扇形、圆形等。与交互事件联合使用可以实现,自定义绘图、省市区高亮显示等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenLayers - Vector绘制地图省市区(十) 的相关文章

随机推荐

  • 深度学习入门基础CNN系列——卷积计算

    卷积计算 卷积是数学分析中的一种积分变换的方法 在图像处理中采用的是卷积的离散形式 这里需要说明的是 在卷积神经网络中 卷积层的实现方式实际上是数学中定义的互相关 cross correlation 运算 与数学分析中的卷积定义有所不同 这
  • 【操作系统】王道考研 p14 调度算法的评价指标

    视频 知识总览 最后的思维导图最重要 CPU利用率 系统吞吐量 一个比喻 吞相当于把作业拿过来 吐相当于作业做完了拿走 周转时间 周转时间 作业完成时间 作业提交时间 带权周转时间 作业周转时间 作业工作时间 带权周转时间越大 说明等的越久
  • 解决执行 spark.sql 时版本不兼容的一种方式

    场景描述 hive 数据表的导入导出功能部分代码如下所示 使用 assemble 将 Java 程序和 spark 相关依赖一起打成 jar 包 最后 spark submit 提交 jar 到集群执行 public class Spark
  • CRM--今日简报(接口实现)

    接口定义 按照开始时间和结束时间查询今日基本数据 线索数量 商机数量 合同数量 成交的金额 需求 当前用户在当前的线索数量 商机数量 合同数量 成交的金额 当前用户的线索 商机 合同 成交金额都不需要考虑状态 只要是今日做的 哪怕是回收了删
  • 移动FPGA使用Verilog图像处理verilator模拟和ice40执行

    概述 在verilog中实现简单的图像处理操作 该项目围绕一个中央图像处理模块 image processing v 展开 该模块可以包含在使用 verilator 的模拟环境中 也可以包含在 ice40 Ultraplus fpga 的
  • FLASH和EEPROM的区别和扩展

    EEPROM和FLASH总体差异 部分MCU片内不带程序存储器ROM 可执行代码只能放在外面的EEPROM FLASH 外扩 中 单片机对于数据的处理和系统的大量数据采集 需要考虑数据的长期保存和掉电保存等问题 因此外扩EEPROM就是这系
  • Scala-13:集合-列表List

    Scala 13 集合 列表List 一 不可变 List 1 说明 List 默认为不可变集合 创建一个 List 数据有顺序 可重复 List 默认为不可变集合 val list List Int List 1 2 3 4 3 遍历 L
  • 总结:js中Object.setPrototypeOf和Object.create的区别

    首先知道什么是原型 只要这样才能理解下面的内容 Object setPrototypeOf obj prototype 他是将prototype作为已知对象obj的原型 Object create prototype 是创建一个以proto
  • Java-动态代理原理

    1 什么是代理模式 1 例子 1 例子 在了解Java动态代理技术之前 先了解一下什么是代理模式 其实代理模式在生活中很常见 比如房东与中介其实就是一个代理的过程 房东有自己的房子 在代理模式中扮演角色是被代理对象 中介扮演角色是代理对象
  • java 行转列_Java程序员从阿里面试回来,这些面试题你们会吗?

    序言 简单的介绍一下自己的工作经历与职责 在校或者在工作中主要的工作内容 主要负责的内容 你的信息一清二白的写在简历上 这个主要为了缓解面试者的压力 介绍下自己最满意的 有技术亮点的项目或平台 重点介绍下自己负责那部分的技术细节 主要考察应
  • selenium爬虫与配置谷歌浏览器的driver问题

    用selenium爬虫时 明明已经安装了selenium模块 程序却运行不了 在使用selenium之前必须先配置浏览器对应版本的webdriver 本文主要涉及驱动有问题driver 网上有很多手动的方法 查看谷歌浏览的版本然后在其他博主
  • [ESP32]ESP32 Arduino BLE调试 / 与安卓蓝牙数据交互

    帖子导航 ESP32 ESP32 Arduino开发环境搭建 首先得有支持包吧 ESP32 BLE支持包 进入arduino IDE gt 文件 gt 首选项 gt 项目文件位置 到该路径下 打开git工具 项目地址 https githu
  • Python做的一个猜数字应用

    首先需求一共有五次猜测机会 在五次机会中才对就赢了 结束游戏 五次都猜错就输了 也结束游戏 首先先画个草图 这是我画的草图 再根据草图编写一个窗口 一个Label 一个Entry 一个按钮 然后编写功能 将功能绑定函数 import ran
  • Vue3基础(三)__isRef___isReactve

    isRef isRef方法通过vue解构出来 import isRef from vue 主要是为了判断自己生成的响应数据是否是通过isRef 方法生成的
  • elementui 之input 框总结

    1 elementUI的input框 需要用v model绑定一个变量 这个变量相当于原生input框的value 2 placeholder属性和原生的一样
  • centos7-docker安装redis

    1 docker 拉去redis镜像 docker pull redis 2 创建实例并启动 mkdir p mydata redis conf touch mydata redis conf redis conf docker run p
  • 计算机网络安全防范的论文,计算机网络安全防范策略毕业论文.doc

    计算机网络安全防范策略毕业论文 PAGE PAGE PAGE I 摘 要 信息技术的使用给人们的生活 工作带来了数不尽的便捷和好处 然而计算机信息技术也和其他技术一样是一把双刃剑 当大部分人们使用信息技术提高工作效率 为社会创造更多财富的同
  • oracle数据库下创建用户

    一 使用sqlplus 创建用户 1 登陆到sqlplus 2 键入 create user user name identified by password user name 要用户名 password 对应的密码 3 键入 Grant
  • v-loading

    使用v loading在接口为请求到数据之前 显示加载中 直到请求到数据后消失
  • OpenLayers - Vector绘制地图省市区(十)

    简介 本文讲解经常在开发中出现的功能 绘制地图省市区 主要使用Vector图层通过绘制多边行的方法 绘制出省市区的多边行 把该图层添加到地图图层上 就实现了绘制省市区图形 Vector 矢量图层 在客户端呈现的矢量数据 构成一个矢量图层需要