본문 바로가기
KPT — 한국 측위 기술

제품 문서

KAILOS 매뉴얼

건물의 실내 지도 및 전파 지도를 구축한 후 KAILOS API를 사용하여 실내 위치 기반 서비스를 개발합니다.

KAILOS로 실내 지도와 위치 기반 서비스를 구축하세요. 1단계에서는 웹 지도 도구와 Android 수집 도구로 전파 지도를 만들고, 2단계에서는 KAILOS RESTful API로 애플리케이션을 개발합니다.

KAILOS 시스템 아키텍처

KAILOS는 실내 지도 구축 도구, 센서 데이터 수집 도구, 수집 서버, 위치 서버와 지도 서버를 통합하여 위치 기반 서비스 개발을 위한 편리한 환경을 제공합니다.

KAILOS는 서버 측에서 실행됩니다. 이는 시스템을 사용 및 유지 관리하기 쉽게 유지하고 시스템에 구축된 위치 기반 서비스를 가볍게 유지합니다.

실내 지도 제작 도구

  • 평면 계획 도구
  • POI 편집기
  • 조사 계획 도구
  • 경로망 편집기

센서 데이터 수집 도구

안드로이드 앱

데이터 수집 서버

  • 원시 데이터 처리기
  • 전파 지도 생성기

원시 데이터

위치 서버

입력: Wi-Fi · PDR · 기타 신호

  1. 신호 필터
  2. 위치 필터
  3. 맵 매칭
  4. 하이브리드 위치 제공자

지도 서버

  • 디렉토리 서비스
  • 경로 탐색 서비스

Maps

위치 기반 서비스
KAILOS 시스템 아키텍처. 지도 구성 및 데이터 수집 도구는 위치 서버에 대한 무선 지도를 생성하는 데이터 수집 서버에 데이터를 제공합니다. 위치 기반 서비스는 위치 서버와 지도 서버를 사용합니다.

1단계: 전파 지도 구축

건물이나 층의 실내 지도를 제공하기 전에 해당 지역의 무선 지도를 구축해야 합니다. 아래 단계를 따르십시오. 관심 지점(POI) 및 도로 등록은 선택 사항입니다.

  1. 단계 1건물 추가
  2. 단계 2층 추가
  3. 단계 3신호 수집 계획
  4. 단계 4신호 수집
  5. 단계 5전파지도 구축 완료
웹 지도 구축 단계. 층 추가 이후의 POI 및 경로 등록은 선택 사항입니다.

건물, 층 및 신호 수집 계획은 KAILOS 웹 기반 지도 구축 도구에 등록됩니다. 무선 지도에 대한 신호는 안드로이드 앱인 KAILOS 데이터 수집 도구로 수집되며, 결과는 테스트 내비게이션 앱으로 확인할 수 있습니다.

  • 웹 기반 지도 구축 도구건물, 평면도, POI, 도로 및 측량 계획 · 브라우저(Chrome)
  • 데이터 수집 도구Walking Survey Collector · Android 앱(WSTool.apk)
  • 내비게이션 테스트KAILOS Localization Tester · Android 앱(kailos-tester.apk)

귀하의 건물을 위한 도구에 대한 접근은 우리 팀과 함께 준비됩니다.

접근 권한 요청

웹 기반 지도 구축 도구

웹 기반 지도 구축 도구는 브라우저에서 실행됩니다. 컴퓨터에서 KAILOS 사이트를 열어 사용하세요.

최소 요구 사항

  • 인터넷 접속이 가능한 컴퓨터 또는 모바일 장치
  • HTML5 Canvas를 지원하는 브라우저
  • 표준 자바스크립트를 지원하는 브라우저

건물 추가

지도 구축 도구를 사용하려면 KAILOS에 로그인하세요. 로그인하지 않으면 다른 사용자가 만든 실내 지도를 볼 수 있지만 건물을 추가하거나 수정할 수는 없습니다.

로그인 후 도구를 열고 실내 위치 서비스를 제공하려는 건물로 지도를 이동합니다. 좌측 상단의 검색창에서는 주소나 이름으로 건물을 빠르게 찾아줍니다. 건물이 편안하게 작업할 수 있을 만큼 커 보일 때까지 확대합니다(그림 1).

건물 위에서 마우스 오른쪽 버튼을 클릭합니다(그림 2). 메뉴에서 건물 추가을 선택하면 새 건물 레이어가 표시됩니다. 상단 도구 모음의 건물 수정을 눌러 수정 모드로 들어갑니다(그림 3).

건물 수정 모드에서는 레이어 테두리의 점을 드래그하여 실제 건물의 윤곽선(그림 4–5)과 정렬합니다.

KAIST 캠퍼스를 확대한 지도 구축 도구. 왼쪽 위에는 건물 검색창, 오른쪽 위에는 등록된 건물 목록이 있습니다. — 원본 크기 이미지 열기
그림 1 건물을 찾아 확대하세요.
지도 건물의 오른쪽 클릭 메뉴. 건물, POI 또는 경로 추가 항목이 있습니다. — 원본 크기 이미지 열기
그림 2 건물을 오른쪽 클릭하고 Add a building을 선택하세요.
왼쪽에 건물 및 층 정보 패널이 있고 도구 모음에 강조 표시된 건물 수정 버튼이 있는 새 건물. — 원본 크기 이미지 열기
그림 3 건물 개조 모드로 들어갑니다.
건물 수정 모드: 새로운 건물 레이어는 테두리에 드래그 가능한 점이 있는 직사각형입니다. — 원본 크기 이미지 열기
그림 4 새 건물 레이어.
지도 건물 윤곽에 맞춰 이동하고 회전한 건물 레이어. — 원본 크기 이미지 열기
그림 5 레이어를 건물 윤곽선에 맞춰 정렬합니다.

