목차
KAILOS로 실내 지도와 위치 기반 서비스를 구축하세요. 1단계에서는 웹 지도 도구와 Android 수집 도구로 전파 지도를 만들고, 2단계에서는 KAILOS RESTful API로 애플리케이션을 개발합니다.
KAILOS 시스템 아키텍처
KAILOS는 실내 지도 구축 도구, 센서 데이터 수집 도구, 수집 서버, 위치 서버와 지도 서버를 통합하여 위치 기반 서비스 개발을 위한 편리한 환경을 제공합니다.
KAILOS는 서버 측에서 실행됩니다. 이는 시스템을 사용 및 유지 관리하기 쉽게 유지하고 시스템에 구축된 위치 기반 서비스를 가볍게 유지합니다.
실내 지도 제작 도구
- 평면 계획 도구
- POI 편집기
- 조사 계획 도구
- 경로망 편집기
센서 데이터 수집 도구
안드로이드 앱
데이터 수집 서버
- 원시 데이터 처리기
- 전파 지도 생성기
원시 데이터
위치 서버
입력: Wi-Fi · PDR · 기타 신호
- 신호 필터
- 위치 필터
- 맵 매칭
- 하이브리드 위치 제공자
지도 서버
- 디렉토리 서비스
- 경로 탐색 서비스
Maps
1단계: 전파 지도 구축
건물이나 층의 실내 지도를 제공하기 전에 해당 지역의 무선 지도를 구축해야 합니다. 아래 단계를 따르십시오. 관심 지점(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)과 정렬합니다.
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기층별 지도 추가
업로드를 클릭하고 준비된 바닥 평면도 이미지를 KAILOS 서버(그림 6)에 업로드합니다. 이미지는 건물 레이어(그림 7) 내부에 나타납니다.
지도 이미지 정렬을 클릭하여 실제 건물에 평면도를 배치합니다. 건물과 일치할 때까지 이미지를 이동, 크기 조정 및 회전합니다(그림 8–11).
정렬이 끝나면 건물과 층의 이름 및 정보를 입력하고 저장를 눌러 완료합니다(그림 12).
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기관심 지점(POI) 등록
다음으로 건물 내부의 관심 지점(POI)을 등록합니다(선택 사항). POI는 사무실, 계단, 화장실처럼 실내 내비게이션의 목적지가 될 수 있는 장소입니다.
지도 상단의 POI 버튼
를 클릭한 후 등록하려는 장소를 클릭하세요. 장소에 대한 입력 패널이 왼쪽 상단에 열립니다(그림 13). 해당 장소에 대한 정보를 입력하고 저장을 클릭한 후 손 버튼
를 클릭하면 POI(그림 14) 등록이 완료됩니다. 다른 장소도 같은 방법으로 등록하세요.
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기경로 등록
도로는 실내 위치 기반 애플리케이션의 사용자가 걸을 수 있는 경로이다. 도로 등록은 선택 사항이지만 애플리케이션이 구축되면 KAILOS 지도 매칭은 이를 사용하여 사용자의 위치를 보다 정확하게 표시합니다.
지도 상단의 도로 버튼
(그림 15)를 클릭하고 지도에서 도로가 운행되는 지점을 클릭합니다. 끝점을 두 번 클릭하여 도로를 완료한 다음(그림 16) 손 버튼
를 클릭하여 도로 모드를 종료합니다. 기존 도로에서 계속하려면
를 다시 클릭하고 계속 그립니다. 도로 교차로는 빨간색 점(그림 17)으로 표시됩니다.
신호 수집 계획
신호를 수집하기 전에 신호를 수집할 경로를 계획합니다. 다음 단계에서 수집자는 데이터 수집 도구를 사용하여 계획된 경로(측량선)를 따라 이동합니다. 이를 그리는 것은 도로를 등록하는 것과 매우 유사합니다.
먼저 도로가 방해가 되지 않도록 숨깁니다. 지도 오른쪽에 있는 레이어 버튼
를 클릭하여 레이어 표시 및 숨기기 메뉴를 열고 경로 확인란(그림 19)을 선택 취소합니다.
지도 상단의 측량 버튼
(그림 18)를 클릭하고 측량선의 시작점을 클릭합니다. 측량선은 시작점에서 여러 전환점을 거쳐 끝점까지 이어집니다. 끝점을 더블클릭하면 계획된 경로(그림 20–21)로 등록됩니다. 계획을 마치려면 손 버튼
를 클릭하세요.
여기에서 등록된 계획을 로드하는 데이터 수집 도구를 사용하여 계획된 경로를 따라 신호를 수집합니다.
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기신호 수집
데이터 수집 도구 설치 및 실행
스마트폰이나 태블릿(그림 22)과 같이 신호를 수집할 모바일 장치에 Android 데이터 수집 도구인 Walking Survey Collector를 설치합니다.
요구 사항
- 안드로이드 4.3 이상
- 무선랜(Wi-Fi) 모듈
- SD 카드
설치
WSTool.apk파일을 장치의 SD 카드에 있는 폴더에 복사합니다.- 기기의 파일 탐색기 앱으로 APK 파일을 여세요.
- 설치하다을 눌러 데이터 수집 도구를 설치하세요.
- 설치한 도구를 실행하세요.
사용 전에 로그인하세요. 첫 로그인 이후에는 도구 시작 시 자동으로 로그인됩니다. 로그아웃하려면 기기의 메뉴 버튼을 누르고 로그아웃을 선택하세요.
장치 구성
홈 화면에서 메뉴 → 설정를 열고 연결 탭의 Wi-Fi를 선택한 다음 메뉴 → 고급를 엽니다. 항상 스캔 허용을 켜세요(그림 23).
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기기본 보기
SURVEY LIST 탭. 웹 기반 지도 구축 도구에 등록된 층을 나열하는 탭입니다. 조사층 불러오기를 눌러 귀하의 ID로 등록된 층을 불러와 목록(그림 24–25)으로 보여주세요. 신호를 수집하려는 층을 탭하면 도구가 평면도와 등록된 측량선을 다운로드하여 장치에 저장하고 층의 수집 보기를 엽니다.
COLLECTING INFO 탭. SURVEY LIST 탭에서 선택한 층은 COLLECTING INFO 탭에 추가되고 해당 정보는 장치(그림 26)에 저장됩니다. 따라서 인터넷 연결(Wi-Fi, 3G 또는 4G) 없이도 해당 층의 수집 보기를 열 수 있습니다. 아래 3단계의 주의 2에서는 연결이 중요한 이유를 설명합니다. 또한 탭에는 층별 수집 내용(조사 라인(조사 경로) 수, 수집된 수)이 요약되어 있으며, 수집이 완료되면 데이터 보내기 버튼을 통해 수집된 데이터를 서버에 업로드합니다.
4단계로 데이터 수집
수집 보기에서는 평면도를 이동, 회전 및 확대/축소할 수 있습니다.
1단계 - 측량 계획을 확인합니다. 수집 보기에는 계획된 측량 라인(그림 27)과 함께 등록된 평면도가 표시됩니다. 바닥에는 웹 도구에 그려진 방식에 따라 하나 이상의 측량선이 있을 수 있습니다.
2단계 - 준비하고 방향을 확인합니다. 측량선을 선택합니다. 파란색으로 바뀌고 시작 위치와 끝 위치가 표시됩니다. 빨간색 삼각형은 시작점이고 빨간색 원은 끝점입니다(그림 28).
- 설문 정보는 선택된 측량 라인이 몇 번이나 수집되었는지를 보여줍니다. 자세한 내용을 보려면 탭하세요(아래 '수집된 데이터 확인' 참조).
- 수집 수집이 시작됩니다. 취소는 측량선 선택을 취소하고 이전 상태로 돌아갑니다.
3단계 - 수집 시작. 계획된 경로의 시작점(빨간색 삼각형)으로 이동하여 수집을 탭하고 편안하고 규칙적인 걸음으로 조사선을 따라 걷습니다. 종료 지점(빨간색 원)에 도달하면 수집 완료를 탭하세요.
수집 중 Wi-Fi·BLE 신호 세기와 3축 가속도계, 자이로스코프, 나침반, 기압계 데이터를 기록합니다. 수집… 화면에 진행 상태가 실시간 표시됩니다(그림 29). 평면도가 보기 어려우면 이동, 확대·축소 및 회전할 수 있습니다.
- 수집 취소는 진행 중인 수집을 취소합니다.
- 완전수집은 수집을 중단하고, 수집된 데이터를 디바이스에 저장하는 것입니다.
4단계 - 저장. 수집이 종료되면 수집된 데이터는 기기에 저장됩니다. 저장 중… 보기에는 각 데이터 유형(Wi-Fi, BLE 및 센서 데이터)에 대한 진행 상황이 표시되고 저장이 완료되면(그림 30) 완료가 표시됩니다.
수집된 데이터를 확인한다
Wi-Fi 스캔 또는 센서 샘플 수를 보려면 조사 정보를 누르세요. 경로별 수집 횟수와 각 수집의 세부 정보가 표시됩니다(그림 31). 잘못된 수집은 목록에서 선택하여 삭제하세요.
수집된 데이터는 언제 삭제해야 합니까? 예를 들어, 종료 지점에 도달하기 전에 실수로 수집 완료를 탭한 경우, 또는 수집기가 너무 빨리 걷거나 달렸던 경우 등이 있습니다. 너무 적은 Wi-Fi 스캔이 수집되면 좋은 라디오 맵이 생성될 가능성이 낮습니다. 데이터를 삭제하고 다시 수집하세요.
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기
— 원본 크기 이미지 열기수집 데이터를 KAILOS 서버로 업로드
계획대로 수집을 마치면 COLLECTING INFO 탭의 데이터 전송를 눌러 서버로 업로드합니다(그림 32–33). 성공하면 확인 메시지가 표시되고 수집 데이터가 장치에서 삭제됩니다(그림 34).
라디오 지도 완성
수집한 신호 및 센서 데이터를 KAILOS 서버로 전송한 후 라벨링을 실행하여 전파 지도를 완성합니다. 라벨링은 데이터를 분석하고 수집된 핑거프린트에 위치를 부여하여 실내 전파 지도를 자동으로 구축합니다.
등록한 조사 계획(조사 계획)을 선택한 다음 라벨링 창에서 라벨링을 선택합니다. 전파 지도가 완성됩니다(그림 35).
— 원본 크기 이미지 열기2단계: KAILOS API로 애플리케이션 개발
KAILOS는 실내 위치 기반 서비스 개발에 필요한 API를 RESTful 웹 서비스로 제공합니다. 경로는 KAILOS 서버 기준입니다. 프로젝트의 API 접근 권한과 서버 주소는 담당 팀에 문의하세요.
위치 API
위치 추정
POST/api/location
Wi-Fi 지문, BLE 스캔 및 위성 위치 확인 데이터로부터 사용자의 위치를 추정합니다.
매개변수
- data
- JSON은 아래와 같습니다.
{
"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
},
...
]
}{
"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은 아래와 같습니다.
{
"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.
GET /floors/554ff57ec900625812229172/image층의 POI를 얻는다
GET/pois/floor/{floorId}
층에 등록된 POI를 반환합니다. URL에 층 ID를 추가하세요. 응답은 JSON으로 파싱하는 문자열입니다.
매개변수
- floorId
- 층 ID.
GET /pois/floor/533107a2eff3417c12f357f9[
{
"_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, 원본 매뉴얼 참조)
// 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는 분류별로 정리된 다음 유형을 사용합니다.
| 카테고리 | 유형 |
|---|---|
| education |
|
| 비상사태 |
|
| store |
|
| facility |
|
| general |
|
| floorchange |
|
| etc |
|
건물의 바닥을 가져옵니다.
GET/floors/building/{buildingId}
건물의 층 목록을 반환합니다.
매개변수
- buildingId
- 건물 ID.
[
{
"_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
- 목적지 위도.
[
{
"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, 원본 매뉴얼 참조)
// 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은 아래와 같습니다.
{
"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)
}{
"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은 아래와 같습니다.
{
"queryType": "POI", // Query type [POI]
"keyword": "dongsoo" // Search keyword
}{
"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(문자열).
queryType: "GET_ROADS_BY_FLOORID"
floorId: "525cc3f8fd4be8314bc594c3"{
"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(문자열).
queryType: "FIND_PATH"
from: 127.3658898,36.3741702,525cc3f8fd4be8314bc594e7
to: 127.3658872,36.3741724,525cc3f8fd4be8314bc594e7{
"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로 처음 공개했습니다.













