diff --git a/global.d.ts b/global.d.ts index 1ea3960..b854b33 100644 --- a/global.d.ts +++ b/global.d.ts @@ -1 +1,4 @@ declare module '*.less'; +declare module '*.png'; +declare module '*.jpg'; +declare module '*.jpeg'; diff --git a/packages/map/src/MapBox.tsx b/packages/map/src/MapBox.tsx index 9da0e84..1f268d0 100644 --- a/packages/map/src/MapBox.tsx +++ b/packages/map/src/MapBox.tsx @@ -1,48 +1,47 @@ import 'mapbox-gl/dist/mapbox-gl.css'; import '@mapbox/mapbox-gl-draw/dist/mapbox-gl-draw.css'; -import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'; -import Map from 'react-map-gl'; +import React, { forwardRef, useImperativeHandle, useMemo, useRef, useState } from 'react'; +import Map, { PopupEvent } from 'react-map-gl'; import { CSSProperties } from "react"; -import { MapboxMap, MapRef, MapStyle } from "react-map-gl"; +import { MapRef, MapStyle, MapProps as MapBoxProps } from "react-map-gl"; import classnames from 'classnames' import Tools, { ToolsProps } from './components/tools' import DrawControl, { DrawControlProps, DrawControlRefProps } from './components/drawControl'; import { MAP_CENTER, defaultMapConfig } from './utils/constants'; import './index.less'; import mapboxDrawStyle from './utils/drawStyle'; -import Marker from './components/marker'; +import Marker, { MarkerProps } from './components/marker'; +import PopUp, { PopUpProps } from './components/popup'; const componentName = 'zhst-map' -export interface IMarkerData { - key: string; - title: string; - population: string; - status: string; - latitude: number; - longitude: number; -} -export interface MapProps extends Partial { - mapboxAccessToken?: string; //token - markerData?: IMarkerData[] - minZoom?: number; //最小层级 - maxZoom?: number; //最大层级 - mapStyle?: MapStyle; //地图样式 - height?: number | string; - width?: string | number; - mapRef?: MapRef; - style?: CSSProperties; - children?: JSX.Element | JSX.Element[] | Array; +export interface MapProps extends MapBoxProps { + mapboxAccessToken?: string //token + markerData?: MarkerProps[] + minZoom?: number //最小层级 + maxZoom?: number //最大层级 + mapStyle?: MapStyle //地图样式 + height?: number | string + width?: string | number + mapRef?: MapRef + style?: CSSProperties + children?: JSX.Element | JSX.Element[] | Array mapCenter?: { longitude: number, latitude: number } - draw?: boolean; + draw?: boolean + showMarker?: boolean // 显示标记点 buttonList?: ToolsProps['buttonList'] - onLoad?: (e: mapboxgl.MapboxEvent) => void; - onDrawCreate?: (e: { features: object[], [key: string]: any }) => void; - onDrawUpdate?: (e: { features: object[], [key: string]: any }) => void; - onDrawDelete?: (e: { features: object[], [key: string]: any }) => void; + popUpInfo?: PopUpProps + showPopUp?: boolean + customMarkerRender?: MarkerProps['customMarkerRender'] + onLoad?: (e: mapboxgl.MapboxEvent) => void + onDrawCreate?: (e: { features: object[], [key: string]: any }) => void + onDrawUpdate?: (e: { features: object[], [key: string]: any }) => void + onDrawDelete?: (e: { features: object[], [key: string]: any }) => void + onMarkerClick?: MarkerProps['onMarkerClick'] + onPopUpClose?: (e: PopupEvent) => void; } export interface MapRefProps { @@ -57,6 +56,14 @@ const MapBox = forwardRef((props, ref) => { width = '100%', draw, markerData = [], + popUpInfo = { + ...MAP_CENTER + }, + showPopUp, + customMarkerRender, + showMarker, + onMarkerClick, + onPopUpClose, buttonList = [ { label: '圆形框选', @@ -102,12 +109,10 @@ const MapBox = forwardRef((props, ref) => { const [drawConfig] = useState({ displayControlsDefault: false, position: 'top-left', + styles: mapboxDrawStyle, // Select which mapbox-gl-draw control buttons to add to the map. - controls: { - polygon: true, - trash: true - }, + controls: false, // The user does not have to click the polygon control button first. defaultMode: 'draw_polygon', }) @@ -116,13 +121,14 @@ const MapBox = forwardRef((props, ref) => { () => { return markerData.map((_item, index) => ( )) - }, - [markerData] + }, [markerData] ); useImperativeHandle(ref, () => ({ @@ -145,7 +151,15 @@ const MapBox = forwardRef((props, ref) => { style={{ width: width, height: height, ...style }} {...others} > - {initMarker} + {/* 标记点位 */} + {showMarker && initMarker} + {/* 点位弹框 */} + {showPopUp && popUpInfo && ( + + )} {/* diff --git a/packages/map/src/assets/icons/marker_normal.png b/packages/map/src/assets/icons/camera_blue.png similarity index 100% rename from packages/map/src/assets/icons/marker_normal.png rename to packages/map/src/assets/icons/camera_blue.png diff --git a/packages/map/src/assets/icons/marker_monitor.png b/packages/map/src/assets/icons/camera_green.png similarity index 100% rename from packages/map/src/assets/icons/marker_monitor.png rename to packages/map/src/assets/icons/camera_green.png diff --git a/packages/map/src/assets/icons/marker_virtual.png b/packages/map/src/assets/icons/camera_grey.png similarity index 100% rename from packages/map/src/assets/icons/marker_virtual.png rename to packages/map/src/assets/icons/camera_grey.png diff --git a/packages/map/src/assets/icons/marker_track_virtual.png b/packages/map/src/assets/icons/camera_red.png similarity index 100% rename from packages/map/src/assets/icons/marker_track_virtual.png rename to packages/map/src/assets/icons/camera_red.png diff --git a/packages/map/src/assets/icons/marker_pos.png b/packages/map/src/assets/icons/camera_red_border.png similarity index 100% rename from packages/map/src/assets/icons/marker_pos.png rename to packages/map/src/assets/icons/camera_red_border.png diff --git a/packages/map/src/assets/icons/marker_normal_select.png b/packages/map/src/assets/icons/camera_yellow.png similarity index 100% rename from packages/map/src/assets/icons/marker_normal_select.png rename to packages/map/src/assets/icons/camera_yellow.png diff --git a/packages/map/src/assets/icons/cluster_normal.png b/packages/map/src/assets/icons/cluster_blue.png similarity index 100% rename from packages/map/src/assets/icons/cluster_normal.png rename to packages/map/src/assets/icons/cluster_blue.png diff --git a/packages/map/src/assets/icons/cluster_alarm.png b/packages/map/src/assets/icons/cluster_red.png similarity index 100% rename from packages/map/src/assets/icons/cluster_alarm.png rename to packages/map/src/assets/icons/cluster_red.png diff --git a/packages/map/src/assets/icons/cluster_escape.png b/packages/map/src/assets/icons/cluster_red_border.png similarity index 100% rename from packages/map/src/assets/icons/cluster_escape.png rename to packages/map/src/assets/icons/cluster_red_border.png diff --git a/packages/map/src/assets/icons/fecluster_normal.png b/packages/map/src/assets/icons/marker_blue.png similarity index 100% rename from packages/map/src/assets/icons/fecluster_normal.png rename to packages/map/src/assets/icons/marker_blue.png diff --git a/packages/map/src/assets/icons/fecluster_escape.png b/packages/map/src/assets/icons/marker_escape_border.png similarity index 100% rename from packages/map/src/assets/icons/fecluster_escape.png rename to packages/map/src/assets/icons/marker_escape_border.png diff --git a/packages/map/src/assets/icons/fecluster_alarm.png b/packages/map/src/assets/icons/marker_green.png similarity index 100% rename from packages/map/src/assets/icons/fecluster_alarm.png rename to packages/map/src/assets/icons/marker_green.png diff --git a/packages/map/src/assets/icons/fecluster_uncontrolled.png b/packages/map/src/assets/icons/marker_red_border.png similarity index 100% rename from packages/map/src/assets/icons/fecluster_uncontrolled.png rename to packages/map/src/assets/icons/marker_red_border.png diff --git a/packages/map/src/assets/icons/marker_track.png b/packages/map/src/assets/icons/marker_red_track.png similarity index 100% rename from packages/map/src/assets/icons/marker_track.png rename to packages/map/src/assets/icons/marker_red_track.png diff --git a/packages/map/src/assets/icons/marker_runing.png b/packages/map/src/assets/icons/marker_runing.png deleted file mode 100644 index 0572538..0000000 Binary files a/packages/map/src/assets/icons/marker_runing.png and /dev/null differ diff --git a/packages/map/src/assets/icons/marker_runing_select.png b/packages/map/src/assets/icons/marker_runing_select.png deleted file mode 100644 index 00eeaab..0000000 Binary files a/packages/map/src/assets/icons/marker_runing_select.png and /dev/null differ diff --git a/packages/map/src/assets/icons/marker_uncontrolled.png b/packages/map/src/assets/icons/marker_uncontrolled.png deleted file mode 100644 index 7470540..0000000 Binary files a/packages/map/src/assets/icons/marker_uncontrolled.png and /dev/null differ diff --git a/packages/map/src/assets/icons/marker_virtual_select.png b/packages/map/src/assets/icons/marker_virtual_select.png deleted file mode 100644 index 00eeaab..0000000 Binary files a/packages/map/src/assets/icons/marker_virtual_select.png and /dev/null differ diff --git a/packages/map/src/assets/icons/fecluster_normal_select.png b/packages/map/src/assets/icons/marker_yellow.png similarity index 100% rename from packages/map/src/assets/icons/fecluster_normal_select.png rename to packages/map/src/assets/icons/marker_yellow.png diff --git a/packages/map/src/components/marker/Marker.tsx b/packages/map/src/components/marker/Marker.tsx index deeca9f..c332dd2 100644 --- a/packages/map/src/components/marker/Marker.tsx +++ b/packages/map/src/components/marker/Marker.tsx @@ -1,19 +1,43 @@ /** * Created by jiangzhixiong on 2024/05/23 */ -import React, { forwardRef, useContext, useImperativeHandle } from 'react' +import React, { forwardRef, ReactNode, useContext, useImperativeHandle } from 'react' import { Marker as MapboxMarker, - MarkerProps as MapboxMarkerProps + MarkerProps as MapboxMarkerProps, + MarkerEvent } from 'react-map-gl' -import { ConfigProvider, Image } from '@zhst/meta' -import markerPic from '../../assets/icons/marker_monitor.png' +import { Checkbox, ConfigProvider, Image } from '@zhst/meta' +import cameraBlue from '../../assets/icons/camera_blue.png' +import cameraGreen from '../../assets/icons/camera_green.png' +import cameraGrey from '../../assets/icons/camera_grey.png' +import cameraRed from '../../assets/icons/camera_red.png' +import cameraYellow from '../../assets/icons/camera_yellow.png' const { ConfigContext } = ConfigProvider +const PIC_MAP = new Map([ + ['camera_blue', cameraBlue], + ['camera_green', cameraGreen], + ['camera_grey', cameraGrey], + ['camera_red', cameraRed], + ['camera_yellow', cameraYellow], +]) + +// @ts-ignore export interface MarkerProps extends MapboxMarkerProps { prefixCls?: string; key: string; + title?: string; + checked?: boolean; + type?: 'camera' | 'cluster' | 'marker'; + population?: string; + status?: 'blue' | 'green' | 'yellow' | 'grey' | 'red_border' | 'escape' | 'escape_border' | 'red_track'; // 摄像头状态 + latitude: number; + longitude: number; + onClick?: (e?: MarkerEvent, data?: MarkerProps) => void; + onMarkerClick?: (e?: MouseEvent, checked?: boolean, data?: MarkerProps) => void; + customMarkerRender?: (data: MarkerProps) => ReactNode } export interface MarkerRefProps { @@ -22,27 +46,43 @@ export interface MarkerRefProps { const Marker = forwardRef((props, ref) => { const { prefixCls: customizePrefixCls, - key, longitude, latitude, - onClick + checked = false, + type = 'camera', + status = 'blue', + onClick, + onMarkerClick, + customMarkerRender } = props const { getPrefixCls } = useContext(ConfigContext) const componentName = getPrefixCls('-map-marker', customizePrefixCls); - useImperativeHandle(ref, () => ({ - - })) + useImperativeHandle(ref, () => ({})) return ( { + e.originalEvent.stopPropagation(); + onClick?.(e, props) + }} > - + {/* 自定义marker */} + {customMarkerRender?.(props) || ( +
+ { + e.stopPropagation() + // @ts-ignore + onMarkerClick?.(e, checked, props) + }}> + + +
+ )}
) }) diff --git a/packages/map/src/components/popup/PopUp.tsx b/packages/map/src/components/popup/PopUp.tsx index e1efd0a..48a6b8f 100644 --- a/packages/map/src/components/popup/PopUp.tsx +++ b/packages/map/src/components/popup/PopUp.tsx @@ -3,16 +3,21 @@ */ import React, { forwardRef, useContext, useImperativeHandle } from 'react' import { - PopUp as MapboxPopUp, + Popup as MapboxPopUp, PopupProps as MapboxPopupProps } from 'react-map-gl' -import { ConfigProvider } from '@zhst/meta' +import { ConfigProvider, Image } from '@zhst/meta' +import './index.less' +import classNames from 'classnames' const { ConfigContext } = ConfigProvider export interface PopUpProps extends MapboxPopupProps { prefixCls?: string; size?: number; + title?: string; + url?: string; + content?: string; } export interface PopUpRefProps { @@ -23,24 +28,28 @@ const PopUp = forwardRef((props, ref) => { longitude, latitude, onClose, + title, + content, + url, prefixCls: customizePrefixCls } = props const { getPrefixCls } = useContext(ConfigContext) const componentName = getPrefixCls('map-popup', customizePrefixCls); - useImperativeHandle(ref, () => ({ - - })) + useImperativeHandle(ref, () => ({})) return ( -
- popup +
+ {title &&

{title}

} + {url && } + {content &&

{content}

}
) diff --git a/packages/map/src/components/popup/index.less b/packages/map/src/components/popup/index.less new file mode 100644 index 0000000..3510a6a --- /dev/null +++ b/packages/map/src/components/popup/index.less @@ -0,0 +1,11 @@ +.zhst-map-popup { + .mapboxgl-popup-content { + padding: 12px 6px 6px; + } + + &-container { + p { + margin: 0; + } + } +} diff --git a/packages/map/src/components/popup/index.tsx b/packages/map/src/components/popup/index.tsx index 166a7c3..867e3fe 100644 --- a/packages/map/src/components/popup/index.tsx +++ b/packages/map/src/components/popup/index.tsx @@ -1,5 +1,7 @@ /** * Created by jiangzhixiong on 2024/05/23 */ -export { default as PopUp } from './PopUp' +import PopUp from './PopUp' export type { PopUpProps, PopUpRefProps } from './PopUp' + +export default PopUp diff --git a/packages/map/src/demo/basic.tsx b/packages/map/src/demo/basic.tsx index 0419b39..3c889bf 100644 --- a/packages/map/src/demo/basic.tsx +++ b/packages/map/src/demo/basic.tsx @@ -1,9 +1,12 @@ import React, { useRef, useEffect, useState } from 'react'; import { MapBox } from '@zhst/map'; import axios from 'axios'; +import { FloatButton, Switch } from '@zhst/meta'; const demo = () => { const [markerData, setMarkerData] = useState([]) + const [showMarker, setShowMarker] = useState(true) + const [popupInfo, setPopupInfo] = useState() const mapRef = useRef(null); // 初始化 @@ -44,16 +47,40 @@ const demo = () => { }, []) return ( - console.log('Create', e)} - onDrawDelete={e => console.log('Delete', e)} - onDrawUpdate={e => console.log('Update', e)} - width='100%' - height='100vh' - markerData={markerData} - /> +
+ + + + console.log('Create', e)} + onDrawDelete={e => console.log('Delete', e)} + onDrawUpdate={e => console.log('Update', e)} + width='100%' + height='100vh' + markerData={markerData} + showMarker={showMarker} + showPopUp + popUpInfo={popupInfo} + onPopUpClose={e => setPopupInfo(null)} + onMarkerClick={(e, status, data) => { + setPopupInfo({ + longitude: data?.longitude, + latitude: data?.latitude, + content: '测试' + }) + }} + onZoomEnd={map => { + let zoom = map.target.getZoom() // 画面层级,用来判断标签是否显示隐藏 + + console.log('zoom', zoom) + // setShowMarker(pre => !pre) + }} + // customMarkerRender={(_data) =>
自定义标记
} + /> +
); }; diff --git a/tsconfig.json b/tsconfig.json index 28e0062..774856c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -32,6 +32,6 @@ // "@zhst/meta" 全局使用的工具包,不建议写到 npm 包中去 ] }, - "include": [".dumirc.ts", "src/**/*", "packages/**/*"], + "include": [".dumirc.ts", "src/**/*", "packages/**/*", "global.d.ts"], "exclude": ["node_modules", "lib", "es", ".dumi"] }