층별 지도 추가

업로드를 클릭하고 준비된 바닥 평면도 이미지를 KAILOS 서버(그림 6)에 업로드합니다. 이미지는 건물 레이어(그림 7) 내부에 나타납니다.

지도 이미지 정렬을 클릭하여 실제 건물에 평면도를 배치합니다. 건물과 일치할 때까지 이미지를 이동, 크기 조정 및 회전합니다(그림 8–11).

정렬이 끝나면 건물과 층의 이름 및 정보를 입력하고 저장를 눌러 완료합니다(그림 12).

선택된 층에 대해 업로드할 평면도 이미지를 선택하기 위한 파일 대화상자. — 원본 크기 이미지 열기
그림 6 평면도 이미지를 업로드하세요.
건물 레이어 안에 작게 표시된 업로드 평면도. — 원본 크기 이미지 열기
그림 7 업로드한 평면도.
이미지 정렬 모드: 지도가 흐리게 표시되고 평면도 이미지에 이동, 크기 조정 및 회전을 위한 핸들이 표시됩니다. — 원본 크기 이미지 열기
그림 8 평면도 이미지를 정렬한다.
건물 위에서 확대하고 회전한 평면도 이미지. — 원본 크기 이미지 열기
그림 9 이미지 크기와 회전을 조정하세요.
지도 건물 윤곽에 맞게 정렬된 평면도. — 원본 크기 이미지 열기
그림 10 건물에 맞춰진 평면도.
지도에 정렬된 평면도와 상단 편집 도구 모음. — 원본 크기 이미지 열기
그림 11 정렬된 평면도.
저장하기 전에 정보 패널에 입력된 건물 및 층 이름과 설명. — 원본 크기 이미지 열기
그림 12 건물과 층의 이름을 입력한 후 저장하세요.

관심 지점(POI) 등록

다음으로 건물 내부의 관심 지점(POI)을 등록합니다(선택 사항). POI는 사무실, 계단, 화장실처럼 실내 내비게이션의 목적지가 될 수 있는 장소입니다.

지도 상단의 POI 버튼 를 클릭한 후 등록하려는 장소를 클릭하세요. 장소에 대한 입력 패널이 왼쪽 상단에 열립니다(그림 13). 해당 장소에 대한 정보를 입력하고 저장을 클릭한 후 손 버튼 를 클릭하면 POI(그림 14) 등록이 완료됩니다. 다른 장소도 같은 방법으로 등록하세요.

도구 모음에 강조 표시된 POI 등록 버튼이 있는 지도 구성 도구의 평면도. — 원본 크기 이미지 열기
그림 13 POI 등록을 시작하세요.
분류 목록이 열린 POI 정보 패널. 카페와 화장실 등 등록된 POI가 평면도에 아이콘으로 표시됩니다. — 원본 크기 이미지 열기
그림 14 POI 정보를 입력합니다.

경로 등록

도로는 실내 위치 기반 애플리케이션의 사용자가 걸을 수 있는 경로이다. 도로 등록은 선택 사항이지만 애플리케이션이 구축되면 KAILOS 지도 매칭은 이를 사용하여 사용자의 위치를 ​​보다 정확하게 표시합니다.

지도 상단의 도로 버튼 (그림 15)를 클릭하고 지도에서 도로가 운행되는 지점을 클릭합니다. 끝점을 두 번 클릭하여 도로를 완료한 다음(그림 16) 손 버튼 를 클릭하여 도로 모드를 종료합니다. 기존 도로에서 계속하려면 를 다시 클릭하고 계속 그립니다. 도로 교차로는 빨간색 점(그림 17)으로 표시됩니다.

도구 모음에 도로 등록 버튼이 강조 표시된 평면도. — 원본 크기 이미지 열기
그림 15 경로 등록을 시작하세요.
복도를 따라 점을 클릭하여 평면도에 도로를 그리는 방법. — 원본 크기 이미지 열기
그림 16 도로를 한 점씩 그립니다.
녹색으로 표시된 등록 경로망과 빨간 점으로 표시된 교차점. — 원본 크기 이미지 열기
그림 17 완성된 경로망.

신호 수집 계획

신호를 수집하기 전에 신호를 수집할 경로를 계획합니다. 다음 단계에서 수집자는 데이터 수집 도구를 사용하여 계획된 경로(측량선)를 따라 이동합니다. 이를 그리는 것은 도로를 등록하는 것과 매우 유사합니다.

먼저 도로가 방해가 되지 않도록 숨깁니다. 지도 오른쪽에 있는 레이어 버튼 를 클릭하여 레이어 표시 및 숨기기 메뉴를 열고 경로 확인란(그림 19)을 선택 취소합니다.

