您的当前位置:首页>全部文章>文章详情

【AntDesignPro】L7Plot地理可视化组件的使用

CrazyPanda发表于:2023-12-14 11:15:22浏览:657次TAG:

L7Plot介绍

L7Plot 基于 L7 实现的开箱即用地理空间数据可视化图表库

  • L7Plot 专注于地理可视化图表。

    • 以声明配置式的方式,降低用户使用成本;

    • 以常见地理图表分类的方式,降低用户选择成本;

    • 内部集成全国行政区域数据,降低用户使用地理数据心智;

    • 支持多图层及多图表层叠,方便用户定制复杂的业务场景;

  • L7Plot 专注于地理数据可视化展示,不会涉及数据编辑能力。

image.png

前言

项目需要,使用antdesignpro做前端,并绘制可视化大屏,回执地图组件,于是使用了L7Plot。

功能目的

绘制地图,并标记坐标点,鼠标指向坐标时,显示坐标点信息。

参考官网:https://ant-design-charts.antgroup.com/

经过多番试用,最终选择了高级图表来实现此功能https://l7plot.antv.antgroup.com/api/advanced-plot


1、定义接口

export async function organizationCount(body?: { [key: string]: any }, options?: { [key: string]: any }) {
  return request<API.RequestResult>(host + '/base/count/organization_count', {
    method: 'POST',
    credentials: 'include',
    data: body,
    ...(options || {}),
  });
}

后台tp框架,接口

public function organization_count()
    {
        $list = Db::name('data_organization')->where("location != ''")->field("id,name,address,location")->select();
        $count2 = Db::name('system_user')->where(['usertype'=>2,'is_deleted'=>0])->field("oid,count(id) as count")->group('oid')->select();

        foreach ($list as $vo)
        {
            $location = explode(',',$vo['location']);
            $user_count = 0;
            foreach ($count2 as $k2 => $v2)
            {
                if ($v2['oid'] == $vo['id'])
                {
                    $user_count = round($v2['count']);
                }
            }

            $res[] = [
                'lng' => round($location[0],6),//坐标
                'lat' => round($location[1],6),//坐标
                'depth' => 10,
                'mag' => 5,//气泡大小
                'name' => $vo['name'],//tooltip显示
                'address' => $vo['address'],//tooltip显示
                'user_count' => $user_count,//tooltip显示
            ];
        }

        $this->success('成功',$res);
    }


2、引入组件

import { organizationCount } from '@/services/ant-design-pro/countApi';
import { L7Plot } from '@antv/l7plot';
import { useEffect } from 'react';
import styles from '../style.less';

3、绘制地图

image.png

此处我选择的是高德地图amap。

缩放级别,此处我选择级别4

image.png

地图样式,此处我选择dark,此处有些问题,我选择的dark原先是生效的,过了段时间后不生效了,可能是版本更新问题吧,由于已经做好,就没有在修改版本,自己写了个css样式,将本经修改掉了

image.png

地图如层配置:

type: 'choropleth',

地图需要显示省级,我这里是河南省,并写上邮政编码

viewLevel: {
              level: 'province', 
              adcode: '410000',
            },

此处需要与数据来源配置相匹配

source: {
              data: [],
              joinBy: {
                sourceField: 'code',
                geoField: 'adcode',
              },
            },

设置地图颜色

color: '#1890FF',

其它的按照官网示例配置就可以,有需要的可自行调整。

已上地图层已经配置好了,接下来配置坐标点气泡。


4、绘制气泡层

type: 'dot',

配置数据源

source: {
              data: res?.data,
              parser: { type: 'json', x: 'lng', y: 'lat' },
            },

配置动效

animate: {
              enable: true,
              speed: 0.3,
              rings: 3,
            },

配置气泡颜色大小

color: {
              field: 'mag',
              value: ['blue'],
              scale: { type: 'quantile', range: [20, 50] },
            },
            size: {
              field: 'mag',
              value: ({ mag }) => mag * 10,
            },

配置弹出层tooltip数据及样式,样式是地图成型后自己一点一点修改的(辛苦)

tooltip: {
              items: [
                { field: 'name', alias: '机构名称:' },
                { field: 'address', alias: '机构地址:' },
                { field: 'user_count', alias: '教师数量:' },
              ],
              domStyles: {
                'l7plot-tooltip': {
                  backgroundColor: 'rgba(17, 4, 64, 0.8)',
                  backgroundSize: '100% 100%',
                  border: '2px #0174f5 solid',
                  borderRadius: '10px',
                  cursor: 'pointer',
                  width: '240px',
                  position: 'relative',
                  left: 16,
                  bottom: 16,
                },
                'l7plot-tooltip__list': { background: 'none' },
                'l7plot-tooltip__list-item': {
                  whiteSpace: 'normal',
                  wordBreak: 'break-word',
                },
                'l7plot-tooltip__name': { color: '#ddd',textAlign:'left' },
                'l7plot-tooltip__value': { color: '#ddd',textAlign:'right' },
              },
              showComponent: true,
            },


