antv/l7 -- 地图功能

一、 使用前的准备

  1. 首先,注册开发者账号,成为高德开放平台开发者

  2. 登陆之后,在进入「应用管理」 页面「创建新应用」

  3. 为应用添加 Key,「服务平台」一项请选择「 Web 端 ( JSAPI ) 」

二、安装依赖 

// 安装L7 依赖

npm install --save @antv/l7

// 安装第三方底图依赖

npm install --save @antv/l7-maps

三、初始化地图

1. 获取创建的key

2. 注入token中

import { Scene } from '@antv/l7';
import { GaodeMap } from '@antv/l7-maps';
import { useEffect } from 'react';

export default () => {
  useEffect(() => {
    const scene = new Scene({
      id: 'map',
      map: new GaodeMap({
        style: 'dark',
        center: [105.770672, 38.159869],
        zoom: 2.90,
        token: '你创建的Key',
      }),
    });
  }, []);
  return (
    <div
      id="map"
      style={{
        height: 500,
        width: 800,
        position: 'relative',
        justifyContent: 'center',
      }}
    ></div>
  );
};

3. 效果图

四、绘制填充图

1. 中国各省 GeoJSON 数据。

https://gw.alipayobjects.com/os/bmw-prod/d6da7ac1-8b4f-4a55-93ea-e81aa08f0cf3.json

2. 填充地图 

import { PolygonLayer } from '@antv/l7';

const chinaPolygonLayer = new PolygonLayer({})
  .source(da1)
  .color('name', [
    'rgb(239,243,255)',
    'rgb(189,215,231)',
    'rgb(107,174,214)',
    'rgb(49,130,189)',
    'rgb(8,81,156)',
  ]);

scene.addLayer(chinaPolygonLayer);

3. 效果  

五、增加行政区划描边和行政区划文字标注

1. 数据

https://gw.alipayobjects.com/os/bmw-prod/c4a6aa9d-8923-4193-a695-455fd8f6638c.json

2. 填充地图

import { LineLayer, PointLayer } from '@antv/l7';

const layer2 = new LineLayer({
  zIndex: 2,
})
  .source(da1)
  .color('rgb(93,112,146)')
  .size(0.6)
  .style({
    opacity: 1,
  });

scene.addLayer(layer2);

const labelLayer = new PointLayer({
  zIndex: 5,
})
  .source(da2, {
    parser: {
      type: 'json',
      coordinates: 'center',
    },
  })
  .color('#fff')
  .shape('name', 'text')
  .size(12)
  .style({
    opacity: 1,
    stroke: '#fff',
    strokeWidth: 0,
    padding: [5, 5],
    textAllowOverlap: false,
  });

scene.addLayer(labelLayer);

3. 效果

六、定义高亮

1.  默认hover高亮

chinaPolygonLayer.active(true); // 开启默认高亮效果

chinaPolygonLayer.active({ color: 'red' }); // 开启并设置高亮颜色为红色

 

2. 自定义点击高亮 

const hightLayer = new LineLayer({
  zIndex: 4, // 设置显示层级
  name: 'hightlight'
}) .source({
    type: 'FeatureCollection',
    features: [ ]
  })
  .shape('line')
  .size(2)
  .color('red');

scene.addLayer(hightLayer);

// 设置点击生效
chinaPolygonLayer.on('click', feature => {
    hightLayer.setData({
      type: 'FeatureCollection',
      features: [ feature.feature ]
    });
});

3. 添加hover信息框

import { Popup } from '@antv/l7';

chinaPolygonLayer.on('mousemove', (e) => {
  const popup = new Popup({
    offsets: [0, 0],
    closeButton: false,
  })
    .setLnglat(e.lngLat)
    .setHTML(`<span>地区: ${e.feature.properties.name}</span>`);
  scene.addPopup(popup);
});

 

七、添加图例

1. 样式

.infolegend {
  padding: 5px;
  background: white;
  > i {
    display: inline-block;
    width: 20px !important;
    height: 10px;
  }
}

2. 代码

    import { Control } from '@antv/l7';   
    import './index.less';

    const legend = new Control({
      position: 'bottomright',
    });

    legend.onAdd = function () {
      let el = document.createElement('div');
      el.className = 'infolegend legend';
      const grades = [0, 10, 20, 50, 100, 200, 500];
      const color = [
        'rgb(255,255,217)',
        'rgb(237,248,177)',
        'rgb(199,233,180)',
        'rgb(127,205,187)',
        'rgb(65,182,196)',
        'rgb(29,145,192)',
        'rgb(34,94,168)',
        'rgb(12,44,132)',
      ];
      for (let i = 0; i < grades.length; i++) {
        el.innerHTML +=
          '<i style="background:' +
          color[i] +
          '"></i> ' +
          grades[i] +
          (grades[i + 1] ? '-' + grades[i + 1] + '<br>' : '+');
      }
      return el;
    };

    scene.addControl(legend);

 3. 效果

八、成品代码

// JSX