지도 상단의 측량 버튼 (그림 18)를 클릭하고 측량선의 시작점을 클릭합니다. 측량선은 시작점에서 여러 전환점을 거쳐 끝점까지 이어집니다. 끝점을 더블클릭하면 계획된 경로(그림 20–21)로 등록됩니다. 계획을 마치려면 손 버튼 를 클릭하세요.

여기에서 등록된 계획을 로드하는 데이터 수집 도구를 사용하여 계획된 경로를 따라 신호를 수집합니다.

도구 모음에 측량 계획 버튼이 강조 표시된 평면도. — 원본 크기 이미지 열기
그림 18 신호 수집 계획을 시작하세요.
경로망을 숨겨 조사 경로를 그릴 준비가 된 평면도. — 원본 크기 이미지 열기
그림 19 도로를 숨기세요.
시작점에서 전환점을 거쳐 끝점까지 파란색으로 그려진 측량선. — 원본 크기 이미지 열기
그림 20 측량선을 그립니다.
평면도의 두 조사 경로. 하나는 파란색, 하나는 빨간색입니다. — 원본 크기 이미지 열기
그림 21 해당 층에 필요한 만큼 조사 경로를 계획하세요.

신호 수집

데이터 수집 도구 설치 및 실행

스마트폰이나 태블릿(그림 22)과 같이 신호를 수집할 모바일 장치에 Android 데이터 수집 도구인 Walking Survey Collector를 설치합니다.

요구 사항

  • 안드로이드 4.3 이상
  • 무선랜(Wi-Fi) 모듈
  • SD 카드

설치

  1. WSTool.apk 파일을 장치의 SD 카드에 있는 폴더에 복사합니다.
  2. 기기의 파일 탐색기 앱으로 APK 파일을 여세요.
  3. 설치하다을 눌러 데이터 수집 도구를 설치하세요.
  4. 설치한 도구를 실행하세요.

사용 전에 로그인하세요. 첫 로그인 이후에는 도구 시작 시 자동으로 로그인됩니다. 로그아웃하려면 기기의 메뉴 버튼을 누르고 로그아웃을 선택하세요.

장치 구성

홈 화면에서 메뉴 → 설정를 열고 연결 탭의 Wi-Fi를 선택한 다음 메뉴 → 고급를 엽니다. 항상 스캔 허용을 켜세요(그림 23).

요청하는 권한을 나열하는 Walking Survey Collector 앱용 Android 설치 화면. — 원본 크기 이미지 열기
그림 22 데이터 수집 도구를 설치합니다.
항상 스캔 허용이 켜져 있는 Android 고급 Wi-Fi 설정. — 원본 크기 이미지 열기
그림 23 Always allow scanning을 켜세요.

기본 보기

SURVEY LIST 탭. 웹 기반 지도 구축 도구에 등록된 층을 나열하는 탭입니다. 조사층 불러오기를 눌러 귀하의 ID로 등록된 층을 불러와 목록(그림 24–25)으로 보여주세요. 신호를 수집하려는 층을 탭하면 도구가 평면도와 등록된 측량선을 다운로드하여 장치에 저장하고 층의 수집 보기를 엽니다.

COLLECTING INFO 탭. SURVEY LIST 탭에서 선택한 층은 COLLECTING INFO 탭에 추가되고 해당 정보는 장치(그림 26)에 저장됩니다. 따라서 인터넷 연결(Wi-Fi, 3G 또는 4G) 없이도 해당 층의 수집 보기를 열 수 있습니다. 아래 3단계의 주의 2에서는 연결이 중요한 이유를 설명합니다. 또한 탭에는 층별 수집 내용(조사 라인(조사 경로) 수, 수집된 수)이 요약되어 있으며, 수집이 완료되면 데이터 보내기 버튼을 통해 수집된 데이터를 서버에 업로드합니다.

층을 불러오기 전 Walking Survey Collector의 SURVEY LIST 탭. 하단에 Load survey floors 버튼이 있습니다. — 원본 크기 이미지 열기
그림 24 SURVEY LIST 탭.
N1 7F, N24 B1, E11 5F 등 수집할 등록 층을 나열한 SURVEY LIST 탭. — 원본 크기 이미지 열기
그림 25 웹 도구에서 로드된 바닥.
저장된 층 ISI Lab N1 7F, 수집된 조사 경로 수 및 데이터 보내기 버튼을 표시하는 정보 수집 탭입니다. — 원본 크기 이미지 열기
그림 26 정보 수집 탭.

4단계로 데이터 수집

수집 보기에서는 평면도를 이동, 회전 및 확대/축소할 수 있습니다.

1단계 - 측량 계획을 확인합니다. 수집 보기에는 계획된 측량 라인(그림 27)과 함께 등록된 평면도가 표시됩니다. 바닥에는 웹 도구에 그려진 방식에 따라 하나 이상의 측량선이 있을 수 있습니다.

2단계 - 준비하고 방향을 확인합니다. 측량선을 선택합니다. 파란색으로 바뀌고 시작 위치와 끝 위치가 표시됩니다. 빨간색 삼각형은 시작점이고 빨간색 원은 끝점입니다(그림 28).

  • 설문 정보는 선택된 측량 라인이 몇 번이나 수집되었는지를 보여줍니다. 자세한 내용을 보려면 탭하세요(아래 '수집된 데이터 확인' 참조).
  • 수집 수집이 시작됩니다. 취소는 측량선 선택을 취소하고 이전 상태로 돌아갑니다.

