From c21960d9716325bd92cdc4e98c8831fdc259c842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B1=A1=E6=95=B0?= <zhengxue.lzx@antgroup.com> Date: Mon, 9 Dec 2024 16:55:25 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20marker,polyline=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 8 ++++++- src/Map/Component/MapView.tsx | 20 +++++++++++++++++ src/Map/Component/Marker.tsx | 33 ++++++++++++++++++++++++++++ src/Map/Component/Polyline.tsx | 31 ++++++++++++++++++++++++++ src/Map/Component/index.tsx | 5 +++++ src/Map/index.tsx | 40 ++++++++++++---------------------- src/utils/map/context.ts | 3 +++ src/utils/map/view.ts | 13 ++++++----- 8 files changed, 120 insertions(+), 33 deletions(-) create mode 100644 src/Map/Component/MapView.tsx create mode 100644 src/Map/Component/Marker.tsx create mode 100644 src/Map/Component/Polyline.tsx create mode 100644 src/Map/Component/index.tsx diff --git a/.vscode/settings.json b/.vscode/settings.json index d465499..90194a8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,5 +7,11 @@ // typescript auto-format settings "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true + "editor.formatOnSave": true, + "[typescript]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "vscode.typescript-language-features" + } } diff --git a/src/Map/Component/MapView.tsx b/src/Map/Component/MapView.tsx new file mode 100644 index 0000000..cf77bcc --- /dev/null +++ b/src/Map/Component/MapView.tsx @@ -0,0 +1,20 @@ +import { useScene } from '@antv/larkmap'; +import { useEffect } from 'react'; +import type { Map } from '../../types/map'; +import { fitBounds, setMapStatus, setMapView } from '../../utils/map'; + +// 更新地图视野 +export default (props: Map) => { + const scene = useScene(); + useEffect(() => { + setMapView(props, scene); + }, []); + useEffect(() => { + setMapStatus(props, scene); + }, [props.enableRotate, props.enableScroll, props.enableZoom]); + useEffect(() => { + fitBounds(props, scene); + }, [props.includePoints, props.markers, props.polyline, props.includePadding]); + + return null; +}; diff --git a/src/Map/Component/Marker.tsx b/src/Map/Component/Marker.tsx new file mode 100644 index 0000000..6692ec4 --- /dev/null +++ b/src/Map/Component/Marker.tsx @@ -0,0 +1,33 @@ +import type { ILayer } from '@antv/l7'; +import { useScene } from '@antv/larkmap'; +import { useEffect, useState } from 'react'; +import type { Map } from '../../types/map'; +import { setMapContext, setMarkers } from '../../utils/map'; +// 更新地图视野 +export default (props: Map) => { + const scene = useScene(); + const [layers, setLayers] = useState<ILayer[]>([]); + const removeLayers = () => { + layers.forEach((item) => { + scene.removeLayer(item); + }); + }; + useEffect(() => { + if (!props.markers) return; + // 异步调用 + setMapContext(props, scene)?.then(() => { + // 初始化资源 + const markerLayer = setMarkers(props.markers || []); + removeLayers(); + markerLayer.forEach((item) => { + scene.addLayer(item); + }); + setLayers(markerLayer); + }); + return () => { + removeLayers(); + }; + }, [props.markers]); + + return null; +}; diff --git a/src/Map/Component/Polyline.tsx b/src/Map/Component/Polyline.tsx new file mode 100644 index 0000000..0d20834 --- /dev/null +++ b/src/Map/Component/Polyline.tsx @@ -0,0 +1,31 @@ +import type { ILayer } from '@antv/l7'; +import { useScene } from '@antv/larkmap'; +import { useEffect, useState } from 'react'; +import type { Map } from '../../types/map'; +import { setPolyline } from '../../utils/map'; +// 更新地图视野 +export default (props: Map) => { + const scene = useScene(); + const [layers, setLayers] = useState<ILayer[]>([]); + const removeLayers = () => { + layers.forEach((item) => { + scene.removeLayer(item); + }); + }; + useEffect(() => { + if (!props.polyline) return; + const lineLayers = setPolyline(props.polyline || []); + removeLayers(); + console.log('lineLayers', lineLayers); + lineLayers.forEach((item) => { + scene.addLayer(item); + }); + setLayers(lineLayers); + + return () => { + removeLayers(); + }; + }, [props.polyline]); + + return null; +}; diff --git a/src/Map/Component/index.tsx b/src/Map/Component/index.tsx new file mode 100644 index 0000000..29eef7d --- /dev/null +++ b/src/Map/Component/index.tsx @@ -0,0 +1,5 @@ +import MapView from './MapView'; +import Marker from './Marker'; +import Polyline from './Polyline'; + +export { MapView, Marker, Polyline }; diff --git a/src/Map/index.tsx b/src/Map/index.tsx index 2bf0821..441e153 100644 --- a/src/Map/index.tsx +++ b/src/Map/index.tsx @@ -1,37 +1,18 @@ -import type { ILayer, Scene } from '@antv/l7'; import { LarkMap } from '@antv/larkmap'; -import React, { type FC } from 'react'; +import React, { useMemo, type FC } from 'react'; import type { BaseMapProps } from '../types'; -import { formatMapStyle, setMapContext, setMapView, setMarkers, setPolyline } from '../utils/map'; +import { formatMapStyle } from '../utils/map'; +import { MapView, Marker, Polyline } from './Component/'; export type MapProps = Omit<BaseMapProps<any>, 'data'>; const Map: FC<MapProps> = (props) => { const { className, containerStyle, children } = props; - const allLayers: ILayer[] = []; - const mapConfig = formatMapStyle(props); - - const onSceneLoaded = async (scene: Scene) => { - // 初始地图视野 - setMapView(props, scene); - // 初始化地图资源和状态 - await setMapContext(props, scene); - - // 添加线图层 - if (props.polyline) { - const polylineLayer = setPolyline(props.polyline || []); - allLayers.push(...polylineLayer); - } - - // 添加标记 - if (props.markers) { - const markerLayer = setMarkers(props.markers || []); - allLayers.push(...markerLayer); + const mapConfig = useMemo(() => formatMapStyle(props), [props]); + const onSceneLoaded = async () => { + if (props.onInitComplete) { + props.onInitComplete(); } - - allLayers.forEach((item) => { - scene.addLayer(item); - }); }; return ( @@ -41,6 +22,13 @@ const Map: FC<MapProps> = (props) => { {...mapConfig} onSceneLoaded={onSceneLoaded} > + {/* 设置地图状态 */} + <MapView {...props} /> + {/* 初始化图片,并加载 Marker */} + <Marker {...props} /> + {/* 初始化线,并加载 Polyline */} + <Polyline {...props} /> + {children} </LarkMap> ); diff --git a/src/utils/map/context.ts b/src/utils/map/context.ts index 956551c..d3eb817 100644 --- a/src/utils/map/context.ts +++ b/src/utils/map/context.ts @@ -14,6 +14,9 @@ export function setMapContext(props: Map, scene: Scene) { return Promise.all( Array.from(icons.values()).map(async (url: string) => { const id = urlToMarkerId(url); + if (scene.hasImage(id)) { + return; + } return await scene.addImage(id, url); }), ); diff --git a/src/utils/map/view.ts b/src/utils/map/view.ts index 2eddd22..eb716d0 100644 --- a/src/utils/map/view.ts +++ b/src/utils/map/view.ts @@ -32,7 +32,11 @@ function fitIncludePoints( } export const setMapView = (props: Map, scene: Scene) => { - // 单个点,多个点 + fitBounds(props, scene); + setMapStatus(props, scene); +}; + +export const fitBounds = (props: Map, scene: Scene) => { if (props.includePoints) { fitIncludePoints(props.includePoints, scene, props.includePadding); } else { @@ -53,7 +57,9 @@ export const setMapView = (props: Map, scene: Scene) => { fitIncludePoints(points, scene, props.includePadding); } } +}; +export const setMapStatus = (props: Map, scene: Scene) => { if (props.enableZoom !== undefined) { scene.setMapStatus({ zoomEnable: props.enableZoom, @@ -69,9 +75,4 @@ export const setMapView = (props: Map, scene: Scene) => { dragEnable: props.enableScroll, }); } - - if (props.onInitComplete) { - scene.off('loaded', props.onInitComplete); - scene.on('loaded', props.onInitComplete); - } }; From 022d3390313cdf2caa7edbc775e0fadae9b328de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B1=A1=E6=95=B0?= <zhengxue.lzx@antgroup.com> Date: Mon, 9 Dec 2024 17:20:28 +0800 Subject: [PATCH 2/5] =?UTF-8?q?docs:=20=E4=BF=AE=E6=94=B9=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E6=8F=8F=E8=BF=B0=E4=BF=A1=E6=81=AF=E5=92=8C=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 --- src/Map/Component/Marker.tsx | 2 +- src/Map/Component/Polyline.tsx | 3 +-- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 90194a8..7b2d6ab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,9 +8,6 @@ "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, - "[typescript]": { - "editor.defaultFormatter": "vscode.typescript-language-features" - }, "[typescriptreact]": { "editor.defaultFormatter": "vscode.typescript-language-features" } diff --git a/src/Map/Component/Marker.tsx b/src/Map/Component/Marker.tsx index 6692ec4..8505f02 100644 --- a/src/Map/Component/Marker.tsx +++ b/src/Map/Component/Marker.tsx @@ -3,7 +3,7 @@ import { useScene } from '@antv/larkmap'; import { useEffect, useState } from 'react'; import type { Map } from '../../types/map'; import { setMapContext, setMarkers } from '../../utils/map'; -// 更新地图视野 +// 渲染标记点 export default (props: Map) => { const scene = useScene(); const [layers, setLayers] = useState<ILayer[]>([]); diff --git a/src/Map/Component/Polyline.tsx b/src/Map/Component/Polyline.tsx index 0d20834..e42130a 100644 --- a/src/Map/Component/Polyline.tsx +++ b/src/Map/Component/Polyline.tsx @@ -3,7 +3,7 @@ import { useScene } from '@antv/larkmap'; import { useEffect, useState } from 'react'; import type { Map } from '../../types/map'; import { setPolyline } from '../../utils/map'; -// 更新地图视野 +// 渲染线图层 export default (props: Map) => { const scene = useScene(); const [layers, setLayers] = useState<ILayer[]>([]); @@ -16,7 +16,6 @@ export default (props: Map) => { if (!props.polyline) return; const lineLayers = setPolyline(props.polyline || []); removeLayers(); - console.log('lineLayers', lineLayers); lineLayers.forEach((item) => { scene.addLayer(item); }); From e258a24f726acdd5e1a98e2d5072a115a974e6b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B1=A1=E6=95=B0?= <zhengxue.lzx@antgroup.com> Date: Mon, 9 Dec 2024 17:25:47 +0800 Subject: [PATCH 3/5] chore: setting --- .vscode/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 7b2d6ab..bce9908 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,7 @@ "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, - "[typescriptreact]": { + "[typescript]": { "editor.defaultFormatter": "vscode.typescript-language-features" } } From d657d744b512e278f024f64fe9e6dc978674fe04 Mon Sep 17 00:00:00 2001 From: lvisei <yunji.me@outlook.com> Date: Mon, 9 Dec 2024 17:29:12 +0800 Subject: [PATCH 4/5] Update settings.json --- .vscode/settings.json | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index bce9908..d465499 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -7,8 +7,5 @@ // typescript auto-format settings "typescript.tsdk": "node_modules/typescript/lib", "editor.defaultFormatter": "esbenp.prettier-vscode", - "editor.formatOnSave": true, - "[typescript]": { - "editor.defaultFormatter": "vscode.typescript-language-features" - } + "editor.formatOnSave": true } From 69734c8b0f19c6b71280c6bb1fe143d93c77c10a Mon Sep 17 00:00:00 2001 From: lvisei <yunji.me@outlook.com> Date: Mon, 9 Dec 2024 17:30:18 +0800 Subject: [PATCH 5/5] Create strange-turtles-allow.md --- .changeset/strange-turtles-allow.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/strange-turtles-allow.md diff --git a/.changeset/strange-turtles-allow.md b/.changeset/strange-turtles-allow.md new file mode 100644 index 0000000..684716d --- /dev/null +++ b/.changeset/strange-turtles-allow.md @@ -0,0 +1,5 @@ +--- +'@antv/gpt-vis': patch +--- + +feat: map support update