最后,完整代码

import { organizationCount } from '@/services/ant-design-pro/countApi';
import { L7Plot } from '@antv/l7plot';
import { useEffect } from 'react';
import styles from '../style.less';

const OrganizationModal = () => {
  const initMap = () => {
    organizationCount().then((res) => {
      new L7Plot('container', {
        map: {
          type: 'amap',
          style: 'dark',
          center: [113.753094, 34.767052],
          zoom: 4,
          pitch: 0,
        },
        plots: [
          {
            type: 'choropleth',
            zIndex: 1,
            source: {
              data: [],
              joinBy: {
                sourceField: 'code',
                geoField: 'adcode',
              },
            },
            viewLevel: {
              level: 'province',
              adcode: '410000',
            },
            autoFit: true,
            color: '#1890FF',
            style: {
              opacity: 1,
              stroke: '#F2F7F7',
              lineWidth: 0.6,
              lineOpacity: 0.8,
            },
            label: {
              visible: true,
              field: 'name',
              style: {
                fill: '#000',
                opacity: 0.8,
                fontSize: 10,
                stroke: '#f0f0f0',
                strokeWidth: 2,
                textAllowOverlap: false,
                padding: [5, 5],
                textOffset: [0, 40],
              },
            },
          },
          {
            type: 'dot',
            zIndex: 2,
            source: {
              data: res?.data,
              parser: { type: 'json', x: 'lng', y: 'lat' },
            },
            color: {
              field: 'mag',
              value: ['blue'],
              scale: { type: 'quantile', range: [20, 50] },
            },
            size: {
              field: 'mag',
              value: ({ mag }) => mag * 1.5,
            },
            animate: {
              enable: false,
            },
          },
          {
            type: 'dot',
            zIndex: 3,
            source: {
              data: res?.data,
              parser: { type: 'json', x: 'lng', y: 'lat' },
            },
            color: {
              field: 'mag',
              value: ['blue'],
              scale: { type: 'quantile', range: [20, 50] },
            },
            size: {
              field: 'mag',
              value: ({ mag }) => mag * 10,
            },
            style: {
              opacity: 1,
              stroke: '#fff',
              strokeWidth: 1,
            },
            state: { active: true },
            animate: {
              enable: true,
              speed: 0.3,
              rings: 3,
            },
            tooltip: {
              items: [
                { field: 'name', alias: '机构名称:' },
                { field: 'address', alias: '机构地址:' },
                { field: 'user_count', alias: '教师数量:' },
              ],
              domStyles: {
                'l7plot-tooltip': {
                  backgroundColor: 'rgba(17, 4, 64, 0.8)',
                  backgroundSize: '100% 100%',
                  border: '2px #0174f5 solid',
                  borderRadius: '10px',
                  cursor: 'pointer',
                  width: '240px',
                  position: 'relative',
                  left: 16,
                  bottom: 16,
                },
                'l7plot-tooltip__list': { background: 'none' },
                'l7plot-tooltip__list-item': {
                  whiteSpace: 'normal',
                  wordBreak: 'break-word',
                },
                'l7plot-tooltip__name': { color: '#ddd',textAlign:'left' },
                'l7plot-tooltip__value': { color: '#ddd',textAlign:'right' },
              },
              showComponent: true,
            },
          },
        ],
        layers: [],
      });
    });
  };

  useEffect(() => {
    initMap();
  }, []);

  return (
    <div className={styles.modal} style={{ height: '100%' }}>
      <div className={styles.modal2}>
        <div className={styles.modalContent} style={{ padding: 2 }}>
          <div id="container" style={{ width: '100%', height: '100%', overflow: 'hidden' }}></div>
        </div>
      </div>
    </div>
  );
};

export default OrganizationModal;

在页面引入此组件即可

<Row gutter={24} style={{ textAlign: 'center' }}>
              <Col xl={{ span: 24 }} style={{ height: '60vh' }}>
                <OrganizationModal />
              </Col>
            </Row>

最终效果

image.pngimage.png

猜你喜欢