3단계 - 수집 시작. 계획된 경로의 시작점(빨간색 삼각형)으로 이동하여 수집을 탭하고 편안하고 규칙적인 걸음으로 조사선을 따라 걷습니다. 종료 지점(빨간색 원)에 도달하면 수집 완료를 탭하세요.

수집 중 Wi-Fi·BLE 신호 세기와 3축 가속도계, 자이로스코프, 나침반, 기압계 데이터를 기록합니다. 수집… 화면에 진행 상태가 실시간 표시됩니다(그림 29). 평면도가 보기 어려우면 이동, 확대·축소 및 회전할 수 있습니다.

  • 수집 취소는 진행 중인 수집을 취소합니다.
  • 완전수집은 수집을 중단하고, 수집된 데이터를 디바이스에 저장하는 것입니다.

4단계 - 저장. 수집이 종료되면 수집된 데이터는 기기에 저장됩니다. 저장 중… 보기에는 각 데이터 유형(Wi-Fi, BLE 및 센서 데이터)에 대한 진행 상황이 표시되고 저장이 완료되면(그림 30) 완료가 표시됩니다.

수집된 데이터를 확인한다

Wi-Fi 스캔 또는 센서 샘플 수를 보려면 조사 정보를 누르세요. 경로별 수집 횟수와 각 수집의 세부 정보가 표시됩니다(그림 31). 잘못된 수집은 목록에서 선택하여 삭제하세요.

수집된 데이터는 언제 삭제해야 합니까? 예를 들어, 종료 지점에 도달하기 전에 실수로 수집 완료를 탭한 경우, 또는 수집기가 너무 빨리 걷거나 달렸던 경우 등이 있습니다. 너무 적은 Wi-Fi 스캔이 수집되면 좋은 라디오 맵이 생성될 가능성이 낮습니다. 데이터를 삭제하고 다시 수집하세요.

계획된 측량선이 빨간색으로 표시된 평면도를 모아 놓은 뷰입니다. — 원본 크기 이미지 열기
그림 27 1단계: 조사 계획 확인.
시작 부분에 빨간색 삼각형이 있고 끝 부분에 빨간색 원이 있는 파란색으로 강조 표시된 선택된 조사 선, 조사 정보 패널 및 수집 버튼이 있습니다. — 원본 크기 이미지 열기
그림 28 2단계: 조사 경로 선택.
수집 진행 중: 수집 취소 및 수집 완료 버튼이 있는 Wi-Fi, BLE 및 센서 판독값에 대한 라이브 카운터. — 원본 크기 이미지 열기
그림 29 3단계: 수집.
데이터 유형별 저장 상태를 COMPLETE 또는 백분율로 표시하는 화면. — 원본 크기 이미지 열기
그림 30 4단계: 저장.
조사 라인에 대해 수집된 Wi-Fi 스캔 수와 센서 샘플을 나열하는 세부 조사 정보입니다. — 원본 크기 이미지 열기
그림 31 상세한 조사 정보.

수집 데이터를 KAILOS 서버로 업로드

계획대로 수집을 마치면 COLLECTING INFO 탭의 데이터 전송를 눌러 서버로 업로드합니다(그림 32–33). 성공하면 확인 메시지가 표시되고 수집 데이터가 장치에서 삭제됩니다(그림 34).

수집 후 정보 수집(COLLECTING INFO) 탭은 수집되어 전송할 준비가 된 하나의 조사 경로 중 하나를 표시합니다. — 원본 크기 이미지 열기
그림 32 전송 준비 완료.
수집한 경로를 서버로 전송하는 진행 상황을 보여 주는 업로드 창. — 원본 크기 이미지 열기
그림 33 서버에 업로드 중.
데이터가 서버로 전송되었으며 수집된 데이터가 장치에서 삭제되었음을 확인합니다. — 원본 크기 이미지 열기
그림 34 업로드 완료.

라디오 지도 완성

수집한 신호 및 센서 데이터를 KAILOS 서버로 전송한 후 라벨링을 실행하여 전파 지도를 완성합니다. 라벨링은 데이터를 분석하고 수집된 핑거프린트에 위치를 부여하여 실내 전파 지도를 자동으로 구축합니다.

등록한 조사 계획(조사 계획)을 선택한 다음 라벨링 창에서 라벨링을 선택합니다. 전파 지도가 완성됩니다(그림 35).

지도 구축 도구의 조사 계획 화면. 라벨링 목록이 열려 있고 수집한 조사 경로가 평면도에 표시됩니다. — 원본 크기 이미지 열기
그림 35 라벨링을 실행해 전파 지도를 완성하세요.

내비게이션 테스트

전파 지도가 완성되면 KAILOS 위치 추정 API로 위치를 추적할 수 있습니다. Android 테스트 앱인 KAILOS Localization Tester는 추가한 지도 위에 API의 추정 위치를 표시합니다.

요구 사항

  • 안드로이드 4.0 이상
  • 무선랜(Wi-Fi) 모듈
  • SD 카드
  • 10 MB의 여유 공간

설치

  1. 앱 패키지 kailos-tester.apk를 다운로드하세요.
  2. APK 파일을 기기의 SD 카드에 있는 폴더에 복사합니다.
  3. 기기의 파일 탐색기 앱으로 APK 파일을 여세요.
  4. 설치하다을 눌러 내비게이션 테스트 앱을 설치하세요.
  5. 설치한 앱을 실행하세요.

