본문으로 건너뛰기

GPS 반경 측정기 (GPS Radius Measure)

문서 정보​


TL;DR

체육관 카메라 설치 시 GPS 허용 반경(gpsRadiusMeters)을 현장에서 측정하는 내부 운영 도구입니다. 설치팀이 체육관에서 측정하면, 해당 체육관에 적합한 GPS 반경값을 추천해줍니다.


목차​

  1. 왜 필요한가요?
  2. GPS 검증이란?
  3. 측정 방법 (설치팀 가이드)
  4. 측정 결과 해석
  5. gpsRadiusMeters 설정 기준
  6. GPS 한계와 주의사항
  7. 기술 상세
  8. FAQ

왜 필요한가요?​

서버에서 사용자가 체육관 근처에 있는지 GPS로 검증합니다. 이때 각 체육관마다 허용 반경(gpsRadiusMeters)이 필요한데, 체육관마다 건물 크기와 GPS 환경이 다르기 때문에 현장에서 직접 측정해야 적절한 값을 설정할 수 있습니다.

  • 반경이 너무 작으면 → 체육관 안에 있는데 검증 실패 (사용자 불편)
  • 반경이 너무 크면 → 체육관 밖에서도 녹화 가능 (보안 약화)

GPS 검증이란?​

사용자 앱 (Expo)                    서버
────────────── ──────
사용자 위도/경도 ──────────────→ DB의 체육관 위도/경도와 비교
↓
Haversine 거리 계산
↓
거리 ≤ gpsRadiusMeters ?
↓ ↓
통과 차단
  • 체육관 오너에게 약속하는 것: "사용자가 체육관 근처에 있어야만 녹화 가능"
  • GPS로 보장할 수 있는 것: 엉뚱한 장소(집, 다른 동네)에서의 녹화 차단
  • GPS로 보장 못하는 것: 건물 안/밖의 정확한 경계 구분 (실내 GPS 한계)

측정 방법 (설치팀 가이드)​

접속​

  1. 모바일 브라우저에서 gps.spoclip.ai 접속
  2. "홈 화면에 추가"로 앱처럼 설치 가능 (PWA)
  3. 위치 권한 허용

측정 순서​

1단계  체육관 코트 중앙(카메라 위치)에서 "기준점 설정" 클릭

2단계 GPS 안정화 자동 진행 (움직이지 마세요!)
→ 최소 3초 ~ 최대 10초, GPS가 안정되면 자동 완료
→ 드리프트 등급 표시 (좋음/보통/나쁨)

3단계 체육관 경계(입구, 모서리 등)로 이동하면서 "랩 기록" 4~6회
→ 실제 체육관 크기 측정

4단계 "측정 완료" 클릭

5단계 결과 화면에서 "결과 공유" 클릭 → 카카오톡/슬랙으로 공유

GPS 안정화란?​

기준점을 설정하면 앱이 자동으로 GPS 안정화를 수행합니다. 이 과정에서:

  1. 현재 위치의 GPS 신호를 수집하여 **드리프트(GPS가 튀는 정도)**를 측정합니다
  2. 칼만 필터를 초기화하고 현재 위치에 수렴시킵니다
  3. 드리프트 등급을 표시합니다:
드리프트등급의미
< 3m좋음 (녹색)GPS 상태 양호, 자동으로 측정 시작
3~8m보통 (노란)GPS가 약간 불안정, 진행 또는 재시도 선택
> 8m나쁨 (빨강)GPS가 매우 불안정, 실외 이동 권장 (진행도 가능)
정보

GPS가 나쁘다고 측정이 차단되지 않습니다. 이 앱의 목적은 GPS가 얼마나 불안정한지를 파악하는 것이므로, 경고를 확인하고 진행하면 됩니다.

측정 팁​

  • 안정화 중에는 움직이지 마세요 — 정확한 드리프트 측정을 위해
  • 기준점 재설정 시에도 안정화가 자동으로 다시 실행됩니다
  • GPS 정확도가 화면 상단에 표시됩니다
    • 녹색 (≤10m): 좋음
    • 노란색 (10~20m): 보통
    • 빨간색 (>20m): 낮음
  • 가능하면 창가나 출입구 근처에서 기준점을 설정하면 GPS 정확도가 올라갑니다

측정 결과 해석​

결과 화면 구성​

항목의미
지도 시각화기준점(파란) 중심으로 랩 포인트(주황) 분포, 녹색 점선이 추천 반경
최소/최대 거리기준점에서 GPS가 측정한 거리 범위
평균 거리전체 랩의 평균
추천 반경gpsRadiusMeters에 설정할 추천값
이상치극단적으로 튄 값은 자동 제외 (반투명 표시)

추천 반경 계산 방식​

추천 반경 = ceil((이상치 제거 후 최대 거리 + 평균 GPS 정확도) / 10) * 10
  • 이상치 제거: IQR(사분위 범위) 기반으로 극단값 자동 제외
  • GPS 정확도 마진: 측정 시점의 GPS 오차를 반경에 포함하여 안전마진 확보
  • 10m 단위 올림: 깔끔한 값으로 반올림

공유 형식 예시​

[GPS 반경 측정 결과]
2026. 03. 25. 14:30
기준점: 37.5665, 126.9780

[측정 기록]
#1 코트중앙
0.5m (정확도: 8m) 14:31:02
좌표: 37.566510, 126.978010