import {
  Control,
  LineLayer,
  PointLayer,
  PolygonLayer,
  Popup,
  Scene,
} from '@antv/l7';
import { GaodeMap } from '@antv/l7-maps';
import { useModel } from '@umijs/max';
import { useEffect } from 'react';
import './index.less';
export default () => {
  const { da1, da2 } = useModel('maps');

  useEffect(() => {
    // 初始化地图
    const scene = new Scene({
      id: 'map',
      map: new GaodeMap({
        style: 'blank',
        center: [105.770672, 38.159869],
        zoom: 2.9,
        token: 'xxxxxx',
      }),
    });

    // 填充图
    const color = [
      'rgb(255,255,217)',
      'rgb(237,248,177)',
      'rgb(199,233,180)',
      'rgb(127,205,187)',
      'rgb(65,182,196)',
      'rgb(29,145,192)',
      'rgb(34,94,168)',
      'rgb(12,44,132)',
    ];
    const chinaPolygonLayer = new PolygonLayer({})
      .source(da1)
      .color('name', color);
    scene.addLayer(chinaPolygonLayer);

    // 文字标注
    const layer2 = new LineLayer({
      zIndex: 2,
    })
      .source(da1)
      .color('rgb(93,112,146)')
      .size(0.6)
      .style({
        opacity: 1,
      });
    scene.addLayer(layer2);

    // 区域描边
    const labelLayer = new PointLayer({
      zIndex: 5,
    })
      .source(da2, {
        parser: {
          type: 'json',
          coordinates: 'center',
        },
      })
      .color('#fff')
      .shape('name', 'text')
      .size(12)
      .style({
        opacity: 1,
        stroke: '#fff',
        strokeWidth: 0,
        padding: [5, 5],
        textAllowOverlap: false,
      });
    scene.addLayer(labelLayer);

    // hover高亮
    // chinaPolygonLayer.active(true); // 开启默认高亮效果
    // chinaPolygonLayer.active({ color: 'red' }); // 开启并设置高亮颜色为红色

    // 设置点击高亮
    const hightLayer = new LineLayer({
      zIndex: 4, // 设置显示层级
      name: 'hightlight',
    })
      .source({
        type: 'FeatureCollection',
        features: [],
      })
      .shape('line')
      .size(2)
      .color('red');
    scene.addLayer(hightLayer);
    chinaPolygonLayer.on('click', (feature) => {
      hightLayer.setData({
        type: 'FeatureCollection',
        features: [feature.feature],
      });
    });

    // hover信息框
    chinaPolygonLayer.on('mousemove', (e) => {
      const popup = new Popup({
        offsets: [0, 0],
        closeButton: false,
        closeOnClick: true,
      })
        .setLnglat(e.lngLat)
        .setHTML(`<span>地区: ${e.feature.properties.name}</span>`);
      scene.addPopup(popup);
    });

    // 右下角图例
    const legend = new Control({
      position: 'bottomright',
    });

    legend.onAdd = function () {
      let el = document.createElement('div');
      el.className = 'infolegend legend';
      const grades = [0, 10, 20, 50, 100, 200, 500];
      for (let i = 0; i < grades.length; i++) {
        el.innerHTML +=
          '<i style="background:' +
          color[i] +
          '"></i> ' +
          grades[i] +
          (grades[i + 1] ? '-' + grades[i + 1] + '<br>' : '+');
      }
      return el;
    };

    scene.addControl(legend);
  }, []);
  return (
    <div
      id="map"
      style={{
        height: 500,
        width: 800,
        position: 'relative',
        justifyContent: 'center',
      }}
    ></div>
  );
};
// LESS

.infolegend {
  padding: 5px;
  background: white;
  > i {
    display: inline-block;
    width: 20px !important;
    height: 10px;
  }
}

  • 29
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
AntV L7是一个基于WebGL的地理信息可视化开发库,可以在Vue项目中使用。要在Vue项目中使用AntV L7,首先需要在HTML文件中引入L7的脚本文件。可以使用CDN方式引入,例如: ```html <head> <!-- 引入最新版的L7 --> <script src='https://unpkg.com/@antv/l7'></script> <!-- 指定版本号引入L7 --> <script src='https://unpkg.com/@antv/l7@2.0.11'></script> </head> ``` 接下来,在Vue组件中安装AntV L7以及相关的组件引用。可以使用npm或yarn安装AntV L7,然后在Vue组件中引入所需的组件。例如,在data中创建一个变量来接收地图实例和组件: ```javascript import { Scene } from '@antv/l7'; export default { data() { return { scene: null, // 其他变量 } }, // 其他生命周期钩子函数 } ``` 在mounted钩子函数中生成地图实例,并加载数据生成地图。可以根据需求进行异步操作数据。例如: ```javascript mounted() { this.scene = new Scene({ // 地图配置 }); // 加载数据生成地图 this.loadDataAndCreateMap(); }, methods: { async loadDataAndCreateMap() { const data = await this.loadData(); // 异步加载数据 // 根据数据生成地图 // this.scene.addLayer(...) // 其他操作 }, // 其他方法 } ``` 最后,可以在Vue组件中渲染地图的DOM元素。例如,在HTML模板中添加一个div元素来渲染地图: ```html <template> <div id="mapContainer"></div> </template> ``` 这样就可以在Vue项目中使用AntV L7进行地图可视化开发了。请注意,具体的代码实现可能会根据项目需求有所不同,以上只是一个简单的示例。 #### 引用[.reference_title] - *1* [【Antv/Vue3】vue项目中使用antv/L7制作地图](https://blog.csdn.net/weixin_52378152/article/details/125429250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [在vue项目中使用AntV L7地图下钻,异步调用不重复生成](https://blog.csdn.net/Grupass/article/details/127103298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [antvl7绘制地图以及vue项目中使用多线程worker](https://blog.csdn.net/Mr__proto__/article/details/128975829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王布尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值