앱 사용

앱은 기능이 적고 직관적입니다. 모바일 지도 앱에 익숙하다면 이 부분을 건너뛰어도 됩니다. 시작하면 지도가 표시됩니다(그림 36). 오른쪽 위의 두 버튼으로 위치 추적을 제어합니다:

  • 위치 추적 버튼 은 추적을 시작하거나 중지합니다. 시작하면 추정 위치가 지도에 표시됩니다(그림 37).
  • 마커 버튼 은 지도를 추정 위치로 이동·확대하며 이후 마커가 이동을 따라갑니다(그림 38).

도움말을 열려면 메뉴 버튼을 누르거나 화면 왼쪽 가장자리에서 스와이프한 뒤 도움말를 선택하세요(그림 39).

오른쪽 상단에 트랙 위치와 마커 버튼이 있는 캠퍼스 지도를 보여주는 KAILOS 지역화 테스터. — 원본 크기 이미지 열기
그림 36 앱 시작 시 지도.
위치 추적이 켜진 상태: 추정 위치가 KAILOS 마커로 표시됩니다. — 원본 크기 이미지 열기
그림 37 위치 추적 켜짐.
N1 7F 평면도의 추정 위치를 확대한 지도. 마커 주변에 정확도 원이 표시됩니다. — 원본 크기 이미지 열기
그림 38 현재 위치에 초점을 맞췄다.
왼쪽 가장자리에서 연 앱 메뉴의 Help 항목. — 원본 크기 이미지 열기
그림 39 메뉴에서 Help를 여세요.

2단계: KAILOS API로 애플리케이션 개발

KAILOS는 실내 위치 기반 서비스 개발에 필요한 API를 RESTful 웹 서비스로 제공합니다. 경로는 KAILOS 서버 기준입니다. 프로젝트의 API 접근 권한과 서버 주소는 담당 팀에 문의하세요.

위치 API

위치 추정

POST/api/location

Wi-Fi 지문, BLE 스캔 및 위성 위치 확인 데이터로부터 사용자의 위치를 ​​추정합니다.

매개변수

data
JSON은 아래와 같습니다.
요청 · dataJSON
{
  "wifi": [ // Fingerprint (list of AP scans)
    {
      "bssid": "00:26:66:2f:43:60", // BSSID
      "rss": -80, // RSS
      "ssid": "Welcome-KAIST" // SSID (optional)
    },
    ...
  ],
  "ble": [ // BLE fingerprint (scan result over one second)
    {
      "bssid": "00:26:66:2f:43:61",
      "rss": -85,
      "device_name": "myPhone" // (optional)
    },
    ...
  ],
  "gps": [
    {
      "lng": 100.0, // Longitude
      "lat": 100.0, // Latitude
      "acc": 0.0, // Accuracy
      "alt": 0.0, // Altitude
      "bear": 0.0, // Bearing
      "elap": 0.0, // Elapsed real-time nanos
      "speed": 0.0, // Speed
      "time": 0.0 // Time
    },
    ...
  ]
}
응답JSON
{
  "lnglat": { // GeoJSON format
    type: "Point", // GeoJSON Point type
    coordinate: [100.0, 100.0] // GeoJSON coordinate: [lng, lat] (WGS-84)
  },
  "alt": 45.0000, // Altitude (optional)
  "level": 7, // Level number
  "floorID": 9, // Floor map ID
  "bd": "N1", // Building code (optional)
  "err": 6.7 // Position error (optional)
}

조사 데이터 업데이트

POST/api/db/updateSurveyData

알려진 위치의 액세스 포인트 스캔인 Wi-Fi 조사 데이터를 전파 지도 데이터베이스에 업로드합니다.

매개변수

data
JSON은 아래와 같습니다.
요청 · dataJSON
{
  "wifiList": [
    {
      "apList": [
        {
          "ssid": "isiLab",
          "bssid": "00:26:66:2f:43:60",
          "rssi": -89
        },
        ...
      ],
      "lng": 127.36534260538609,
      "lat": 36.374168514955834,
      "level": 7, // Building floor
      "bd": "N1", // Building name
      "floorID": 9 // Unique floor ID
    },
    ...
  ]
}

응답 HTTP 상태 코드.

지도 API

층 지도 조회

GET/floors/{floorId}/image

층의 평면도 이미지를 반환합니다.

매개변수

floorId
층 ID.
요청 · 예시HTTP
GET /floors/554ff57ec900625812229172/image

층의 POI를 얻는다

GET/pois/floor/{floorId}

층에 등록된 POI를 반환합니다. URL에 층 ID를 추가하세요. 응답은 JSON으로 파싱하는 문자열입니다.

매개변수

