- QMap 地图组件
- Marker 标记组件
- MarkerList 标记列表
- Polygon 多边形
- Circle 圆形
- Heatmap 热力图
- Info 提示层
- Polyline 折线
- 自定义控件
- 网格热力图
在页面模板层,引入基础地图库: 传送门 组件支持官方的所有方法与属性
<script src="//map.qq.com/api/js?v=2.exp&key=[开发者个人密钥]"></script>
<script src="http://open.map.qq.com/apifiles/plugins/heatmap/heatmap.min.js"></script>
npm install --save react-tmap
import { QMap, HeatMap, Marker, MarkerList, Info } from 'react-tmap' render () { return ( <QMap center={center} style={{ height: '800px' }} zoom={zoom} events={{ idle: map => this.handleMapIdle(map) }} /> ) }
支持的 options ,除了地图官方默认支持的属性 MapOptions 之外,额外支持
center: { lat: number, lng: number }地图中心点,经纬度规格为腾讯地图经纬度规格
<QMap center={center} style={{ height: '800px' }} zoom={zoom} events={{ idle: map => this.handleMapIdle(map) }} ></QMap>
<Marker position={{lat: xxx, lng: xxx}} draggable={true} visible // 标记提示文案 decoration="10" animation={config.ANIMATION_DROP} events={{ click: this.handleMarkerClick }} />
<MarkerList showDecoration animation={config.ANIMATION_DROP} data={heatData.slice(0, 10)} events={{ click: this.handleMarkerClick }} visible={true} />
<Info content={content} visible={showInfo} position={infoPosition} events={{ closeclick: this.handleInfoClose }} />
<Polygon fillColor={fillColor} points={polygonPoints} strokeDashStyle={strokeDashStyle} editable visible draggable events={{ adjustNode: e => this.handlePolygonChange(e), removeNode: e => this.handlePolygonChange(e), insertNode: e => this.handlePolygonChange(e) }} />
<Circle center={center} radius={radius} strokeColor="#666" strokeDashStyle="dash" strokeWeight={2} events={{ radius_changed: (circle, e) => this.handleRadiusChange(radius, circle, e) }} />
const heatMapData = { max: 100, data: [{ lat: xxx, lng: xxx, count: 1000 }, ...] } <HeatMap heatData={heatMapData} options={heatMapOptions} />
import React from 'react' import { ControlPosition, Control } from 'qmap' export default class CustomControl extends Control { static defaultProps = { position: ControlPosition.TOP_CENTER, style: {}, onEdit: () => {}, onChoose: () => {} } render () { const { style, onEdit, onChoose } = this.props return ( <div ref={node => (this.controlNode = node)} style={style}> <div className="tools"> <button className="tc-15-btn weak" onClick={onEdit}><i className="icon-pen" />编辑</button> <button className="tc-15-btn weak selected" onClick={onChoose}><i className="icon-pointer" />选择</button> </div> </div> ) } }
默认提供两种单位的网格热力图实现:px 和 m 其中,单位为『px』的时候,地图缩放会自动聚合,而单位为『m』的时候,这时候绘制的是代表实际地图物理距离,不做缩放处理
具体配置如下:
import { QMap, GridHeatmap } from 'qmap' // 基础配置 const gridOptions = { zIndex: 2, fillStyle: 'rgba(55, 50, 250, 1)', shadowColor: 'rgba(255, 250, 50, 0.3)', shadowBlur: 20, // 网格规格 size: 100, // 网格宽度,优先取宽度 width: 93, // 网格高度 height: 101, // 绘制单位 unit: 'm', // 全局 canvas 上下文网格透明度 globalAlpha: 0.6, // 文案绘制配置 label: { show: true, fillStyle: 'white', shadowColor: 'white', font: '12px Arial', shadowBlur: 10 }, // 渐变色阶,如果 value 值为长度为 2 数组�,第二个值为网格文本的色值,这里会覆盖上面的 label 中的 fillStyle 值 gradient: { 0.16: ['#ADD7FF', '#fff'], 0.32: '#87C1FF', 0.48: '#60A8FF', 0.64: '#338BFF', 0.78: '#0752C9', 1.0: '#0E3CA1' } } // 在地图 `idle` 事件回调中创建网格热力图 handleMapIdle = map => { console.log('map idle') const { gridOptions } = this.state const dataSet = [{ lat: 11.212341, lng: 131.123123, count: 500 }, ...] this.gridHeatmap = new GridHeatmap(map, dataSet, gridOptions) } <QMap center={{ lat: 22.54073, lng: 113.933571 }} style={{ height: '1000px' }} zoom={zoom} events={{ idle: this.handleMapIdle }} >
##� 特别处理
如果要实现官方的 addListenerOnce 方法,只需要在组件的修改组件内部 get events() 的配置:在方法配置里面,配置第二个参数为 true
get events () { return [ 'click', ['idle', true], 'tilesloaded', 'resize' ] }
- 其他基础地图组件实现