#2 입구
15.3m (정확도: 5m) 14:32:15
좌표: 37.566650, 126.978200

[요약]
최소: 0.5m / 최대: 15.3m / 평균: 7.9m
>> 추천 반경: 30m

gpsRadiusMeters 설정 기준​

앱의 추천 반경을 기본값으로 사용하되, 체육관 환경에 따라 조정합니다.

환경조정예시
실외 체육관 (축구장, 풋살장)추천 반경 그대로추천 30m → 설정 30m
실내 1층 (농구장, 배드민턴장)추천 반경 × 1.5추천 30m → 설정 50m
실내 고층/지하추천 반경 × 2~3추천 30m → 설정 60~100m
GPS 정확도가 매우 낮은 곳추천 반경 × 2~3 또는 IP 방식 전환 검토-
주의

gpsRadiusMeters가 너무 작으면 정상 사용자가 차단됩니다. 넉넉하게 설정하는 것이 안전합니다. 200m 이내라면 "체육관에 와 있다"고 충분히 판단할 수 있습니다.


GPS 한계와 주의사항​

GPS 정확도​

환경정확도설명
실외 (맑은 날)3~5m가장 정확, 측정에 적합
실내 1층10~20mWiFi/셀룰러 보조 위치 사용
실내 고층/지하20~50mGPS 신호 약함, 값이 크게 튈 수 있음

GPS 드리프트​

같은 자리에 서 있어도 GPS 좌표가 수 미터~수십 미터씩 변합니다. 이것은 정상이며, 이 앱은 칼만 필터로 드리프트를 최소화합니다.

이 앱의 한계​

  • 이 앱은 정밀 측정 도구가 아닙니다
  • "이 체육관에서 GPS가 얼마나 튀는지"를 파악하여 적절한 gpsRadiusMeters를 추천하는 가이드 도구입니다
  • 최종 설정값은 운영팀이 환경을 고려하여 판단합니다

기술 상세​

거리 계산​

Haversine 공식으로 두 GPS 좌표 간 대원 거리를 계산합니다. 서버의 GpsValidationUtil과 동일한 로직을 사용합니다.

지구 반지름: 6,371,000m (WGS84)
정확도: 체육관 크기(~100m) 범위에서 ±0.5%

칼만 필터​

GPS 측정값의 노이즈를 실시간으로 평활화합니다.

  • GPS 정확도(accuracy)가 나쁘면 → 이전 위치를 더 신뢰
  • GPS 정확도가 좋으면 → 새 측정값을 더 신뢰
  • 프로세스 노이즈: 2 m²/s (보행 속도 기반)

GPS 안정화 플로우​

기준점 설정/재설정/초기화 후 재설정 시 자동 실행됩니다.

  1. 칼만 필터 리셋 (이전 상태 초기화)
  2. GPS 좌표 수집 (0.5초 간격)
  3. 동적 완료 조건: 최소 3초 + 좌표 변화 2m 이내 수렴 (최대 10초 타임아웃)
  4. 드리프트 = 수집된 좌표들의 표준편차
  5. 등급 판정: 좋음(< 3m) / 보통(3~8m) / 나쁨(> 8m)

추천 반경 마진 계산​

margin = max(avgAccuracy, drift)
recommended = ceil((filteredMax + margin) / 10) * 10
  • avgAccuracy: 디바이스가 보고하는 GPS 정확도 평균
  • drift: 안정화에서 실측한 GPS 흔들림
  • 둘 다 더하면 과대 추정 → 보수적으로 큰 값만 사용

이상치 필터링 (IQR)​

  • 사분위 범위(IQR = Q3 - Q1) 기반
  • Q1 - 1.5×IQR ~ Q3 + 1.5×IQR 범위 밖의 값을 이상치로 판단
  • 데이터 4개 미만이면 필터링하지 않음
  • 이상치는 추천 반경 계산에서 제외되지만, 지도와 목록에는 반투명으로 표시

서버 연관 코드​

서버 GPS 검증: src/modules/recording/utils/gps-validation.util.ts
체육관별 반경: gym.gpsRadiusMeters (DB)
기본 반경: env GPS_DEFAULT_RADIUS_METERS (폴백)

FAQ​

Q: 실내에서 측정하면 정확한가요?​

GPS 정밀도는 떨어지지만, "이 건물 GPS가 얼마나 튀는지"를 파악하는 목적으로는 유효합니다. 튀는 정도를 알아야 적절한 반경을 설정할 수 있으니까요.

Q: 측정을 몇 번 해야 하나요?​

최소 5회 이상 권장합니다. 같은 자리에서 5회 + 경계 이동 34회 = 총 89회가 적당합니다.

Q: 추천 반경이 너무 크게 나와요​

GPS 정확도가 낮은 환경입니다. 추천값을 기준으로 설정하되, 실제 체육관 크기를 고려하여 조정하세요. 너무 크다면 IP 방식 전환을 검토하세요.

Q: 오프라인에서도 사용할 수 있나요?​

앱 자체는 오프라인에서 로딩 가능하지만 (PWA), GPS는 위성 신호가 필요합니다. 완전한 지하에서는 GPS 자체가 동작하지 않을 수 있습니다.

Q: 측정 데이터는 서버에 저장되나요?​

아닙니다. 모든 데이터는 기기 내에서만 처리되며 서버에 전송되지 않습니다. 결과는 공유 기능(텍스트 + 이미지)으로 전달합니다.