floorId
층 ID.
요청 · 예시HTTP
GET /pois/floor/533107a2eff3417c12f357f9
응답JSON
[
  {
    "_id": "54866f6c32c4250829314146", // POI ID
    "category": "prof", // POI category
    "floorId": "533107a2eff3417c12f357f9", // Floor ID
    "geometry": { // Location as GeoJSON
      "type": "Point",
      "coordinates": [127.36565597355366, 36.37398342955928]
    },
    "name": "한동수 Demo", // POI name
    "level": "3", // Zoom level of the POI (importance)
    "roomNumber": "704", // Room number
    "zoomEnd": 30, // Not used
    "zoomStart": 15, // Not used
    "userId": "5322d496285a9bfc0537539f", // ID of the user who registered the POI
    "regTime": "1418096492643", // Registration timestamp
    "description": "DongSoo Han - Demo" // Description
  },
  {
    "_id": "54c95ac0bed48ea802d0ddb8",
    "category": "elevator",
    "floorId": "533107a2eff3417c12f357f9",
    "geometry": {
      "type": "Point",
      "coordinates": [127.36574783921242, 36.3740876309574]
    },
    "name": "",
    "level": "3",
    "roomNumber": "",
    "zoomEnd": 30,
    "zoomStart": 15,
    "userId": "5322d496285a9bfc0537539f",
    "regTime": 1422482112074,
    "description": ""
  },
  ...
  {
    "_id": "551a582f65ea1154059b0a11",
    "category": "lab",
    "floorId": "533107a2eff3417c12f357f9",
    "geometry": {
      "type": "Point",
      "coordinates": [127.3655292391777, 36.37419723124106]
    },
    "name": "ISILab",
    "level": "3",
    "roomNumber": "723",
    "zoomEnd": 30,
    "zoomStart": 15,
    "userId": "5322d496285a9bfc0537539f",
    "regTime": 1427789871625,
    "description": "ISILab"
  }
]
Android 예(Java, 원본 매뉴얼 참조)
예시 · Android 예(Java, 원본 매뉴얼 참조)자바
// KAILOS_SERVER: the address of your KAILOS server.
public class PoiRestThread extends Thread {
    private static String TAG = "PoiRestThread";
    public static boolean isThreadWorking = false;

    private String mFloorId;

    public PoiRestThread() {
    }

    public void setRequestFloorId(String floorId) {
        mFloorId = floorId;
    }

    public void start() {
        isThreadWorking = true;
        super.start();
    }

    // Requests the POIs of a floor, parses the JSON response and notifies a handler.
    public void run() {
        ArrayList poiList = null;

        try {
            String strRequestURL = KAILOS_SERVER + "/pois/floor/" + mFloorId;

            HttpGet httpGet = new HttpGet(strRequestURL);

            HttpParams httpParameters = new BasicHttpParams();
            HttpConnectionParams.setConnectionTimeout(httpParameters, Constants.SOCKET_TIME_OUT_MS * 2);
            HttpConnectionParams.setSoTimeout(httpParameters, Constants.SOCKET_TIME_OUT_MS);

            DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
            ClientConnectionManager clientConnectionManager = httpClient.getConnectionManager();
            httpClient = new DefaultHttpClient(
                new ThreadSafeClientConnManager(httpParameters, clientConnectionManager.getSchemeRegistry()),
                httpParameters);
            ResponseHandler responseHandler = new BasicResponseHandler();

            String strResponse = httpClient.execute(httpGet, responseHandler);

            if (strResponse != null && !strResponse.equals("null")) {
                Log.i(TAG, strResponse);
                // The POIs of the floor were retrieved.
            }
        } catch (Exception e) {
            // Exceptions such as time-outs are ignored.
        }
    }
}

카테고리별로 층의 POI를 가져옵니다.

GET/pois/floor/{floorId}/{categoryType}

층의 POI 조회와 동일하되 아래 목록의 분류 유형을 URL에 추가합니다. 응답 형식은 동일합니다.

매개변수

floorId
층 ID.
categoryType
POI 분류 유형(예: elevator).

POI 분류

POI는 분류별로 정리된 다음 유형을 사용합니다.

POI 분류 및 유형
카테고리유형
education
  • prof
  • seminar
  • researcher
  • lab
  • studyroom
비상사태
  • call
  • hydrant
  • fireextinguisher
  • firstaidkit
store
  • hair
  • cafe
  • bread
  • restaurant
facility
  • cctv
  • nfc
  • qr
  • Bluetooth
  • wifi
  • temperaturesensor
  • motionsensor
  • light
  • firsensor
  • basestation
general
  • atm
  • postoffice
  • resting
  • sport
  • shower
  • watersupply
  • wash
  • restroom
  • office
floorchange
  • 계단
  • elevator
  • escalator
etc
  • storehouse
  • memorial
  • vendingmachine
  • etc

건물의 바닥을 가져옵니다.

GET/floors/building/{buildingId}

건물의 층 목록을 반환합니다.

매개변수

buildingId
건물 ID.
응답JSON
[
  {
    "_id": "5403e318b11b008c1406a646",
    "buildingId": "5403e318b11b008c1406a645",
    "description": "1",
    "floorNumber": 1,
    "floorPlanType": "image/png",
    "geometry": {
      "type": "Polygon",
      "coordinates": [
        ["127.3662497", "36.3745616"],
        ["127.3650642", "36.3740173"]
      ],
      "angle": "0"
    },
    "name": "1",
    "regTime": "1409540888640",
    "userId": "5322d496285a9bfc0537539f",
    "zoomEnd": "28",
    "zoomStart": "15"
  },
  {
    "_id": "5403e5d7b11b008c1406a647",
    "buildingId": "5403e318b11b008c1406a645",
    "description": "2",
    "floorNumber": 2,
    "floorPlanType": "image/png",
    "geometry": {
      "type": "Polygon",
      "coordinates": [
        ["127.36624958772654", "36.37456190071682"],
        ["127.36512807350164", "36.374028005943565"]
      ],
      "angle": "0.00"
    },
    "name": "2",
    "regTime": "1409541591516",
    "userId": "5322d496285a9bfc0537539f",
    "zoomEnd": "28",
    "zoomStart": "15"
  }
]

