Merge branch 'develop' into 'master'
feat(biz,map): 添加文档 See merge request web-project/zhst-lambo!37
This commit is contained in:
commit
ed22f8bcf9
@ -1,5 +1,11 @@
|
|||||||
# @zhst/biz
|
# @zhst/biz
|
||||||
|
|
||||||
|
## 0.25.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- feat(zhst/map,zhst/biz): map 完善文档,biz 修改 boxSelectTree 的文档格式
|
||||||
|
|
||||||
## 0.25.0
|
## 0.25.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@zhst/biz",
|
"name": "@zhst/biz",
|
||||||
"version": "0.25.0",
|
"version": "0.25.1",
|
||||||
"description": "业务库",
|
"description": "业务库",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"business",
|
"business",
|
||||||
|
@ -43,7 +43,6 @@ group:
|
|||||||
| checkedTags | 选中的标签值 | string[] | [] | - |
|
| checkedTags | 选中的标签值 | string[] | [] | - |
|
||||||
| footer | 盒子树底部渲染(需要内容撑开) | ReactNode、string | - | - |
|
| footer | 盒子树底部渲染(需要内容撑开) | ReactNode、string | - | - |
|
||||||
| tagFootRender | 标签看板底部自定义 | ReactNode、string | - | - |
|
| tagFootRender | 标签看板底部自定义 | ReactNode、string | - | - |
|
||||||
|
|
||||||
| onResetTags | 标签重置 | () => void | [] | - |
|
| onResetTags | 标签重置 | () => void | [] | - |
|
||||||
| onTagExpand | 标签展开 | (e: any) => void | [] | - |
|
| onTagExpand | 标签展开 | (e: any) => void | [] | - |
|
||||||
| onTabChange | tab切换监听 | function: (e) => void | - | - |
|
| onTabChange | tab切换监听 | function: (e) => void | - | - |
|
||||||
|
@ -1,5 +1,11 @@
|
|||||||
# @zhst/map
|
# @zhst/map
|
||||||
|
|
||||||
|
## 0.3.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- feat(zhst/map,zhst/biz): map 完善文档,biz 修改 boxSelectTree 的文档格式
|
||||||
|
|
||||||
## 0.3.0
|
## 0.3.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
@ -1,195 +0,0 @@
|
|||||||
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
||||||
var _excluded = ["style", "children", "height", "width", "draw", "markerData", "sluterData", "popUpInfo", "showPopUp", "toolsBarOpen", "showMarker", "showCluster", "clusterProps", "interactiveLayerIds", "buttonList", "onMarkerClick", "onPopUpClose", "customMarkerRender", "onLoad", "onDrawCreate", "onDrawUpdate", "onDrawDelete", "onToolClick"];
|
|
||||||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
||||||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
||||||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
||||||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
||||||
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
||||||
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
||||||
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
||||||
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
||||||
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
||||||
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
||||||
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
||||||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
||||||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
||||||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
||||||
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
||||||
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
||||||
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
||||||
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
||||||
import 'mapbox-gl/dist/mapbox-gl.css';
|
|
||||||
import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css';
|
|
||||||
import React, { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
||||||
import Map from 'react-map-gl';
|
|
||||||
import classnames from 'classnames';
|
|
||||||
import { merge } from '@zhst/func';
|
|
||||||
import Tools from "./components/tools";
|
|
||||||
import DrawControl from "./components/drawControl";
|
|
||||||
import { defaultMapConfig } from "./utils/constants";
|
|
||||||
import "./index.less";
|
|
||||||
import mapboxDrawStyle from "./utils/drawStyle";
|
|
||||||
import Marker from "./components/marker";
|
|
||||||
import PopUp from "./components/popup";
|
|
||||||
import Cluster from "./components/clusters/Clusters";
|
|
||||||
import { clusterLayer } from "./components/clusters/layers";
|
|
||||||
var componentName = 'zhst-map';
|
|
||||||
var MapBox = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
||||||
var _ref = props || {},
|
|
||||||
_ref$style = _ref.style,
|
|
||||||
style = _ref$style === void 0 ? {} : _ref$style,
|
|
||||||
children = _ref.children,
|
|
||||||
_ref$height = _ref.height,
|
|
||||||
height = _ref$height === void 0 ? 600 : _ref$height,
|
|
||||||
_ref$width = _ref.width,
|
|
||||||
width = _ref$width === void 0 ? '100%' : _ref$width,
|
|
||||||
draw = _ref.draw,
|
|
||||||
_ref$markerData = _ref.markerData,
|
|
||||||
markerData = _ref$markerData === void 0 ? [] : _ref$markerData,
|
|
||||||
_ref$sluterData = _ref.sluterData,
|
|
||||||
sluterData = _ref$sluterData === void 0 ? [] : _ref$sluterData,
|
|
||||||
_ref$popUpInfo = _ref.popUpInfo,
|
|
||||||
popUpInfo = _ref$popUpInfo === void 0 ? {
|
|
||||||
longitude: 0,
|
|
||||||
latitude: 0
|
|
||||||
} : _ref$popUpInfo,
|
|
||||||
showPopUp = _ref.showPopUp,
|
|
||||||
toolsBarOpen = _ref.toolsBarOpen,
|
|
||||||
_ref$showMarker = _ref.showMarker,
|
|
||||||
showMarker = _ref$showMarker === void 0 ? true : _ref$showMarker,
|
|
||||||
_ref$showCluster = _ref.showCluster,
|
|
||||||
showCluster = _ref$showCluster === void 0 ? false : _ref$showCluster,
|
|
||||||
clusterProps = _ref.clusterProps,
|
|
||||||
_ref$interactiveLayer = _ref.interactiveLayerIds,
|
|
||||||
interactiveLayerIds = _ref$interactiveLayer === void 0 ? [] : _ref$interactiveLayer,
|
|
||||||
_ref$buttonList = _ref.buttonList,
|
|
||||||
buttonList = _ref$buttonList === void 0 ? [{
|
|
||||||
label: '圆形框选',
|
|
||||||
key: 'circle',
|
|
||||||
icon: 'icon-yuan',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre, _drawControlRef$curre2;
|
|
||||||
return (_drawControlRef$curre = drawControlRef.current) === null || _drawControlRef$curre === void 0 || (_drawControlRef$curre = _drawControlRef$curre.drawer) === null || _drawControlRef$curre === void 0 || (_drawControlRef$curre2 = _drawControlRef$curre.changeMode) === null || _drawControlRef$curre2 === void 0 ? void 0 : _drawControlRef$curre2.call(_drawControlRef$curre, 'simple_select');
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
label: '矩形框选',
|
|
||||||
key: 'rect',
|
|
||||||
icon: 'icon-fang',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre3, _drawControlRef$curre4;
|
|
||||||
return (_drawControlRef$curre3 = drawControlRef.current) === null || _drawControlRef$curre3 === void 0 || (_drawControlRef$curre3 = _drawControlRef$curre3.drawer) === null || _drawControlRef$curre3 === void 0 || (_drawControlRef$curre4 = _drawControlRef$curre3.changeMode) === null || _drawControlRef$curre4 === void 0 ? void 0 : _drawControlRef$curre4.call(_drawControlRef$curre3, 'draw_rect');
|
|
||||||
},
|
|
||||||
popoverProps: {
|
|
||||||
placement: 'bottom',
|
|
||||||
content: '自定义内容'
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
label: '多边形框选',
|
|
||||||
key: 'more',
|
|
||||||
icon: 'icon-duobianxing',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre5, _drawControlRef$curre6;
|
|
||||||
return (_drawControlRef$curre5 = drawControlRef.current) === null || _drawControlRef$curre5 === void 0 || (_drawControlRef$curre5 = _drawControlRef$curre5.drawer) === null || _drawControlRef$curre5 === void 0 || (_drawControlRef$curre6 = _drawControlRef$curre5.changeMode) === null || _drawControlRef$curre6 === void 0 ? void 0 : _drawControlRef$curre6.call(_drawControlRef$curre5, 'draw_polygon');
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
label: '路径框选',
|
|
||||||
key: 'path',
|
|
||||||
icon: 'icon-lujingkuangxuannor',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre7, _drawControlRef$curre8;
|
|
||||||
return (_drawControlRef$curre7 = drawControlRef.current) === null || _drawControlRef$curre7 === void 0 || (_drawControlRef$curre7 = _drawControlRef$curre7.drawer) === null || _drawControlRef$curre7 === void 0 || (_drawControlRef$curre8 = _drawControlRef$curre7.changeMode) === null || _drawControlRef$curre8 === void 0 ? void 0 : _drawControlRef$curre8.call(_drawControlRef$curre7, 'draw_line_string');
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
label: '测距',
|
|
||||||
key: 'path',
|
|
||||||
icon: 'icon-ceju',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre9, _drawControlRef$curre10;
|
|
||||||
return (_drawControlRef$curre9 = drawControlRef.current) === null || _drawControlRef$curre9 === void 0 || (_drawControlRef$curre9 = _drawControlRef$curre9.drawer) === null || _drawControlRef$curre9 === void 0 || (_drawControlRef$curre10 = _drawControlRef$curre9.changeMode) === null || _drawControlRef$curre10 === void 0 ? void 0 : _drawControlRef$curre10.call(_drawControlRef$curre9, 'draw_line_string');
|
|
||||||
}
|
|
||||||
}, {
|
|
||||||
label: '清除',
|
|
||||||
key: 'clear',
|
|
||||||
icon: 'icon-gongjuxiangguanbi',
|
|
||||||
onClick: function onClick() {
|
|
||||||
var _drawControlRef$curre11;
|
|
||||||
return (_drawControlRef$curre11 = drawControlRef.current) === null || _drawControlRef$curre11 === void 0 || (_drawControlRef$curre11 = _drawControlRef$curre11.drawer) === null || _drawControlRef$curre11 === void 0 ? void 0 : _drawControlRef$curre11.deleteAll();
|
|
||||||
}
|
|
||||||
}] : _ref$buttonList,
|
|
||||||
onMarkerClick = _ref.onMarkerClick,
|
|
||||||
onPopUpClose = _ref.onPopUpClose,
|
|
||||||
customMarkerRender = _ref.customMarkerRender,
|
|
||||||
onLoad = _ref.onLoad,
|
|
||||||
onDrawCreate = _ref.onDrawCreate,
|
|
||||||
onDrawUpdate = _ref.onDrawUpdate,
|
|
||||||
onDrawDelete = _ref.onDrawDelete,
|
|
||||||
onToolClick = _ref.onToolClick,
|
|
||||||
others = _objectWithoutProperties(_ref, _excluded);
|
|
||||||
var mapRef = useRef(null);
|
|
||||||
var drawControlRef = useRef(null);
|
|
||||||
|
|
||||||
// 默认绘制配置
|
|
||||||
var _useState = useState({
|
|
||||||
displayControlsDefault: false,
|
|
||||||
position: 'top-left',
|
|
||||||
styles: mapboxDrawStyle,
|
|
||||||
// Select which mapbox-gl-draw control buttons to add to the map.
|
|
||||||
// @ts-ignore
|
|
||||||
controls: false,
|
|
||||||
// The user does not have to click the polygon control button first.
|
|
||||||
defaultMode: 'draw_polygon'
|
|
||||||
}),
|
|
||||||
_useState2 = _slicedToArray(_useState, 1),
|
|
||||||
drawConfig = _useState2[0];
|
|
||||||
var initMarker = useMemo(function () {
|
|
||||||
return markerData.map(function (_item) {
|
|
||||||
return /*#__PURE__*/React.createElement(Marker, _extends({
|
|
||||||
customMarkerRender: customMarkerRender,
|
|
||||||
onMarkerClick: onMarkerClick
|
|
||||||
}, _item));
|
|
||||||
});
|
|
||||||
}, [markerData]);
|
|
||||||
useImperativeHandle(ref, function () {
|
|
||||||
var _drawControlRef$curre12;
|
|
||||||
return {
|
|
||||||
mapRef: mapRef.current,
|
|
||||||
drawer: (_drawControlRef$curre12 = drawControlRef.current) === null || _drawControlRef$curre12 === void 0 ? void 0 : _drawControlRef$curre12.drawer
|
|
||||||
};
|
|
||||||
});
|
|
||||||
return (
|
|
||||||
/*#__PURE__*/
|
|
||||||
//@ts-ignore
|
|
||||||
React.createElement("div", {
|
|
||||||
className: classnames("".concat(componentName))
|
|
||||||
}, /*#__PURE__*/React.createElement(Tools, {
|
|
||||||
open: toolsBarOpen,
|
|
||||||
buttonList: buttonList,
|
|
||||||
onToolClick: onToolClick
|
|
||||||
}), /*#__PURE__*/React.createElement(Map, _extends({
|
|
||||||
ref: mapRef,
|
|
||||||
onLoad: onLoad,
|
|
||||||
style: _objectSpread({
|
|
||||||
width: width,
|
|
||||||
height: height
|
|
||||||
}, style),
|
|
||||||
interactiveLayerIds: [clusterLayer.id].concat(_toConsumableArray(interactiveLayerIds))
|
|
||||||
}, merge(defaultMapConfig, others)), showMarker && initMarker, showPopUp && popUpInfo && /*#__PURE__*/React.createElement(PopUp, _extends({
|
|
||||||
onClose: onPopUpClose
|
|
||||||
}, popUpInfo)), showCluster && !showMarker && /*#__PURE__*/React.createElement(Cluster, _extends({
|
|
||||||
type: "geojson",
|
|
||||||
cluster: true,
|
|
||||||
clusterMaxZoom: 14,
|
|
||||||
clusterRadius: 50,
|
|
||||||
data: sluterData
|
|
||||||
}, clusterProps)), draw && /*#__PURE__*/React.createElement(DrawControl, _extends({
|
|
||||||
ref: drawControlRef,
|
|
||||||
onCreate: onDrawCreate,
|
|
||||||
onUpdate: onDrawUpdate,
|
|
||||||
onDelete: onDrawDelete,
|
|
||||||
onSelectionChange: function onSelectionChange(e) {
|
|
||||||
return console.log('e', e);
|
|
||||||
}
|
|
||||||
}, drawConfig)), children))
|
|
||||||
);
|
|
||||||
});
|
|
||||||
export default MapBox;
|
|
@ -1,2 +1,3 @@
|
|||||||
export { default as MapBox } from "./MapBox";
|
export { default as MapBox } from "./mapBox";
|
||||||
export * from 'react-map-gl';
|
export * from 'react-map-gl';
|
||||||
|
export * from "./utils";
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@zhst/map",
|
"name": "@zhst/map",
|
||||||
"version": "0.3.0",
|
"version": "0.3.1",
|
||||||
"description": "地图库",
|
"description": "地图库",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"map",
|
"map",
|
||||||
|
7
packages/map/src/changelog/index.md
Normal file
7
packages/map/src/changelog/index.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
title: 版本更新日志
|
||||||
|
order: 2
|
||||||
|
toc: content
|
||||||
|
---
|
||||||
|
|
||||||
|
<embed src="../../CHANGELOG.md" ></embed>
|
91
packages/map/src/clusters/demo/basic.tsx
Normal file
91
packages/map/src/clusters/demo/basic.tsx
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import React, { useRef, useEffect, useState } from 'react';
|
||||||
|
import { MapBox, MapProps } from '@zhst/map';
|
||||||
|
import axios from 'axios';
|
||||||
|
import { FloatButton, Switch } from '@zhst/meta';
|
||||||
|
|
||||||
|
const demo = () => {
|
||||||
|
const [showCluster, setShowCluster] = useState(true)
|
||||||
|
const [sluterData, setSluterData] = useState<MapProps['clusterData']>()
|
||||||
|
const mapRef = useRef(null);
|
||||||
|
|
||||||
|
// 初始化
|
||||||
|
const handleMapLoad = (e: mapboxgl.MapboxEvent<undefined>) => {
|
||||||
|
const map = e.target;
|
||||||
|
|
||||||
|
if (!map) return
|
||||||
|
|
||||||
|
map.flyTo({
|
||||||
|
// center: [120,30],
|
||||||
|
// zoom: map?.getMaxZoom(),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await axios({
|
||||||
|
method: 'post',
|
||||||
|
url: 'http://10.0.0.120:30003/singer.DeviceService/ListCamera',
|
||||||
|
headers: {
|
||||||
|
Authorization: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTcwNDAzNzEsImp0aSI6IjExMjgiLCJpYXQiOjE3MTY3ODExNzEsInVzZXJJZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImRhdGFSaWdodCI6MiwiY2FtZXJhUmlnaHQiOjEsImdwdVJpZ2h0IjoxLCJ1c2VybGVhZGVySWQiOjAsIm9yZ2FuaXphdGlvbklkIjoxLCJyb2xlSWQiOjF9.XHbXIkXkfUuvqV6_qSV4d20xj-s7I0qOQZgL-zspMDc'
|
||||||
|
},
|
||||||
|
data: {"labelData":[],"filter":{"realtimeProcessingFilter":0,"cameraFilter":[{"opt":"ORNOT","cameraOpt":"CAMERAOPT_TYPE","value":"100"}]},"maxResults":50}
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
let markers = []
|
||||||
|
let sluters = {
|
||||||
|
features: []
|
||||||
|
}
|
||||||
|
res.data.cameras?.forEach(camera => {
|
||||||
|
markers.push({
|
||||||
|
key: camera.id,
|
||||||
|
id: camera.id,
|
||||||
|
title: camera.name,
|
||||||
|
population: camera.id,
|
||||||
|
checked: false,
|
||||||
|
disabled: false,
|
||||||
|
showCheckBox: true,
|
||||||
|
status: ['blue', 'yellow', 'red'][Math.floor(Math.random() * 3)],
|
||||||
|
latitude: camera.latitude,
|
||||||
|
longitude: camera.longitude
|
||||||
|
})
|
||||||
|
sluters.features.push({
|
||||||
|
"geometry": {
|
||||||
|
"type": "Point",
|
||||||
|
"coordinates": [
|
||||||
|
camera.longitude,
|
||||||
|
camera.latitude,
|
||||||
|
50
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
setSluterData(sluters)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<FloatButton>
|
||||||
|
<Switch value={true}/>
|
||||||
|
</FloatButton>
|
||||||
|
<MapBox
|
||||||
|
onLoad={handleMapLoad}
|
||||||
|
ref={mapRef}
|
||||||
|
showToolBar={false}
|
||||||
|
width='100%'
|
||||||
|
height='800px'
|
||||||
|
showCluster={showCluster}
|
||||||
|
clusterProps={{
|
||||||
|
data: sluterData
|
||||||
|
}}
|
||||||
|
// customMarkerRender={(_data) => <div>自定义标记</div>}
|
||||||
|
>
|
||||||
|
</MapBox>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default demo;
|
24
packages/map/src/clusters/index.md
Normal file
24
packages/map/src/clusters/index.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
category: Components
|
||||||
|
subtitle: 聚合点
|
||||||
|
title: Cluster 聚合点
|
||||||
|
toc: content
|
||||||
|
group:
|
||||||
|
title: 数据展示
|
||||||
|
order: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
<code src="./demo/basic.tsx">基本用法</code>
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| clusterData | 聚合数据集合 | mapboxgl.GeoJSONSourceRaw['data'] | {} | - |
|
||||||
|
| showCluster | 显示/隐藏聚合点 | boolean | {} | - |
|
||||||
|
| type | 数据接收类型(对clusterData生效) | string | geojson | - |
|
||||||
|
| cluster | 是否打开聚合功能 | boolean | {} | - |
|
||||||
|
| clusterMaxZoom | 最大生效层级 | number | 14 | - |
|
||||||
|
| clusterRadius | 聚合半径 | number | 50 | - |
|
||||||
|
|
||||||
|
> 更多参数参考 react-map-gl 的 Source 组件
|
@ -120,18 +120,13 @@ const demo = () => {
|
|||||||
showCluster={showCluster}
|
showCluster={showCluster}
|
||||||
// popUpInfo={popupInfo}
|
// popUpInfo={popupInfo}
|
||||||
onPopUpClose={e => setPopupInfo(null)}
|
onPopUpClose={e => setPopupInfo(null)}
|
||||||
onMarkerClick={(e, status, data) => {
|
onMarkerCheck={(e, status, data) => {
|
||||||
setMarkerData(pre => pre.map(item => {
|
setMarkerData(pre => pre.map(item => {
|
||||||
if (item.id === data.id) {
|
if (item.id === data.id) {
|
||||||
item.checked = !data?.checked
|
item.checked = !data?.checked
|
||||||
}
|
}
|
||||||
return item
|
return item
|
||||||
}))
|
}))
|
||||||
// setPopupInfo({
|
|
||||||
// longitude: data?.longitude,
|
|
||||||
// latitude: data?.latitude,
|
|
||||||
// content: '测试'
|
|
||||||
// })
|
|
||||||
}}
|
}}
|
||||||
onZoomEnd={map => {
|
onZoomEnd={map => {
|
||||||
let zoom = map.target.getZoom() // 画面层级,用来判断标签是否显示隐藏
|
let zoom = map.target.getZoom() // 画面层级,用来判断标签是否显示隐藏
|
||||||
|
@ -14,13 +14,14 @@ import {
|
|||||||
import drawRectMode from 'mapbox-gl-draw-rectangle-mode'
|
import drawRectMode from 'mapbox-gl-draw-rectangle-mode'
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import drawStaticMode from '@mapbox/mapbox-gl-draw-static-mode'
|
import drawStaticMode from '@mapbox/mapbox-gl-draw-static-mode'
|
||||||
|
// @ts-ignore
|
||||||
|
import drawCircleMode from './Draw/drawCircleMode.draw.js'
|
||||||
import { useControl } from 'react-map-gl';
|
import { useControl } from 'react-map-gl';
|
||||||
import type { ControlPosition } from 'react-map-gl';
|
import type { ControlPosition } from 'react-map-gl';
|
||||||
import { MapContextValue } from 'react-map-gl/dist/esm/components/map';
|
import { MapContextValue } from 'react-map-gl/dist/esm/components/map';
|
||||||
|
|
||||||
export type DrawControlProps = ConstructorParameters<typeof MapboxDraw>[0] & {
|
export type DrawControlProps = ConstructorParameters<typeof MapboxDraw>[0] & {
|
||||||
position?: ControlPosition;
|
position?: ControlPosition;
|
||||||
|
|
||||||
onCreate?: (evt: {features: object[]}) => void;
|
onCreate?: (evt: {features: object[]}) => void;
|
||||||
onUpdate?: (evt: {features: object[]; action: string}) => void;
|
onUpdate?: (evt: {features: object[]; action: string}) => void;
|
||||||
onDelete?: (evt: {features: object[]}) => void;
|
onDelete?: (evt: {features: object[]}) => void;
|
||||||
@ -50,7 +51,7 @@ const DrawControl = forwardRef<DrawControlRefProps, DrawControlProps>((props, re
|
|||||||
// draw_line_select: drawLineSelectMode,
|
// draw_line_select: drawLineSelectMode,
|
||||||
draw_rect: drawRectMode,
|
draw_rect: drawRectMode,
|
||||||
drag_circle: DragCircleMode,
|
drag_circle: DragCircleMode,
|
||||||
draw_circle : CircleMode,
|
draw_circle : drawCircleMode,
|
||||||
direct_select: DirectMode,
|
direct_select: DirectMode,
|
||||||
simple_select: SimpleSelectMode,
|
simple_select: SimpleSelectMode,
|
||||||
static: drawStaticMode,
|
static: drawStaticMode,
|
||||||
@ -101,7 +102,8 @@ const DrawControl = forwardRef<DrawControlRefProps, DrawControlProps>((props, re
|
|||||||
DrawControl.defaultProps = {
|
DrawControl.defaultProps = {
|
||||||
onCreate: () => {},
|
onCreate: () => {},
|
||||||
onUpdate: () => {},
|
onUpdate: () => {},
|
||||||
onDelete: () => {}
|
onDelete: () => {},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default DrawControl
|
export default DrawControl
|
79
packages/map/src/drawControl/demo/basic.tsx
Normal file
79
packages/map/src/drawControl/demo/basic.tsx
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
import React, { useRef, useEffect, useState } from 'react';
|
||||||
|
import { getDistancesByStringLine, MapBox, Marker } from '@zhst/map';
|
||||||
|
import { FloatButton, Switch } from '@zhst/meta';
|
||||||
|
|
||||||
|
const demo = () => {
|
||||||
|
const mapRef = useRef(null);
|
||||||
|
const [canDraw, setCanDraw] = useState(false)
|
||||||
|
const [toolsBarOpen, setToolsBarOpen] = useState(false)
|
||||||
|
const [rangingList, setRangingList] = useState([])
|
||||||
|
// 初始化
|
||||||
|
const handleMapLoad = (e: mapboxgl.MapboxEvent<undefined>) => {
|
||||||
|
const map = e.target;
|
||||||
|
|
||||||
|
if (!map) return
|
||||||
|
|
||||||
|
map.flyTo({
|
||||||
|
// center: [120,30],
|
||||||
|
// zoom: map?.getMaxZoom(),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<FloatButton>
|
||||||
|
<Switch value={true}/>
|
||||||
|
</FloatButton>
|
||||||
|
<MapBox
|
||||||
|
onLoad={handleMapLoad}
|
||||||
|
ref={mapRef}
|
||||||
|
width='100%'
|
||||||
|
height='800px'
|
||||||
|
draw={canDraw}
|
||||||
|
toolsBarOpen={toolsBarOpen}
|
||||||
|
onToolClick={e => {
|
||||||
|
setCanDraw(pre => !pre)
|
||||||
|
setToolsBarOpen(pre => !pre)
|
||||||
|
}}
|
||||||
|
onDrawCreate={e => {
|
||||||
|
const geojson = e.features[0]
|
||||||
|
// 防止绘制完成后,地图自动切换到选中状态
|
||||||
|
setTimeout(async () => {
|
||||||
|
mapRef.current.drawer.changeMode('simple_select')
|
||||||
|
}, 100);
|
||||||
|
const polygonJson = getDistancesByStringLine(geojson) || []
|
||||||
|
setRangingList(polygonJson.distanceArr)
|
||||||
|
}}
|
||||||
|
onDrawDelete={e => setRangingList([])}
|
||||||
|
onDrawUpdate={e => {
|
||||||
|
const geojson = e.features[0]
|
||||||
|
const polygonJson = getDistancesByStringLine(geojson) || []
|
||||||
|
setRangingList(polygonJson.distanceArr)
|
||||||
|
}}
|
||||||
|
drawerProps={{
|
||||||
|
onActionable: e => console.log('e', e)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{rangingList?.map((item, index) => {
|
||||||
|
return (
|
||||||
|
<Marker
|
||||||
|
key={index}
|
||||||
|
anchor="bottom"
|
||||||
|
longitude={item.to[0]}
|
||||||
|
latitude={item.to[1]}
|
||||||
|
// !! 阻止原生的冒泡
|
||||||
|
onClick={e => e.originalEvent.stopPropagation()}
|
||||||
|
>
|
||||||
|
<div style={{ padding: '3px 6px', background: '#fff', border: '1px solid #000' }} >{(item.totalLength)}km</div>
|
||||||
|
</Marker>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</MapBox>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default demo;
|
83
packages/map/src/drawControl/index.md
Normal file
83
packages/map/src/drawControl/index.md
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
---
|
||||||
|
category: Components
|
||||||
|
subtitle: 地图绘制
|
||||||
|
title: Draw 地图绘制
|
||||||
|
toc: content
|
||||||
|
group:
|
||||||
|
title: 地图操作
|
||||||
|
order: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
<code src="./demo/basic.tsx">基本用法</code>
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| draw | 是否绘制 | boolean | false | - |
|
||||||
|
| toolsBarOpen | 工具栏是否打开 | boolean | false | - |
|
||||||
|
| onToolClick | 工具Icon点击事件 | (e: React.MouseEvent<HTMLElement, MouseEvent>) => void | false | - |
|
||||||
|
| buttonList | 工具栏按钮列表 | IButtonList | defaultButtonList | - |
|
||||||
|
| mapRef.current.drawer | 绘制组件的Ref,参考@mapbox/mapbox-gl-draw | DrawControlRefProps | - | - |
|
||||||
|
| onCreate | 创建监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onUpdate | 更新监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onDelete | 删除监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onRender | 渲染监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onCombine | 组合监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onUncombine | 分离监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onModeChange | 模式切换监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onActionable | 是否绘制 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
| onSelectionChange | 选中目标切换监听 | (evt: {features: object[]}) => void; | - | - |
|
||||||
|
|
||||||
|
```js
|
||||||
|
interface IButtonList {
|
||||||
|
label: string
|
||||||
|
key: string
|
||||||
|
icon?: ReactNode | string
|
||||||
|
onClick?: () => void
|
||||||
|
}[]
|
||||||
|
// 默认按钮列表
|
||||||
|
const defaultButtonList = [
|
||||||
|
{
|
||||||
|
label: '圆形框选',
|
||||||
|
key: 'circle',
|
||||||
|
icon: 'icon-yuan',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_circle')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '矩形框选',
|
||||||
|
key: 'rect',
|
||||||
|
icon: 'icon-fang',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_rect'),
|
||||||
|
popoverProps: {
|
||||||
|
placement: 'bottom',
|
||||||
|
content: '自定义内容'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '多边形框选',
|
||||||
|
key: 'more',
|
||||||
|
icon: 'icon-duobianxing',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_polygon')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '路径框选',
|
||||||
|
key: 'path',
|
||||||
|
icon: 'icon-lujingkuangxuannor',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_line_string')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '测距',
|
||||||
|
key: 'path',
|
||||||
|
icon: 'icon-ceju',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_line_string')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '清除',
|
||||||
|
key: 'clear',
|
||||||
|
icon: 'icon-gongjuxiangguanbi',
|
||||||
|
onClick: () => drawControlRef.current?.drawer?.deleteAll()
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
@ -1,9 +0,0 @@
|
|||||||
.zhst-map {
|
|
||||||
position: relative;
|
|
||||||
width: auto;
|
|
||||||
height: auto;
|
|
||||||
|
|
||||||
.mapboxgl-ctrl-logo {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,2 +1,4 @@
|
|||||||
export { default as MapBox } from './MapBox';
|
export { default as MapBox } from './mapBox';
|
||||||
|
export type { MapProps, MapRefProps } from './mapBox';
|
||||||
export * from 'react-map-gl'
|
export * from 'react-map-gl'
|
||||||
|
export * from './utils'
|
||||||
|
@ -6,15 +6,15 @@ import { CSSProperties } from "react";
|
|||||||
import { MapRef, MapStyle, MapProps as MapBoxProps } from "react-map-gl";
|
import { MapRef, MapStyle, MapProps as MapBoxProps } from "react-map-gl";
|
||||||
import classnames from 'classnames'
|
import classnames from 'classnames'
|
||||||
import { merge } from '@zhst/func'
|
import { merge } from '@zhst/func'
|
||||||
import Tools, { ToolsProps } from './components/tools'
|
import Tools, { ToolsProps } from '../tools'
|
||||||
import DrawControl, { DrawControlProps, DrawControlRefProps } from './components/drawControl';
|
import DrawControl, { DrawControlProps, DrawControlRefProps } from '../drawControl';
|
||||||
import { defaultMapConfig } from './utils/constants';
|
import { defaultMapConfig } from '../utils/constants';
|
||||||
import './index.less';
|
import './index.less';
|
||||||
import mapboxDrawStyle from './utils/drawStyle';
|
import mapboxDrawStyle from '../utils/drawStyle';
|
||||||
import Marker, { MarkerProps } from './components/marker';
|
import Marker, { MarkerProps } from '../marker';
|
||||||
import PopUp, { PopUpProps } from './components/popup';
|
import PopUp, { PopUpProps } from '../popup';
|
||||||
import Cluster, { ClusterProps } from './components/clusters/Clusters';
|
import Cluster from '../clusters/Clusters';
|
||||||
import { clusterLayer } from './components/clusters/layers';
|
import { clusterLayer } from '../clusters/layers';
|
||||||
|
|
||||||
const componentName = 'zhst-map'
|
const componentName = 'zhst-map'
|
||||||
|
|
||||||
@ -29,26 +29,30 @@ export interface MapProps extends MapBoxProps {
|
|||||||
mapRef?: MapRef
|
mapRef?: MapRef
|
||||||
style?: CSSProperties
|
style?: CSSProperties
|
||||||
children?: JSX.Element | JSX.Element[] | Array<JSX.Element | undefined>
|
children?: JSX.Element | JSX.Element[] | Array<JSX.Element | undefined>
|
||||||
sluterData?: any;
|
clusterData?: mapboxgl.GeoJSONSourceRaw['data'];
|
||||||
draw?: boolean
|
draw?: boolean
|
||||||
showMarker?: boolean // 显示标记点
|
showMarker?: boolean // 显示标记点
|
||||||
showCluster?: boolean // 显示范围统计
|
showCluster?: boolean // 显示范围统计
|
||||||
|
showToolBar?: boolean // 是否显示工具箱
|
||||||
buttonList?: ToolsProps['buttonList']
|
buttonList?: ToolsProps['buttonList']
|
||||||
popUpInfo?: PopUpProps
|
popUpInfo?: PopUpProps
|
||||||
showPopUp?: boolean
|
showPopUp?: boolean
|
||||||
clusterProps?: ClusterProps
|
clusterProps?: Partial<mapboxgl.GeoJSONSourceRaw>
|
||||||
toolsBarOpen?: boolean
|
toolsBarOpen?: boolean
|
||||||
|
drawerProps?: DrawControlProps
|
||||||
customMarkerRender?: MarkerProps['customMarkerRender']
|
customMarkerRender?: MarkerProps['customMarkerRender']
|
||||||
onLoad?: (e: mapboxgl.MapboxEvent<undefined>) => void
|
onLoad?: (e: mapboxgl.MapboxEvent<undefined>) => void
|
||||||
onDrawCreate?: (e: { features: object[], [key: string]: any }) => void
|
onDrawCreate?: (e: { features: object[], [key: string]: any }) => void
|
||||||
onDrawUpdate?: (e: { features: object[], [key: string]: any }) => void
|
onDrawUpdate?: (e: { features: object[], [key: string]: any }) => void
|
||||||
onDrawDelete?: (e: { features: object[], [key: string]: any }) => void
|
onDrawDelete?: (e: { features: object[], [key: string]: any }) => void
|
||||||
onMarkerClick?: MarkerProps['onMarkerClick']
|
onMarkerClick?: MarkerProps['onClick']
|
||||||
|
onMarkerCheck?: MarkerProps['onCheck']
|
||||||
onPopUpClose?: (e: PopupEvent) => void;
|
onPopUpClose?: (e: PopupEvent) => void;
|
||||||
onToolClick?: ToolsProps['onToolClick']
|
onToolClick?: ToolsProps['onToolClick']
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MapRefProps {
|
export interface MapRefProps {
|
||||||
|
drawer: DrawControlRefProps
|
||||||
}
|
}
|
||||||
|
|
||||||
const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
||||||
@ -59,23 +63,25 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
width = '100%',
|
width = '100%',
|
||||||
draw,
|
draw,
|
||||||
markerData = [],
|
markerData = [],
|
||||||
sluterData = [],
|
clusterData,
|
||||||
popUpInfo = {
|
popUpInfo = {
|
||||||
longitude: 0,
|
longitude: 0,
|
||||||
latitude: 0
|
latitude: 0
|
||||||
},
|
},
|
||||||
showPopUp,
|
showPopUp,
|
||||||
toolsBarOpen,
|
toolsBarOpen,
|
||||||
showMarker = true,
|
showMarker = false,
|
||||||
showCluster = false,
|
showCluster = false,
|
||||||
|
showToolBar = true,
|
||||||
clusterProps,
|
clusterProps,
|
||||||
|
drawerProps,
|
||||||
interactiveLayerIds = [],
|
interactiveLayerIds = [],
|
||||||
buttonList = [
|
buttonList = [
|
||||||
{
|
{
|
||||||
label: '圆形框选',
|
label: '圆形框选',
|
||||||
key: 'circle',
|
key: 'circle',
|
||||||
icon: 'icon-yuan',
|
icon: 'icon-yuan',
|
||||||
onClick: () => drawControlRef.current?.drawer?.changeMode?.('simple_select')
|
onClick: () => drawControlRef.current?.drawer?.changeMode?.('draw_circle')
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: '矩形框选',
|
label: '矩形框选',
|
||||||
@ -113,6 +119,7 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
onMarkerClick,
|
onMarkerClick,
|
||||||
|
onMarkerCheck,
|
||||||
onPopUpClose,
|
onPopUpClose,
|
||||||
customMarkerRender,
|
customMarkerRender,
|
||||||
onLoad,
|
onLoad,
|
||||||
@ -143,7 +150,8 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
return markerData.map((_item) => (
|
return markerData.map((_item) => (
|
||||||
<Marker
|
<Marker
|
||||||
customMarkerRender={customMarkerRender}
|
customMarkerRender={customMarkerRender}
|
||||||
onMarkerClick={onMarkerClick}
|
onClick={onMarkerClick}
|
||||||
|
onCheck={onMarkerCheck}
|
||||||
{..._item}
|
{..._item}
|
||||||
/>
|
/>
|
||||||
))
|
))
|
||||||
@ -152,17 +160,20 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
|
|
||||||
useImperativeHandle(ref, () => ({
|
useImperativeHandle(ref, () => ({
|
||||||
mapRef: mapRef.current,
|
mapRef: mapRef.current,
|
||||||
drawer: drawControlRef.current?.drawer,
|
// @ts-ignore
|
||||||
|
drawer: drawControlRef.current?.drawer!,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
return (
|
return (
|
||||||
//@ts-ignore
|
//@ts-ignore
|
||||||
<div className={classnames(`${componentName}`)}>
|
<div className={classnames(`${componentName}`)}>
|
||||||
|
{showToolBar && (
|
||||||
<Tools
|
<Tools
|
||||||
open={toolsBarOpen}
|
open={toolsBarOpen}
|
||||||
buttonList={buttonList}
|
buttonList={buttonList}
|
||||||
onToolClick={onToolClick}
|
onToolClick={onToolClick}
|
||||||
/>
|
/>
|
||||||
|
)}
|
||||||
{/* @ts-ignore */}
|
{/* @ts-ignore */}
|
||||||
<Map
|
<Map
|
||||||
ref={mapRef}
|
ref={mapRef}
|
||||||
@ -190,11 +201,12 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
{/* 范围统计标点 */}
|
{/* 范围统计标点 */}
|
||||||
{showCluster && !showMarker && (
|
{showCluster && !showMarker && (
|
||||||
<Cluster
|
<Cluster
|
||||||
|
id={clusterLayer.id}
|
||||||
type="geojson"
|
type="geojson"
|
||||||
cluster={true}
|
cluster={true}
|
||||||
clusterMaxZoom={14}
|
clusterMaxZoom={14}
|
||||||
clusterRadius={50}
|
clusterRadius={50}
|
||||||
data={sluterData}
|
data={clusterData}
|
||||||
{...clusterProps}
|
{...clusterProps}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
@ -205,8 +217,8 @@ const MapBox = forwardRef<MapRefProps, MapProps>((props, ref) => {
|
|||||||
onCreate={onDrawCreate}
|
onCreate={onDrawCreate}
|
||||||
onUpdate={onDrawUpdate}
|
onUpdate={onDrawUpdate}
|
||||||
onDelete={onDrawDelete}
|
onDelete={onDrawDelete}
|
||||||
onSelectionChange={e => console.log('e', e)}
|
|
||||||
{...drawConfig}
|
{...drawConfig}
|
||||||
|
{...drawerProps}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
{children}
|
{children}
|
7
packages/map/src/mapBox/index.ts
Normal file
7
packages/map/src/mapBox/index.ts
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
/**
|
||||||
|
* Created by jiangzhixiong on 2024/05/23
|
||||||
|
*/
|
||||||
|
import MapBox from './MapBox'
|
||||||
|
export type { MapProps, MapRefProps } from './MapBox'
|
||||||
|
|
||||||
|
export default MapBox
|
0
packages/map/src/mapBox/interface.ts
Normal file
0
packages/map/src/mapBox/interface.ts
Normal file
@ -9,11 +9,17 @@ import {
|
|||||||
} from 'react-map-gl'
|
} from 'react-map-gl'
|
||||||
import { Checkbox, ConfigProvider, Image } from '@zhst/meta'
|
import { Checkbox, ConfigProvider, Image } from '@zhst/meta'
|
||||||
import classNames from 'classnames'
|
import classNames from 'classnames'
|
||||||
import cameraBlue from '../../assets/icons/camera_blue.png'
|
import cameraBlue from '../assets/icons/camera_blue.png'
|
||||||
import cameraGreen from '../../assets/icons/camera_green.png'
|
import cameraGreen from '../assets/icons/camera_green.png'
|
||||||
import cameraGrey from '../../assets/icons/camera_grey.png'
|
import cameraGrey from '../assets/icons/camera_grey.png'
|
||||||
import cameraRed from '../../assets/icons/camera_red.png'
|
import cameraRed from '../assets/icons/camera_red.png'
|
||||||
import cameraYellow from '../../assets/icons/camera_yellow.png'
|
import cameraYellow from '../assets/icons/camera_yellow.png'
|
||||||
|
import markerBlue from '../assets/icons/marker_blue.png'
|
||||||
|
import markerEscape from '../assets/icons/marker_escape.png'
|
||||||
|
import markerGreen from '../assets/icons/marker_green.png'
|
||||||
|
import markerRedBorder from '../assets/icons/marker_red_border.png'
|
||||||
|
import markerYellow from '../assets/icons/marker_yellow.png'
|
||||||
|
import markerRedTrack from '../assets/icons/marker_red_track.png'
|
||||||
import './index.less'
|
import './index.less'
|
||||||
|
|
||||||
const { ConfigContext } = ConfigProvider
|
const { ConfigContext } = ConfigProvider
|
||||||
@ -24,6 +30,12 @@ const PIC_MAP = new Map([
|
|||||||
['camera_grey', cameraGrey],
|
['camera_grey', cameraGrey],
|
||||||
['camera_red', cameraRed],
|
['camera_red', cameraRed],
|
||||||
['camera_yellow', cameraYellow],
|
['camera_yellow', cameraYellow],
|
||||||
|
['marker_blue', markerBlue],
|
||||||
|
['marker_escape', markerEscape],
|
||||||
|
['marker_green', markerGreen],
|
||||||
|
['marker_red_border', markerRedBorder],
|
||||||
|
['marker_yellow', markerYellow],
|
||||||
|
['marker_red_track', markerRedTrack],
|
||||||
])
|
])
|
||||||
|
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@ -37,10 +49,9 @@ export interface MarkerProps extends MapboxMarkerProps {
|
|||||||
showCheckBox?: boolean
|
showCheckBox?: boolean
|
||||||
showTooltip?: boolean
|
showTooltip?: boolean
|
||||||
type?: 'camera' | 'cluster' | 'marker';
|
type?: 'camera' | 'cluster' | 'marker';
|
||||||
population?: string;
|
|
||||||
status?: 'blue' | 'green' | 'yellow' | 'grey' | 'red_border' | 'escape' | 'escape_border' | 'red_track'; // 摄像头状态
|
status?: 'blue' | 'green' | 'yellow' | 'grey' | 'red_border' | 'escape' | 'escape_border' | 'red_track'; // 摄像头状态
|
||||||
onClick?: (e?: MarkerEvent, data?: MarkerProps) => void;
|
onClick?: (e?: MarkerEvent, data?: MarkerProps) => void;
|
||||||
onMarkerClick?: (e?: MouseEvent, checked?: boolean, data?: MarkerProps) => void;
|
onCheck?: (e?: MouseEvent, checked?: boolean, data?: MarkerProps) => void;
|
||||||
customMarkerRender?: (data: MarkerProps) => ReactNode
|
customMarkerRender?: (data: MarkerProps) => ReactNode
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +68,7 @@ const Marker = forwardRef<MarkerRefProps, MarkerProps>((props, ref) => {
|
|||||||
showCheckBox,
|
showCheckBox,
|
||||||
showTooltip,
|
showTooltip,
|
||||||
onClick,
|
onClick,
|
||||||
onMarkerClick,
|
onCheck,
|
||||||
customMarkerRender,
|
customMarkerRender,
|
||||||
...rest
|
...rest
|
||||||
} = props
|
} = props
|
||||||
@ -89,7 +100,7 @@ const Marker = forwardRef<MarkerRefProps, MarkerProps>((props, ref) => {
|
|||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.stopPropagation()
|
e.stopPropagation()
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
onMarkerClick?.(e, checked, props)
|
onCheck?.(e, checked, props)
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
82
packages/map/src/marker/demo/basic.tsx
Normal file
82
packages/map/src/marker/demo/basic.tsx
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import React, { useRef, useEffect, useState } from 'react';
|
||||||
|
import { MapBox, MarkerProps } from '@zhst/map';
|
||||||
|
import { FloatButton, Switch } from '@zhst/meta';
|
||||||
|
import axios from 'axios'
|
||||||
|
|
||||||
|
const demo = () => {
|
||||||
|
const mapRef = useRef(null);
|
||||||
|
const [markerData, setMarkerData] = useState<MarkerProps[]>([])
|
||||||
|
const [showMarker, setShowMarker] = useState(true)
|
||||||
|
// 初始化
|
||||||
|
const handleMapLoad = (e: mapboxgl.MapboxEvent<undefined>) => {
|
||||||
|
const map = e.target;
|
||||||
|
|
||||||
|
if (!map) return
|
||||||
|
|
||||||
|
map.flyTo({
|
||||||
|
// center: [120,30],
|
||||||
|
// zoom: map?.getMaxZoom(),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await axios({
|
||||||
|
method: 'post',
|
||||||
|
url: 'http://10.0.0.120:30003/singer.DeviceService/ListCamera',
|
||||||
|
headers: {
|
||||||
|
Authorization: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTcwNDAzNzEsImp0aSI6IjExMjgiLCJpYXQiOjE3MTY3ODExNzEsInVzZXJJZCI6MSwidXNlcm5hbWUiOiJhZG1pbiIsImRhdGFSaWdodCI6MiwiY2FtZXJhUmlnaHQiOjEsImdwdVJpZ2h0IjoxLCJ1c2VybGVhZGVySWQiOjAsIm9yZ2FuaXphdGlvbklkIjoxLCJyb2xlSWQiOjF9.XHbXIkXkfUuvqV6_qSV4d20xj-s7I0qOQZgL-zspMDc'
|
||||||
|
},
|
||||||
|
data: {"labelData":[],"filter":{"realtimeProcessingFilter":0,"cameraFilter":[{"opt":"ORNOT","cameraOpt":"CAMERAOPT_TYPE","value":"100"}]},"maxResults":50}
|
||||||
|
});
|
||||||
|
if (res.status === 200) {
|
||||||
|
let markers = []
|
||||||
|
res.data.cameras?.forEach(camera => {
|
||||||
|
markers.push({
|
||||||
|
key: camera.id,
|
||||||
|
id: camera.id,
|
||||||
|
title: camera.name,
|
||||||
|
checked: false,
|
||||||
|
disabled: false,
|
||||||
|
showCheckBox: true,
|
||||||
|
status: ['blue', 'yellow', 'red'][Math.floor(Math.random() * 3)],
|
||||||
|
latitude: camera.latitude,
|
||||||
|
longitude: camera.longitude
|
||||||
|
})
|
||||||
|
})
|
||||||
|
setMarkerData(markers)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getData()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<FloatButton>
|
||||||
|
<Switch value={true}/>
|
||||||
|
</FloatButton>
|
||||||
|
<MapBox
|
||||||
|
onLoad={handleMapLoad}
|
||||||
|
ref={mapRef}
|
||||||
|
width='100%'
|
||||||
|
height='800px'
|
||||||
|
showToolBar={false}
|
||||||
|
markerData={markerData || []}
|
||||||
|
showMarker={showMarker}
|
||||||
|
onMarkerCheck={(e, status, data) => {
|
||||||
|
console.log('marker', data)
|
||||||
|
setMarkerData(pre => pre.map(item => {
|
||||||
|
if (item.id === data.id) {
|
||||||
|
item.checked = !data?.checked
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
}))
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
</MapBox>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default demo;
|
53
packages/map/src/marker/index.md
Normal file
53
packages/map/src/marker/index.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
---
|
||||||
|
category: Components
|
||||||
|
subtitle: 标签
|
||||||
|
title: Marker 标签
|
||||||
|
toc: content
|
||||||
|
group:
|
||||||
|
title: 数据展示
|
||||||
|
order: 1
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
<code src="./demo/basic.tsx">基本用法</code>
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
| 参数 | 说明 | 类型 | 默认值 | 版本 |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| key | 键 | string | - | - |
|
||||||
|
| id | id | string | - | - |
|
||||||
|
| title | 标题 | string | - | - |
|
||||||
|
| disabled | 是否可选 | boolean | - | - |
|
||||||
|
| checked | 是否选中 | boolean | - | - |
|
||||||
|
| showCheckBox | 是否展示选择框 | boolean | - | - |
|
||||||
|
| showTooltip | 是否显示tooltip | boolean | - | - |
|
||||||
|
| type | 标签类型,目前只支持camera | 'camera' 'cluster' 'marker' | camera | - |
|
||||||
|
| status | 状态值 | IStatus | blue | - |
|
||||||
|
| onClick | 点击事件 | (e?: MarkerEvent, data?: MarkerProps) => void; | - | - |
|
||||||
|
| onCheck | ☑️选中事件 | (e?: MouseEvent, checked?: boolean, data?: MarkerProps) => void; | - | - |
|
||||||
|
| customMarkerRender | 自定义marker | (data: MarkerProps) => ReactNode | - | - |
|
||||||
|
|
||||||
|
> 更多属性参考:react-map-gl 组件: MarkerProps
|
||||||
|
|
||||||
|
## IStatus
|
||||||
|
|
||||||
|
```js
|
||||||
|
// 支持的状态,需要配合当前有的标记使用
|
||||||
|
type IStatus = 'blue' | 'green' | 'yellow' | 'grey' | 'red_border' | 'escape' | 'escape_border' | 'red_track'
|
||||||
|
|
||||||
|
// 目前支持的标记
|
||||||
|
const PIC_MAP = new Map([
|
||||||
|
['camera_blue', cameraBlue],
|
||||||
|
['camera_green', cameraGreen],
|
||||||
|
['camera_grey', cameraGrey],
|
||||||
|
['camera_red', cameraRed],
|
||||||
|
['camera_yellow', cameraYellow],
|
||||||
|
['marker_blue', markerBlue],
|
||||||
|
['marker_escape', markerEscape],
|
||||||
|
['marker_green', markerGreen],
|
||||||
|
['marker_red_border', markerRedBorder],
|
||||||
|
['marker_yellow', markerYellow],
|
||||||
|
['marker_red_track', markerRedTrack],
|
||||||
|
])
|
||||||
|
```
|
@ -141,4 +141,5 @@ const mapboxDrawStyle = [
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
export default mapboxDrawStyle;
|
export default mapboxDrawStyle;
|
||||||
|
26
packages/map/src/utils/index.md
Normal file
26
packages/map/src/utils/index.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
category: Components
|
||||||
|
subtitle: utils
|
||||||
|
title: utils 工具库
|
||||||
|
toc: content
|
||||||
|
group:
|
||||||
|
title: 其它
|
||||||
|
order: 4
|
||||||
|
---
|
||||||
|
|
||||||
|
|
||||||
|
## getPointByShape
|
||||||
|
|
||||||
|
获取图形中的点位,一般用来圈选使用
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { getPointByShape } from '@zhst/map'
|
||||||
|
```
|
||||||
|
|
||||||
|
## getDistancesByStringLine
|
||||||
|
|
||||||
|
通过绘制的线段获取每段线的距离,和总长度,默认单位为km
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { getDistancesByStringLine } from '@zhst/map'
|
||||||
|
```
|
@ -1,5 +1,12 @@
|
|||||||
# @zhst/material
|
# @zhst/material
|
||||||
|
|
||||||
|
## 0.19.1
|
||||||
|
|
||||||
|
### Patch Changes
|
||||||
|
|
||||||
|
- Updated dependencies
|
||||||
|
- @zhst/biz@0.25.1
|
||||||
|
|
||||||
## 0.19.0
|
## 0.19.0
|
||||||
|
|
||||||
### Minor Changes
|
### Minor Changes
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@zhst/material",
|
"name": "@zhst/material",
|
||||||
"version": "0.19.0",
|
"version": "0.19.1",
|
||||||
"description": "物料库",
|
"description": "物料库",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"business",
|
"business",
|
||||||
|
Loading…
Reference in New Issue
Block a user