修复搜索与点位定位闭环
Some checks failed
CI / verify (push) Has been cancelled

This commit is contained in:
lyf
2026-07-12 03:07:49 +08:00
parent e006333c0a
commit d8420fc7c2
18 changed files with 2961 additions and 621 deletions

View File

@@ -329,6 +329,7 @@ const props = withDefaults(defineProps<{
initialView?: ViewMode
showControls?: boolean
showPoi?: boolean
visiblePoiIds?: string[] | null
targetFocus?: TargetPoiFocusRequest | null
touchGestureMode?: TouchGestureMode
targetFocusDistanceFactor?: number
@@ -345,6 +346,7 @@ const props = withDefaults(defineProps<{
initialView: 'overview',
showControls: true,
showPoi: false,
visiblePoiIds: null,
targetFocus: null,
touchGestureMode: 'pan',
targetFocusDistanceFactor: 0.36,
@@ -395,7 +397,21 @@ const floors = computed<FloorOption[]>(() => (
label: formatFloorLabel(floor.floorId)
}))
))
const shouldRenderPoiMarkers = computed(() => props.showPoi || props.showControls || Boolean(props.targetFocus))
const shouldRenderPoiMarkers = computed(() => (
props.showPoi
|| props.showControls
|| props.visiblePoiIds !== null
|| Boolean(props.targetFocus)
))
const visiblePoiIdFilter = computed(() => (
props.visiblePoiIds === null
? null
: new Set(props.visiblePoiIds)
))
const isPoiIncludedByVisibleFilter = (poi: RenderPoi) => (
visiblePoiIdFilter.value === null || visiblePoiIdFilter.value.has(poi.id)
)
let scene: THREE.Scene | null = null
let camera: THREE.PerspectiveCamera | null = null
@@ -1480,8 +1496,28 @@ const updatePoiVisibilityByDistance = () => {
.sort((a, b) => (b.poi ? getPoiPriority(b.poi) : 0) - (a.poi ? getPoiPriority(a.poi) : 0))
candidates.forEach(({ sprite, poi, screenPosition }) => {
if (!poi) {
if (!poi || !isPoiIncludedByVisibleFilter(poi)) {
sprite.visible = false
const hitTarget = getPoiSpriteUserData(sprite).hitTarget
const labelSprite = getPoiSpriteUserData(sprite).labelSprite
if (hitTarget) {
hitTarget.visible = false
}
if (labelSprite) {
labelSprite.visible = false
}
return
}
// 分类结果模式直接展示列表对应点位,避免密度策略再次裁剪结果。
if (visiblePoiIdFilter.value !== null) {
sprite.visible = true
const hitTarget = getPoiSpriteUserData(sprite).hitTarget
if (hitTarget) {
hitTarget.visible = true
}
acceptedPositions.push(screenPosition)
visibleCount += 1
return
}
@@ -2182,7 +2218,12 @@ const getPoiHitTargets = () => {
const sprites: THREE.Sprite[] = []
poiGroup?.traverse((child) => {
if (isPoiHitTargetSprite(child)) {
const poi = child.userData.poi as RenderPoi | undefined
if (
isPoiHitTargetSprite(child)
&& child.visible
&& Boolean(poi && isPoiIncludedByVisibleFilter(poi))
) {
sprites.push(child)
}
})
@@ -4513,7 +4554,11 @@ const createPoiMarkerGroup = (
labelSprite.position.copy(getPoiAmbientLabelPosition(displayPosition, markerSize))
labelSprite.visible = false
}
sprite.visible = shouldShowPoiAtDistance(poi, getPoiVisibilityTier())
sprite.visible = isPoiIncludedByVisibleFilter(poi)
&& (
visiblePoiIdFilter.value !== null
|| shouldShowPoiAtDistance(poi, getPoiVisibilityTier())
)
hitTarget.visible = sprite.visible
group.add(sprite)
group.add(hitTarget)
@@ -5294,6 +5339,12 @@ watch(() => props.targetFocus, (request) => {
immediate: true
})
watch(() => props.visiblePoiIds, () => {
refreshPoiVisibilityByDistance()
}, {
deep: true
})
watch(() => [props.routePreview, props.showRoute], () => {
renderRoutePreview()
}, {