경로 API

경로 찾기

POST/routes

실내 또는 실외의 두 지점 사이의 내비게이션 경로를 찾습니다. 응답은 JSON으로 구문 분석하는 문자열입니다. 경로는 세그먼트 목록입니다.

본문(application/x-www-form-urlencoded)

startFloorId
실내인 경우 시작점의 층 ID; 실외에 있는 경우 빈 문자열입니다.
startX
출발점 경도.
startY
출발점 위도.
endFloorId
목적지가 실내인 경우, 목적지의 층 ID; 실외에 있는 경우 빈 문자열입니다.
endX
목적지 경도.
endY
목적지 위도.
응답JSON
[
  {
    "lng1": 127.36141960240502, // Longitude of the segment start
    "lat1": 36.370199561212004, // Latitude of the segment start
    "lng2": 127.36141960240502, // Longitude of the segment end
    "lat2": 36.370199561212004, // Latitude of the segment end
    "type": "OUT" // Segment type: OUT = outdoor, IN_OUT = indoor-outdoor connection, IN = indoor
  },
  ...
  {
    "lng1": 127.36456921426938,
    "lat1": 36.37411861283401,
    "lng2": 127.36458644270897,
    "lat2": 36.37414054145845,
    "type": "IN_OUT"
  },
  {
    "lng1": 127.36458644270897,
    "lat1": 36.37414054145845,
    "lng2": 127.36458644270897,
    "lat2": 36.37414054145845,
    "type": "IN",
    "floorNumber": 100, // Floor number of an indoor segment
    "floorId": "5493d972eb4b45d42d777720", // Floor ID
    "buildingId": "5403e318b11b008c1406a645" // ID of the building the floor belongs to
  },
  ...
]
Android 예(Java, 원본 매뉴얼 참조)
예시 · Android 예(Java, 원본 매뉴얼 참조)자바
// KAILOS_SERVER: the address of your KAILOS server.
package kr.ac.kaist.isilab.kai_navi.route;

import java.util.ArrayList;
import java.util.List;

import kr.ac.kaist.isilab.kai_navi.utils.Constants;

import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

import android.content.Context;
import android.util.Log;

public class RouteRestThread extends Thread {
    private static String TAG = "RouteRestThread";
    public static DefaultHttpClient mHttpClient = null;
    private static Context mContext = null;

    private String mStartFloorId = "";
    private Double mStartLng = 127.36561;
    private Double mStartLat = 36.374101;

    private String mEndFloorId = "";
    private Double mEndLng = 127.36561;
    private Double mEndLat = 36.374101;

    public static void createHttpClient() {
        HttpParams httpParameters = new BasicHttpParams();
        HttpConnectionParams.setConnectionTimeout(httpParameters, 20000);
        HttpConnectionParams.setSoTimeout(httpParameters, 10000);

        mHttpClient = new DefaultHttpClient(httpParameters);
        ClientConnectionManager clientConnectionManager = mHttpClient.getConnectionManager();
        mHttpClient = new DefaultHttpClient(
            new ThreadSafeClientConnManager(httpParameters, clientConnectionManager.getSchemeRegistry()),
            httpParameters);
    }

    public void setContext(Context context) {
        mContext = context;
    }

    public RouteRestThread() {
    }

    public void setRequestData(Double startLng, Double startLat, String startFloorId,
                               Double endLng, Double endLat, String endFloorId) {
        mStartFloorId = startFloorId;
        mStartLng = startLng;
        mStartLat = startLat;
        mEndFloorId = endFloorId;
        mEndLng = endLng;
        mEndLat = endLat;
    }

    @Override
    public void start() {
        super.start();
    }

    @Override
    public void run() {
        try {
            String strServerURL = KAILOS_SERVER + "/routes";

            if (mHttpClient == null)
                createHttpClient();

            HttpPost httpPost = new HttpPost(strServerURL);
            httpPost.setHeader("Accept", "application/json");
            httpPost.setHeader("Accept-Language", "ko_KR");
            httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

            List pairs = new ArrayList();
            pairs.add(new BasicNameValuePair("startX", mStartLng.toString()));
            pairs.add(new BasicNameValuePair("startY", mStartLat.toString()));
            pairs.add(new BasicNameValuePair("startFloorId", mStartFloorId));
            pairs.add(new BasicNameValuePair("endX", mEndLng.toString()));
            pairs.add(new BasicNameValuePair("endY", mEndLat.toString()));
            pairs.add(new BasicNameValuePair("endFloorId", mEndFloorId));

            httpPost.setEntity(new UrlEncodedFormEntity(pairs));

            ResponseHandler responseHandler = new BasicResponseHandler();
            String strResponse = mHttpClient.execute(httpPost, responseHandler);

            if (strResponse != null && !strResponse.equals("null")) {
                Log.i(TAG, strResponse);
                // The route was retrieved.
            }
        } catch (Exception e) {
            Log.e(TAG, e.getMessage());
        }
    }
}

