# mapboxgl-demo2 **Repository Path**: sagit_zh/mapboxgl-demo2 ## Basic Information - **Project Name**: mapboxgl-demo2 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-27 - **Last Updated**: 2021-09-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mapboxgl-demo2 > typescript + vue3 + mapbox + turfjs ## 启动 ```bash yarn install yarn serve ``` ## 需求 - 开发时间时限:3天 1、用TypeScript、Vue、mapbox(https://www.mapbox.com/mapbox-gl-js/api/)开发,空间计算可以使用turfjs(http://turfjs.org/) 2、显示地图 3、在地图上随机打50个点,点在广州范围内,点数据都包含loss属性值,随机给值,loss为数字型,取值范围为:0 到 100,只使用一个图层。 4、点的颜色和loss属性值关联,0到20为绿色,21到40为蓝色,41到60为橙色,61到100为红色。 5、应用提供可以过滤的面板,选择要显示的loss值范围的点,可以是多选框,选择要显示的区间。做到的效果为,能够选择只显示0到60的loss值的点,使用mapbox表达式处理。 6、应用提供周边查询点,在地图上选择一个点,查询出周边100米的点数据,展示点的数据列表,包括选择的位置到该点的距离,按距离最近排序。 7、打包并发布这个应用。 - 检查功能点: 1、使用TypeScript、Vue、mapbox开发。 2、地图正常显示。 3、地图有随机的点、并且点颜色和loss属性关联。 4、能够根据区间过滤点的数据。 5、能够进行周边查询,并展示列表。 6、代码风格良好。 - 加分点: 1、点击选择点,有高亮效果 ## 实现步骤 ### 1. 显示地图 - 安装 mapboxgl 、turfjs ```bash yarn add mapbox-gl @turf/turf ``` - 导入模块 ```js import 'mapbox-gl/dist/mapbox-gl.css' import * as turf from '@turf/turf' ``` - 创建容器 ```vue ``` - 初始化地图 ```typescript const map:Ref = ref() mapboxgl.accessToken = 'pk.eyJ1Ijoic2FnaXQtemgiLCJhIjoiY2t0bnl5dDFnMDZ0aTJwcDNsa3N4emF1biJ9.jFO8rJJN-kvaz9vuQ0odKQ' // 设置 token const map = new mapboxgl.Map({ container: 'map', center: [113.3111, 23.0857], zoom: 7, style: 'mapbox://styles/mapbox/streets-v11', hash: true }) // 创建 mapbox对象 map.value = map ``` ### 2. 在广州范围内生成50个坐标 - 区域 GEOJSON 生成网址 `http://datav.aliyun.com/tools/atlas/index.html,根据区域数据画出范围 - `Math.random()` 或者 `turf.randomPoint` 随机生成50个坐标 - `booleanPointInPolygon` 判断点是否在广州范围内 ### 3. 颜色规则(点的颜色和loss属性值关联,0到20为绿色,21到40为蓝色,41到60为橙色,61到100为红色) ```typescript paint: { 'circle-color': { property: 'loss', stops: [ [0, 'green'], // 0-20 绿色 [21, 'blue'], // 21-40 蓝色 [41, 'orange'], // 41-60 橙色 [61, 'red'] // 61-100 红色 ] } } ``` ### 4. 过滤面板 - `map.setFilter()` 动态更新过滤规则 - `['<=', 'loss', 60]` 过滤 loss 小于 60 的点 ### 6. 查询周边点 - `map.on('click')` 点击事件 - `map.queryRenderedFeatures()` 查找当前点击的点 - `turf.circle` 以自身为圆心,生成方圆百米内的圆圈范围 - `map.getSource('gzPoint')._data` 获取所有的点 - `turf.pointsWithinPolygon(所有的点, 范围)` 筛选出在范围内的点,并过滤排除自己 - `turf.rhumbDistance() `计算生成距离数组并 `sort` 排序 - 生成 HTML 节点元素 - `new mapboxgl.Popup().setLngLat(中心坐标).setHTML(内容).addTo(map)` 显示弹出层 ## 问题总结 ### 1. mapboxgl 没有 ts 官方声明文件,引入报错 - 解决: `src` 下新建 `js-modules.d.ts` 文件,添加 `declare module 'mapbox-gl';` ### 2. `turf.randomPoint` 随机生成坐标的 bbox 是个矩形范围 ,不会用 - 解决:改用 random() 手动生成