재생 중 현재 위치 마커 숨김

This commit is contained in:
seo
2026-07-12 06:42:25 +09:00
parent 0f0d365818
commit d1322fbb71
2 changed files with 7 additions and 6 deletions
+1 -1
View File
@@ -72,7 +72,7 @@ Naver Map에는 단일 Polyline 중심의 부드러운 경로선을 먼저 그
집 판정은 설정된 서울 집 좌표를 중심점으로 한 150m 반경을 기준으로 합니다. GPS 튐 보정이 켜져 있으면 집 주변 1.2km 안의 지점은 집 주변 GPS 흔들림으로 흡수하고, 외출은 연속된 외부 지점이 5분 이상 지속될 때만 세션으로 확정합니다. 외부 지점 사이의 공백이 2시간을 넘으면 해당 구간은 알 수 없는 구간으로 보고 외출 지속시간에 합산하지 않습니다. 여러 번 나갔다 돌아온 경우 집 체류 시간은 합산하고, 외출은 출발/복귀 단위의 세션으로 따로 보여줍니다. 집 판정은 설정된 서울 집 좌표를 중심점으로 한 150m 반경을 기준으로 합니다. GPS 튐 보정이 켜져 있으면 집 주변 1.2km 안의 지점은 집 주변 GPS 흔들림으로 흡수하고, 외출은 연속된 외부 지점이 5분 이상 지속될 때만 세션으로 확정합니다. 외부 지점 사이의 공백이 2시간을 넘으면 해당 구간은 알 수 없는 구간으로 보고 외출 지속시간에 합산하지 않습니다. 여러 번 나갔다 돌아온 경우 집 체류 시간은 합산하고, 외출은 출발/복귀 단위의 세션으로 따로 보여줍니다.
기록 시간 슬라이더를 움직이면 지도 아래에는 `월. 일. 시간` 형식의 선택 시각만 간결하게 표시합니다. 경로 재생은 얼굴 아이콘 마커만 사용니다. 재생 버튼은 지점 수에 따라 의미 있는 배속만 남겨 `2x`, `5x`, `10x`, `20x`, `50x`, `100x`, `500x` 순서로 돌고, 각 배속에서 최소 80단계 이상 보여줄 수 없으면 해당 배속은 건너뜁니다. 80m 반경 안에서 10분 이상 머문 구간은 체류 지점 마커로 묶어 표시하며, 클릭 시 체류 시간과 시작/종료 시각을 확인할 수 있습니다. 기록 시간 슬라이더를 움직이면 지도 아래에는 `월. 일. 시간` 형식의 선택 시각만 간결하게 표시합니다. 경로 재생은 얼굴 아이콘 마커만 사용하며, 재생 중에는 현재 위치 얼굴과 정확도 원을 숨깁니다. 재생 버튼은 지점 수에 따라 의미 있는 배속만 남겨 `2x`, `5x`, `10x`, `20x`, `50x`, `100x`, `500x` 순서로 돌고, 각 배속에서 최소 80단계 이상 보여줄 수 없으면 해당 배속은 건너뜁니다. 80m 반경 안에서 10분 이상 머문 구간은 체류 지점 마커로 묶어 표시하며, 클릭 시 체류 시간과 시작/종료 시각을 확인할 수 있습니다.
재생 중 주기적 위치 갱신으로 히스토리 경로가 다시 그려져도 현재 재생 위치를 유지합니다. 재생 타이머는 시작 당시 지점 목록에 고정하지 않고 최신 히스토리 지점 목록을 기준으로 계속 진행합니다. 재생 중 주기적 위치 갱신으로 히스토리 경로가 다시 그려져도 현재 재생 위치를 유지합니다. 재생 타이머는 시작 당시 지점 목록에 고정하지 않고 최신 히스토리 지점 목록을 기준으로 계속 진행합니다.
+6 -5
View File
@@ -1948,7 +1948,7 @@ function fitHistoryOrCurrentBounds() {
} }
} }
function stopHistoryPlayback() { function stopHistoryPlayback(restoreCurrent = true) {
if (mapState.playbackTimer) { if (mapState.playbackTimer) {
clearInterval(mapState.playbackTimer); clearInterval(mapState.playbackTimer);
mapState.playbackTimer = null; mapState.playbackTimer = null;
@@ -1956,7 +1956,7 @@ function stopHistoryPlayback() {
if (mapState.playbackMarker) { if (mapState.playbackMarker) {
mapState.playbackMarker.setMap(null); mapState.playbackMarker.setMap(null);
} }
if (!_overrideRange) { if (restoreCurrent && !_overrideRange) {
setCurrentLocationVisible(true); setCurrentLocationVisible(true);
} }
updateMapToolLabels(); updateMapToolLabels();
@@ -1972,7 +1972,7 @@ function startHistoryPlayback(speed) {
const points = mapState.historyPoints; const points = mapState.historyPoints;
if (!mapState.map || !points?.length) return; if (!mapState.map || !points?.length) return;
stopHistoryPlayback(); stopHistoryPlayback(false);
setCurrentLocationVisible(false); setCurrentLocationVisible(false);
if (mapState.openInfoWindow) { if (mapState.openInfoWindow) {
mapState.openInfoWindow.close(); mapState.openInfoWindow.close();
@@ -2422,7 +2422,8 @@ function updateDOMWithData(data) {
} }
// 메인 마커 / 정확도 원 업데이트 // 메인 마커 / 정확도 원 업데이트
setCurrentLocationVisible(true); const isPlaybackActive = !!mapState.playbackTimer;
setCurrentLocationVisible(!isPlaybackActive);
mapState.marker.setPosition(latlng); mapState.marker.setPosition(latlng);
mapState.circle.setCenter(latlng); mapState.circle.setCenter(latlng);
animateCircleRadius(Math.max(data.accuracy || 50, 10)); animateCircleRadius(Math.max(data.accuracy || 50, 10));
@@ -2430,7 +2431,7 @@ function updateDOMWithData(data) {
// autoPosition // autoPosition
const isChecked = document.getElementById('autoPositionSwitch').checked; const isChecked = document.getElementById('autoPositionSwitch').checked;
if (isChecked && (lastLat !== data.latitude || lastLng !== data.longitude)) { if (!isPlaybackActive && isChecked && (lastLat !== data.latitude || lastLng !== data.longitude)) {
mapState.map.panTo(latlng); mapState.map.panTo(latlng);
} }
lastLat = data.latitude; lastLat = data.latitude;