【AntDesignPro】Ant Design Pro学习记录—ProTable的使用(三)
一、 自定义检索条件部分列表页需要做一些简单的数据汇总统计,并能够跟随检索条件自动变化,protable自带的功能没有找到对应的实现方法,最后决定自己来实现这个功能。1、关闭ProTable自带检索功能search={false}2、自定义检索表单在ProTable上方加入自定义表单&lt;Card&nbsp;bordered={false}&nbsp;style={{&nbsp;marginBottom:&nbsp;15&nbsp;}}&gt; &nbsp;&nbsp;&nbsp;&nbsp;
发表于:2024-02-20 浏览:477 TAG:
【AntDesignPro】使用高德地图设置考勤区域
参考高德开放平台https://lbs.amap.com/api/javascript-api-v2/guide/abc/amap-react功能要求:使用AntDesignPro开发系统管理端,考勤模块需要设置APP考勤打卡区域,需要页面显示地图定位并设置考勤范围(地图上画圈),以便APP在画圈范围内打卡使用。1、 准备2、 下载react类组件代码参考官网流程,可正常加载出地图组件,下面是我的页面和组件文件组件文件3、 安装并引入AmAP Loadernpm&nbsp;i&nbsp;@ama
发表于:2023-12-14 浏览:737 TAG:
【AntDesignPro】Ant Design Pro学习记录—前后端分离跨域设置,解决跨域session不一致
目录前言一、为什么跨域二、跨域配置三、跨域请求session不一致前言第一次做前后端分离,也是踩了很多坑,记录一下AntDesignPro跨域解决的方式。服务器系统使用Nginx,服务端使用thinkphp6。AntDesignPro正式build放到服务器上后,提示登录成功,但一直登录不上,后来发现是跨域session不同导致的,登录的时候session和登录成功后session的id不同,导致提示登录成功,就是登录不进去的情况。一、为什么跨域不想知道为什么要跨域,只想知道怎么解决。二、跨域配
发表于:2023-11-28 浏览:552 TAG:
【React】 react 绘制矩形
在React中绘制矩形,可以使用HTML5的&lt;canvas&gt;元素结合React组件的生命周期方法来实现。以下是一个简单的React组件示例,用于绘制矩形:import&nbsp;React,&nbsp;{&nbsp;Component&nbsp;}&nbsp;from&nbsp;&#39;react&#39;; &nbsp; class&nbsp;Rectangle&nbsp;extends&nbsp;Component&nbsp;{ &nbsp;&nbsp;componentDid
发表于:2024-04-01 浏览:306 TAG:
【AntDesignPro】Ant Design Pro学习记录—ProTable的使用(一)
目录一、关于ProTable二、使用步骤1.新建页面2.修改接口3.接口调用4.数据显示和检索1)不同类型内容显示2)列表检索3)列表内容样式设置5.其它1)render的简单使用2)图片点击预览3)翻页总结前言因为项目需要,确定了Ant Design Pro框架来开发后台管理端,刚接触这套框架,而且配套的资料真的很少,只能基于官方demo和网上不完整的学习经验一次次尝试,终于有个像样的结果,记录一下研究学习的成果,也给需要的同学一些帮助。本次学习研究基于Ant Design Pro V5版本,
发表于:2023-11-28 浏览:818 TAG: #前端 #antd #AntDesignPro
【React】前端框架 React 学习总结
目录一、React在HTML里的运用二、React框架的常用操作项目打包1、JSX基础语法规则2、state数据的使用3、生命周期4、数据的双向绑定与Ref5、PropTypes验证规则6、React里的插槽7、错误边界8、直接操作refs元素9、高阶组件的运用案例10、性能优化11、Hook生命周期钩子的使用12、React里的计算属性三、组件之间的传值1、父子组件之间传值2、子向父传值3、context实现跨层级通信context hook案例四、网络请求框架使用五、React路由的使用声明
发表于:2023-12-05 浏览:879 TAG: #php
【AntDesignPro】Ant Design Pro学习记录—播放视频和音频
在ant design pro中,使用video和audio标签播放视频和音频1、播放视频我使用ModalForm弹框显示,autoPlay设置是否自动播放,controls设置操作按钮是否显示,设置好宽度和高度即可src是配置视频文件的链接&lt;ModalForm &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title=&quot;播放视频&quot; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;n
发表于:2024-05-17 浏览:444 TAG:
【AntDesignPro】Ant Design Pro学习记录—ProTable的使用(二)
目录一、列表检索初始值设置二、字段缩略显示一、列表检索初始值设置使用initialValue属性,配置列表检索的初始值const&nbsp;columns:&nbsp;ProColumns&lt;API.RoomItem&gt;[]&nbsp;=&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title:&nbsp;&#39;名称&#39;,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;nb
发表于:2023-11-28 浏览:700 TAG:
【React】如何在 React 类中声明常量?
使用 react 开发应用程序时,有必要声明常量来存储在组件或应用程序的整个生命周期中保持不变的值。常量可以帮助提高代码可读性,提供管理共享值的中心位置,并增强可维护性。在本文中,我们将探讨如何在 react 类组件中声明常量。导入 React首先,我们假设您已经设置了 React 环境并且有一个可供使用的类组件。在声明常量之前,请确保您已导入必要的库。这包括导入 React,它是在 React 中构建用户界面的核心库。import&nbsp;React&nbsp;from&nbsp;&#39;
发表于:2024-04-16 浏览:297 TAG:
【AntDesignPro】Ant Design Pro学习记录—自定义菜单选中
页面增删改查,打开子页面时,要让父页面菜单选中,参考官网给出的方案菜单的高级用法 - Ant Design Pro&nbsp;使用的V5版本,直接设置 parentKeys:[&#39;/product&#39;] 即可export&nbsp;default&nbsp;[ &nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;path:&nbsp;&#39;/product&#39;, &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;不展示菜单 &nbsp;
发表于:2023-11-28 浏览:756 TAG: