首页 > 其他分享 >地图已知一个坐标和一个半径生成随机多边形_Eirice的博客

地图已知一个坐标和一个半径生成随机多边形_Eirice的博客

时间:2022-09-06 23:11:06浏览次数:114  
标签:map code 多边形 Author Eirice 博客 source let 09

背景
这个方案背景其实就是上篇中那次快速响应的一个额外需求,客户需要一个面来表示一个特定的区域,但客户只能提供一个点,且要求生成的图形不能是很规则的圆,长方形或者正方形

需求分析:已知一个点center,一个半径R。我们首先能想到的就是一个圆。以当前圆的圆心为基点我们可以将该圆切割成4个象限。那么是否我们可以使用随机的角度去去这个四个象限内的随机坐标呢?
初次实验,结果是成立的满足可以四边形需求。但仍不满足我们多边不含(四边)的需求。如果想做我们需要一个合理的算法支撑。时间是不允许我这样考虑的
换个思路:外部支撑吧!首先想到的就是Turf.js作为一个空间分析处理的库,理论上它是满足的。
果然发现了一个类circle
在这里插入图片描述

有了转译的算法工具那么剩下的就是数据处理了
1.获取数据源

  /**
       * @Description: 获取数据

       * @Author: ShiWei

       * @Date: 2020-09-14
       */
      getQsCenter(){
        let code=[]
        qs.data.map((item)=>{
           code.push([item.longitude,item.latitude])
        })
        this.getMorePoint(code)
      },

2.处理脏数据(数据中会有重复的点位)

   /**
       * @Description: 去除数据中重复点位信息

       * @Author: ShiWei

       * @Date: 2020-09-14
       */
      getMorePoint(code){
        for(var i=0; i<code.length; i++){
          for(var j=i+1; j<code.length; j++){
            if(code[i][0]===code[j][0]){         //第一个等同于第二个,splice方法删除第二个
              code.splice(j,1);
              j--;
            }
          }
        }
        //todo 调用随机面方法
        this.getAnyPoint(code)
      },

3.生成随机边

   /**
       * @Description:生成一个范围值内的随机数

       * @Author: ShiWei

       * @Date: 2020-09-14
       */
     randomNum(minNum,maxNum){
      switch(arguments.length){
    case 1:
      return parseInt(Math.random()*minNum+1,10);
      break;
    case 2:
      return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
      break;
    default:
      return 0;
      break;
  }
  },

4.生成随机多边形面

      /**
       * @Description:随机面图

       * @Author: ShiWei

       * @Date: 2020-09-14
       */
      getAnyPoint(codes){
       let code=codes;
       let polygon=[];
       for(let i=0;i<code.length;i++){
         let tep=this.randomNum(5,9);  //边数
         var center = code[i];  //中心点
         var radius = 5;        //地理半径
         var options = {steps: tep, units: 'kilometers', properties: {foo: 'bar'}}; //实体
         var circle = turf.circle(center, radius, options);
         polygon.push(circle);
       }
       //添加实体标识对象用来渲染颜色
        polygon.map((ik,index)=>{
          ik.properties.value=index+1;
        })
        let source = this.mapController.makeFeatureCollection(polygon);
        this.mapController.addSource(this.map, "ls-source", source);
        this.drwWinCenter('ls-center','ls-source',this.map);
      },

5.绘制多边形面

     /**
       * @Description:多边形面
        stops 色值识别区域
       * @Author: ShiWei

       * @Date: 2020-09-08
       */
      drwWinCenter(id,source,map){
        if (map.getLayer(id)) {
          map.removeLayer(id)
        }
        //区域面图层
        map.addLayer({
            "id": id,
            "type": "fill",
            "source": source,
            "layout": {
              "visibility": "visible",
            },
            "paint": {
              "fill-color":{
                "type": "interval",
                "property": "value",
                "stops": [
                  [0, "#2D91EA"],
                  [1, "#49DA5D"],
                  [5, "#EB7F0B"],
                  [7, "#EEBD3A"],
                  [10, "#F22A2A"],
                ]
              },
              "fill-opacity": 0.2,
              "fill-outline-color":{
                "type": "interval",
                "property": "value",
                "stops": [
                  [0, "#000"],
                  [1, "#49DA5D"],
                  [5, "#EB7F0B"],
                  [7, "#EEBD3A"],
                  [10, "#F22A2A"],
                ]
              }
            }
        })
      },

//效果预览
在这里插入图片描述

本文转自 https://blog.csdn.net/qq_40696108/article/details/108638026,如有侵权,请联系删除。

标签:map,code,多边形,Author,Eirice,博客,source,let,09
From: https://www.cnblogs.com/hustshu/p/16663682.html

相关文章

  • 博客自动播放音乐
    添加播放器参考博客园美化——添加Apalyer音乐播放器文章给博客加个Aplayer音乐播放器,可以参考它们的官方中文文档增加自定义设置,在页脚HTML代码中加入:<!--为博客底部......
  • 博客园主题
    参考链接博客园自定义主题-陈可儿-博客园(cnblogs.com)https://bndong.github.io/Cnblogs-Theme-SimpleMemory/v2/#/Docs/GettingStarted/install如果你打不开gith......
  • 博客园的打赏功能
    简单几步为自己的博客园主页添加打赏功能:1准备工作:准备支付宝和微信的二维码,后缀名需修改.bmp格式。如zfb.bmp,wx.bmp。   2上传图片:进入自己的博客园,然后进入......
  • 博客园使用数学公式
    1、管理->选型->启用数学公式支持2、使用markdown编辑器3、示例:$\sum_{1}^{m}\theta^TX^i$\[\sum_{1}^{m}\theta^TX^i\]说明:公式使用\(\$\),或\(\$\$\)独立一行,......
  • 关于写博客没有记录问题
    上个学期基本每天都有写博客,共写了102篇,但是老师那边有显示的只有25篇,这让我很不能理解,也可能因为这个我才得了很低的分数。思来想去还是觉得是我编辑的主题问题,当时为了......
  • 开始在博客园记录
    记录内容目录记录内容简介简介现在是2022-09-04,本人今年刚刚大学毕业进入工作。专业自动化,毕业后从事嵌入式相关工作、平时也喜欢自己尝试一些Linux服务器相关的应用尝......
  • Hexo + GitHub Pages 搭建博客
    前言:HEXO是一个快速、简洁且高效的博客框架,GitHubPages是GitHub提供的一个网页寄存服务,可用于存放静态网页,包括博客、项目文档甚至整本书。前提:注册GitHub教......
  • 关于博客
    这是一个随笔2022年09月03日16:54:26以前写的一下博客,有的是摘抄其他大佬的博客,有的是当时学习时自己的一下感悟,当然,是有历史局限性的。所以有很多不对的地方。嗯。之前......
  • Python 博客园快速备份脚本
    鉴于有些小伙伴在寻找博客园迁移到个人博客的方案,本人针对博客园实现了一个自动备份脚本,可以快速将博客园中自己的文章备份成Markdown格式的独立文件,备份后的md文件可以直......
  • 软件定义网络第一次博客园报告
    实验环境安装配置建议遇到安装爆红可以尝试加上--default-timeout=60来限制超时错误......