zoukankan      html  css  js  c++  java
  • Vue+Openlayer使用Draw实现交互式绘制多边形并获取面积

    场景

    Vue+Openlayer使用Draw实现交互式绘制线段:

    https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/121287934

    在上面的基础上实现的交互式绘制线段,还可以实现绘制多边形并直接计算出面积。

    注:

    博客:
    https://blog.csdn.net/badao_liumang_qizhi
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    实现

    1、导入基本模块

    //导入基本模块
    import "ol/ol.css";
    import Map from "ol/Map";
    import View from "ol/View";
    import { Fill,Style,Stroke} from "ol/style";
    //导入相关模块
    import { Tile as TileLayer , Vector as VectorLayer } from 'ol/layer'
    import { TileWMS ,Vector as VectorSource } from 'ol/source'
    import { Select, Draw } from 'ol/interaction'
    import { getArea } from "ol/sphere";

    2、与前面博客相比,绘图工具传递的类型为Polygon

    this.onAddInteraction('Polygon')

    3、绘制结束时触发的事件中获取所绘制面积

            //绘制结束时触发的事件
            this.draw.on('drawend', function(e) {
                const geometry = e.feature.getGeometry()
                var area = getArea(geometry);
                console.log("area="+area)
                var output;
                  if (area > 10000) {
                    output = (Math.round(area / 1000000 * 100) / 100) +
                      ' ' + 'km<sup>2</sup>';
                  } else {
                    output = (Math.round(area * 100) / 100) +
                      ' ' + 'm<sup>2</sup>';
                  }
                console.log("output="+output)
                let pointArr = geometry.getCoordinates()
                self.coordinate.push(pointArr)
                console.log("self.coordinate="+self.coordinate);
                self.removeDraw()
            })

    这里在绘制结束事的回调方法中直接获取geometry,然后调用ol自带的getArea方法,计算出面积

    计算面积在线演示地址

    https://codesandbox.io/s/ol-measure-u3yob?file=/src/measure.ts:8795-8825

    4、完整示例代码

    <template>
        <div id="app">
          <div id="map" class="map"></div>
        </div>
    </template>
    
    <script>
    //导入基本模块
    import "ol/ol.css";
    import Map from "ol/Map";
    import View from "ol/View";
    import { Fill,Style,Stroke} from "ol/style";
    //导入相关模块
    import { Tile as TileLayer , Vector as VectorLayer } from 'ol/layer'
    import { TileWMS ,Vector as VectorSource } from 'ol/source'
    import { Select, Draw } from 'ol/interaction'
    import { getArea } from "ol/sphere";
    export default {
      name: "olMapTileWMSDrawPolygon",
      data() {
        return {
          map: null, // map地图
          layer:null, //地图图层
          lineLayer:null, //线图层
          draw: null,
          lineSource:null,
          coordinate: [],
       };
      },
      mounted() {
        this.initMap();
      },
      methods: {
    
        // 绘图工具
        onAddInteraction(type) {
            let self = this
            //勾绘矢量图形的类
            this.draw = new Draw({
                //source代表勾绘的要素属于的数据集
                source: self.lineSource,
                //type 表示勾绘的要素包含的 geometry 类型
                type: type
            })
    
            //绘制结束时触发的事件
            this.draw.on('drawend', function(e) {
                const geometry = e.feature.getGeometry()
                var area = getArea(geometry);
                console.log("area="+area)
                var output;
                  if (area > 10000) {
                    output = (Math.round(area / 1000000 * 100) / 100) +
                      ' ' + 'km<sup>2</sup>';
                  } else {
                    output = (Math.round(area * 100) / 100) +
                      ' ' + 'm<sup>2</sup>';
                  }
                console.log("output="+output)
                let pointArr = geometry.getCoordinates()
                self.coordinate.push(pointArr)
                console.log("self.coordinate="+self.coordinate);
                self.removeDraw()
            })
            self.map.addInteraction(this.draw)
        },
        //删除交互
        removeDraw() {
            this.map.removeInteraction(this.draw)
        },
        initMap() {
          //地图图层
          this.layer = new TileLayer({
            source: new TileWMS({
              //不能设置为0,否则地图不展示。
              ratio: 1,
              url: "http://localhost:8000/geoserver/nyc/wms",
              params: {
                LAYERS: "nyc:nyc_roads",
                STYLES: "",
                VERSION: "1.1.1",
                tiled: true
              },
              serverType: "geoserver",
            }),
          });
    
          //线的图层
          this.lineSource = new VectorSource({ wrapX: false });
          this.lineLayer = new VectorLayer({
              source: this.lineSource,
          });
    
          this.map = new Map({
            //地图容器ID
            target: "map",
            //引入地图
            layers: [this.layer,this.lineLayer],
            view: new View({
              //地图中心点
              center: [987777.93778, 213834.81024],
              zoom: 14,
              minZoom:6, // 地图缩放最小级别
              maxZoom:19,
            }),
          });
    
          // 获取点击地图的坐标(选中样式)
          let selectedStyle = new Style({
              fill: new Fill({
                  color: 'rgba(1, 210, 241, 0.2)'
              }),
              stroke: new Stroke({
                  color: 'yellow',
                   4
              })
          })
          // 选择线的工具类
          this.selectTool = new Select({
              multi: true,
              hitTolerance: 10, // 误差
              style: selectedStyle // 选中要素的样式
          })
          //添加交互
          this.map.addInteraction(this.selectTool)
          //调用绘图工具并传递类型为线,其他类型有Point,LineString,Polygon,Circle
          this.onAddInteraction('Polygon')
    
        },
      },
    };
    </script>
    
    <style scoped>
    .map {
       100%;
      height: 800px;
    }
    </style>
  • 相关阅读:
    ch2_CaseStudy_CanonicalNASLScript.txt
    树形数据广度排序处理示例.sql
    编程管理SQL SERVER的帐号.sql
    索引影响查询结果顺序的示例
    校验表中数据是否有循环编码的通用存储过程.sql
    BackupAndRestoreSmallWorks.sql
    cPanel下安装GodaddySSL教程
    ExcludingRNG.cs
    SymmetricAlgorithmEvaluator.cs
    操作SQLSERVERAGENT服务的扩展存储过程.sql
  • 原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/15547392.html
Copyright © 2011-2022 走看看