이전 엔드포인트

원본 매뉴얼의 영문판에는 모든 쿼리를 /api/map/…에 POST로 보내는 이전 Map 및 Route API가 설명되어 있습니다. 기존 통합을 위해 여기에 제공합니다.

이전 Map 및 Route 엔드포인트 보기

층 지도 조회

POST/api/map/getFloorMaps

매개변수

data
JSON은 아래와 같습니다.
요청 · dataJSON
{
  "queryType": "NEAREST_ENTIRE", // Query type [NEAREST_ENTIRE | NEAREST_REPRESENTATIVE | FLOOR_ID]
  "lng": "100.0", // Longitude (used for NEAREST_ENTIRE, NEAREST_REPRESENTATIVE)
  "lat": "101.0", // Latitude (used for NEAREST_ENTIRE, NEAREST_REPRESENTATIVE)
  "floorID": "1234" // Floor ID (used for FLOOR_ID)
}
응답JSON
{
  "floormaps": [
    {
      "objID": 14,
      "neLat": 36.374393463134766,
      "neLng": 127.36409759521484,
      "swLat": 36.373573303222656,
      "swLng": 127.36292266845703,
      "angle": 0,
      "areaID": 1,
      "buildingID": 15,
      "floorID": 12,
      "category": "IMG",
      "memberID": 1,
      "floorName": "N5 2F",
      "floorNumber": 2,
      "buildingName": "N5 기초과학연구동",
      "floorNumberBase": 2,
      "areaName": "KAIST 한국과학기술원",
      "imageURL": "uploads/1____1377087116.png"
    },
    ...
  ]
}

POI 가져오기

POST/api/map/directory

매개변수

data
JSON은 아래와 같습니다.
요청 · dataJSON
{
  "queryType": "POI", // Query type [POI]
  "keyword": "dongsoo" // Search keyword
}
응답JSON
{
  "poi": [
    {
      "_id": "525cc557fd4be8314bc5951d",
      "floorId": "525cc3f8fd4be8314bc594e7",
      "name": {
        "kr": "한동수",
        "en": "Dongsoo Han"
      },
      "category": "prof",
      "roomNumber": "814",
      "visibleZoomStart": 19,
      "visibleZoomEnd": 30,
      "geometry": {
        "type": "POINT",
        "coordinates": [[127.3660891, 36.3740404]]
      },
      "memberId": "1"
    },
    {
      "_id": "525cc557fd4be8314bc5952b",
      "floorId": "525cc3f8fd4be8314bc594e5",
      "name": {
        "kr": "한동수",
        "en": "Dongsoo Han"
      },
      "category": "prof",
      "roomNumber": "704",
      "visibleZoomStart": 19,
      "visibleZoomEnd": 30,
      "geometry": {
        "type": "POINT",
        "coordinates": [[127.365545, 36.3740436]]
      },
      "memberId": "1"
    }
  ]
}

층의 도로망을 구한다

POST/api/map/route

매개변수

queryType
GET_ROADS_BY_FLOORID
floorId
층 ID(문자열).
요청 · 예시HTTP
queryType: "GET_ROADS_BY_FLOORID"
floorId: "525cc3f8fd4be8314bc594c3"
응답JSON
{
  "road": [
    [
      [127.363031, 36.37373, "525cc3f8fd4be8314bc594c3"],
      [127.363031, 36.37373, "525cc3f8fd4be8314bc594c9"]
    ],
    [
      [127.363017, 36.374319, "525cc3f8fd4be8314bc594c3"],
      [127.363017, 36.374319, "525cc3f8fd4be8314bc594ca"]
    ],
    [
      [127.363018, 36.37432, "525cc3f8fd4be8314bc594c3"],
      [127.363018, 36.37432, "525cc3f8fd4be8314bc594c9"]
    ]
  ]
}

최단 경로 찾기

POST/api/map/route

매개변수

queryType
FIND_PATH
from
출발점: 경도, 위도, 층 ID(문자열).
to
목적지: 경도, 위도, 층 ID(문자열).
요청 · 예시HTTP
queryType: "FIND_PATH"
from: 127.3658898,36.3741702,525cc3f8fd4be8314bc594e7
to: 127.3658872,36.3741724,525cc3f8fd4be8314bc594e7
응답JSON
{
  "path": [
    [127.3658872, 36.3741724, "525cc3f8fd4be8314bc594e7"],
    [127.3658872, 36.3741238, "525cc3f8fd4be8314bc594e7"],
    [127.3658872, 36.3740968, "525cc3f8fd4be8314bc594e7"],
    [127.3658858, 36.3740579, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3740557, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3740795, "525cc3f8fd4be8314bc594e7"],
    [127.3661031, 36.3741724, "525cc3f8fd4be8314bc594e7"]
  ]
}

API 지원

KAILOS 및 해당 API 사용에 대한 질문이 있거나 추가 API에 대한 요청이 있는 경우 당사 팀에 문의하세요.

팀에 문의하기

KAIST 지능형 서비스 통합 연구실이 kailos.io에 KAILOS Manual로 처음 공개했습니다.

실내 위치 확인을 귀하의 환경으로 가져옵니다.

건물, 필요한 범위, 사용자 및 목표 애플리케이션을 알려 주세요.

KAILOS에 대해 토론하세요.