Nội dung
Dùng KAILOS tạo bản đồ trong nhà và dịch vụ vị trí của bạn. Bước 1 xây dựng bản đồ vô tuyến bằng công cụ bản đồ web và ứng dụng thu thập Android; Bước 2 phát triển ứng dụng với KAILOS RESTful API.
Kiến trúc hệ thống KAILOS
Hệ thống định vị trong nhà KAILOS kết hợp công cụ xây dựng bản đồ, thu thập cảm biến, máy chủ thu thập, máy chủ vị trí và máy chủ bản đồ, tạo môi trường phát triển thuận tiện cho dịch vụ vị trí.
KAILOS hoạt động phía máy chủ, giúp hệ thống dễ sử dụng, bảo trì và giữ các dịch vụ vị trí xây dựng trên đó gọn nhẹ.
Công cụ xây dựng bản đồ trong nhà
- Công cụ lập kế hoạch tầng
- Trình chỉnh sửa POI
- Công cụ lập kế hoạch khảo sát
- Trình chỉnh sửa mạng đường
Công cụ thu thập dữ liệu cảm biến
Ứng dụng Android
Máy chủ thu thập dữ liệu
- Bộ xử lý dữ liệu thô
- Bộ tạo bản đồ vô tuyến
Dữ liệu thô
Máy chủ vị trí
Đầu vào: Wi-Fi · PDR · tín hiệu khác
- Bộ lọc tín hiệu
- Bộ lọc vị trí
- Đối sánh bản đồ
- Bộ cung cấp vị trí kết hợp
Máy chủ bản đồ
- Dịch vụ danh mục
- Dịch vụ tìm đường
Maps
Bước 1: Xây dựng bản đồ vô tuyến
Trước khi cung cấp bản đồ trong nhà cho một tòa nhà hoặc tầng, cần xây dựng bản đồ vô tuyến của khu vực đó. Thực hiện các bước dưới đây; đăng ký điểm quan tâm (POI) và đường đi là tùy chọn.
- Bước 1Thêm tòa nhà
- Bước 2Thêm tầng
- Bước 3Lập kế hoạch thu thập tín hiệu
- Bước 4Thu thập tín hiệu
- Bước 5Hoàn thành xây dựng bản đồ vô tuyến
Tòa nhà, tầng và kế hoạch thu thập tín hiệu được đăng ký bằng công cụ xây dựng bản đồ KAILOS trên web. Công cụ thu thập dữ liệu KAILOS trên Android thu tín hiệu cho bản đồ vô tuyến; kết quả có thể kiểm tra bằng ứng dụng dẫn đường thử nghiệm.
- Công cụ xây dựng bản đồ webTòa nhà, sơ đồ tầng, POI, đường đi và kế hoạch khảo sát — trình duyệt (Chrome)
- Công cụ thu thập dữ liệuWalking Survey Collector · Ứng dụng Android (WSTool.apk)
- Thử dẫn đườngKAILOS Localization Tester · Ứng dụng Android (kailos-tester.apk)
Hãy liên hệ nhóm của chúng tôi để được cấp quyền truy cập công cụ cho tòa nhà của bạn.
Yêu cầu truy cậpCông cụ xây dựng bản đồ web
Công cụ xây dựng bản đồ web chạy trong trình duyệt: mở website KAILOS trên máy tính để sử dụng.
Yêu cầu tối thiểu
- Máy tính hoặc thiết bị di động có kết nối internet
- Trình duyệt hỗ trợ HTML5 Canvas
- Trình duyệt hỗ trợ JavaScript tiêu chuẩn
Thêm tòa nhà
Đăng nhập KAILOS để dùng công cụ xây dựng bản đồ. Chưa đăng nhập vẫn có thể xem bản đồ người khác tạo, nhưng không thêm hoặc sửa tòa nhà được.
Sau khi đăng nhập, mở công cụ và di chuyển bản đồ đến tòa nhà cần cung cấp dịch vụ vị trí trong nhà. Ô tìm kiếm phía trên bên trái giúp tìm nhanh theo địa chỉ hoặc tên. Phóng to đến khi tòa nhà đủ lớn để thao tác thuận tiện (Hình 1).
Đưa con trỏ lên tòa nhà và nhấp chuột phải (Hình 2). Chọn Thêm tòa nhà: lớp tòa nhà mới xuất hiện. Nhấp Chỉnh sửa tòa nhà trên thanh công cụ để vào chế độ chỉnh sửa (Hình 3).
Trong chế độ chỉnh sửa tòa nhà, kéo các điểm trên viền lớp để căn theo đường bao tòa nhà thực tế (Hình 4–5).
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủThêm bản đồ tầng
Nhấp Tải lên rồi tải ảnh sơ đồ tầng đã chuẩn bị lên máy chủ KAILOS (Hình 6). Ảnh xuất hiện trong lớp tòa nhà (Hình 7).
Nhấp Căn chỉnh ảnh bản đồ để đặt sơ đồ tầng lên tòa nhà thực tế: di chuyển, thay đổi tỷ lệ và xoay ảnh cho khớp tòa nhà (Hình 8–11).
Khi căn chỉnh xong, nhập tên và thông tin tòa nhà, tầng, rồi nhấp Lưu để hoàn tất (Hình 12).
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủĐăng ký điểm quan tâm (POI)
Tiếp theo, đăng ký điểm quan tâm trong tòa nhà (tùy chọn). POI là địa điểm có thể làm điểm đến khi dẫn đường trong nhà, như văn phòng, cầu thang hoặc nhà vệ sinh.
Nhấp nút POI
ở đầu bản đồ, rồi nhấp địa điểm cần đăng ký. Bảng nhập thông tin mở ở phía trên bên trái (Hình 13). Nhập thông tin địa điểm rồi nhấp Lưu, sau đó nhấp nút bàn tay
để hoàn tất (Hình 14). Đăng ký các địa điểm khác theo cách tương tự.
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủĐăng ký đường đi
Đường là lối mà người dùng ứng dụng vị trí trong nhà có thể đi theo. Việc đăng ký đường là tùy chọn; khi xây dựng ứng dụng, chức năng đối sánh bản đồ KAILOS sử dụng chúng để hiển thị vị trí người dùng chính xác hơn.
Nhấp nút đường đi
ở đầu bản đồ (Hình 15), rồi nhấp các điểm mà đường đi qua. Nhấp đúp điểm cuối để hoàn tất (Hình 16), sau đó nhấp nút bàn tay
để thoát chế độ vẽ đường. Để tiếp tục từ một đường đã có, nhấp
và vẽ tiếp. Giao điểm được hiển thị bằng chấm đỏ (Hình 17).
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủLập kế hoạch thu thập tín hiệu
Trước khi thu thập tín hiệu, hãy lập kế hoạch các tuyến sẽ đi. Ở bước tiếp theo, người thu thập đi dọc các tuyến khảo sát dự kiến này với công cụ thu thập dữ liệu. Cách vẽ tương tự đăng ký đường đi.
Trước tiên, ẩn các đường để tránh vướng: nhấp nút lớp
bên phải bản đồ để mở menu hiện/ẩn lớp, rồi bỏ chọn ô Đường (Hình 19).
Nhấp nút khảo sát
ở đầu bản đồ (Hình 18), rồi nhấp điểm đầu của tuyến. Tuyến khảo sát đi từ điểm đầu qua các điểm chuyển hướng đến điểm cuối; nhấp đúp điểm cuối để đăng ký tuyến dự kiến (Hình 20–21). Nhấp nút bàn tay
để hoàn tất lập kế hoạch.
Tiếp theo, dùng công cụ thu thập dữ liệu để thu tín hiệu dọc các tuyến dự kiến; công cụ sẽ tải kế hoạch đã đăng ký.
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủThu thập tín hiệu
Cài đặt và chạy công cụ thu thập dữ liệu
Cài đặt công cụ thu thập dữ liệu Android — Walking Survey Collector — trên thiết bị di động dùng để thu tín hiệu, như smartphone hoặc máy tính bảng (Hình 22).
Yêu cầu
- Android 4.3 trở lên
- Mô-đun mạng LAN không dây (Wi-Fi)
- Thẻ SD
Cài đặt
- Sao chép tệp
WSTool.apkvào một thư mục trên thẻ SD của thiết bị. - Mở tệp APK bằng ứng dụng quản lý tệp trên thiết bị.
- Nhấn Cài đặt để cài công cụ thu thập dữ liệu.
- Chạy công cụ đã cài.
Đăng nhập trước khi dùng công cụ. Sau lần đầu, công cụ tự đăng nhập khi khởi động; để đăng xuất, nhấn nút Menu trên thiết bị rồi chọn Đăng xuất.
Cấu hình thiết bị
Ở màn hình chính, mở Menu → Settings, chọn Wi-Fi trong tab Kết nối, rồi mở Menu → Advanced. Bật Luôn cho phép quét (Hình 23).
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủGóc nhìn chính
Tab SURVEY LIST. Tab liệt kê các tầng đã đăng ký trong công cụ xây dựng bản đồ trên web. Nhấn Tải các tầng khảo sát để tải các tầng đã đăng ký bằng ID của bạn và hiển thị thành danh sách (Hình 24–25). Nhấn tầng cần thu thập tín hiệu: công cụ tải sơ đồ tầng cùng các tuyến khảo sát, lưu vào thiết bị rồi mở màn hình thu thập của tầng.
Tab COLLECTING INFO. Các tầng được chọn trong tab SURVEY LIST sẽ được thêm vào tab COLLECTING INFO, và thông tin của chúng được lưu trên thiết bị (Hình 26). Bạn có thể mở màn hình thu thập của các tầng này ngay cả khi không có kết nối internet (Wi-Fi, 3G hoặc 4G); lưu ý 2 ở bước 3 bên dưới giải thích lý do cần kết nối. Tab tóm tắt số tuyến khảo sát và số tuyến đã thu thập của mỗi tầng. Nút Gửi dữ liệu tải dữ liệu lên máy chủ sau khi hoàn tất.
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủThu thập dữ liệu trong bốn bước
Ở màn hình thu thập, bạn có thể di chuyển, xoay và phóng to hoặc thu nhỏ sơ đồ tầng.
Bước 1 — Kiểm tra kế hoạch khảo sát. Màn hình thu thập hiển thị sơ đồ tầng đã đăng ký cùng các tuyến khảo sát dự kiến (Hình 27). Một tầng có thể có một hoặc nhiều tuyến, tùy cách vẽ trong công cụ web.
Bước 2 — Chuẩn bị và kiểm tra hướng. Chọn một tuyến khảo sát: tuyến chuyển sang màu xanh lam và hiển thị điểm bắt đầu cùng điểm kết thúc — tam giác đỏ là điểm đầu, hình tròn đỏ là điểm cuối (Hình 28).
- Thông tin khảo sát hiển thị số lần đã thu thập trên tuyến đang chọn; nhấn để xem chi tiết (xem phần “Kiểm tra dữ liệu đã thu thập” bên dưới).
- Thu thập bắt đầu thu thập. Hủy bỏ chọn tuyến khảo sát và quay lại trạng thái trước.
Bước 3 — Bắt đầu thu thập. Đến điểm đầu của tuyến dự kiến (tam giác đỏ), nhấn Thu thập rồi đi dọc tuyến với bước chân thoải mái, đều đặn. Khi đến điểm cuối (hình tròn đỏ), nhấn Hoàn tất thu thập.
Trong lúc thu thập, công cụ ghi cường độ Wi-Fi, BLE và dữ liệu cảm biến — gia tốc kế 3 trục, con quay hồi chuyển, la bàn, khí áp kế. Màn hình Đang thu thập… hiển thị tiến độ thời gian thực (Hình 29). Bạn có thể di chuyển, phóng hoặc xoay bản đồ để dễ quan sát.
- Hủy thu thập hủy quá trình thu thập đang diễn ra.
- Hoàn tất thu thập dừng thu thập và lưu dữ liệu trên thiết bị.
Bước 4 — Lưu. Khi kết thúc thu thập, dữ liệu được lưu trên thiết bị. Màn hình Đang lưu… hiển thị tiến độ cho từng loại dữ liệu — Wi-Fi, BLE và cảm biến — và hiển thị HOÀN TẤT khi lưu xong (Hình 30).
Kiểm tra dữ liệu đã thu thập
Để xem số lần quét Wi-Fi hoặc mẫu cảm biến, nhấn Thông tin khảo sát. Màn hình hiển thị số lần thu thập mỗi tuyến và chi tiết từng lần (Hình 31). Nếu một lần thu thập bị lỗi, chọn và xóa trong danh sách.
Khi nào nên xóa dữ liệu đã thu thập? Ví dụ: vô tình nhấn Hoàn tất thu thập trước khi đến điểm cuối, hoặc người thu thập đi quá nhanh hay chạy. Khi đó, số lần quét Wi-Fi quá ít để tạo bản đồ vô tuyến tốt; hãy xóa dữ liệu và thu thập lại.
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủTải dữ liệu đã thu thập lên máy chủ KAILOS
Khi thu thập xong theo kế hoạch, nhấn Gửi dữ liệu trong tab COLLECTING INFO để tải lên máy chủ (Hình 32–33). Khi thành công, thông báo xác nhận xuất hiện và dữ liệu đã thu thập được xóa khỏi thiết bị (Hình 34).
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủ
— mở ảnh kích thước đầy đủHoàn thiện bản đồ vô tuyến
Sau khi gửi tín hiệu và dữ liệu cảm biến đến máy chủ KAILOS, chạy gán nhãn để hoàn tất bản đồ vô tuyến. Quá trình gán nhãn phân tích dữ liệu, gắn vị trí cho dấu vân tay đã thu thập và tự động xây dựng bản đồ vô tuyến trong nhà.
Chọn kế hoạch đã đăng ký (Kế hoạch khảo sát), rồi chọn Gán nhãn trong cửa sổ gán nhãn. Bản đồ vô tuyến đã hoàn tất (Hình 35).
— mở ảnh kích thước đầy đủBước 2: Phát triển ứng dụng với KAILOS API
Để phát triển dịch vụ vị trí trong nhà, KAILOS cung cấp API dưới dạng dịch vụ web RESTful. Đường dẫn tương đối với máy chủ KAILOS; để truy cập API và biết địa chỉ máy chủ dự án, hãy liên hệ nhóm chúng tôi.
API vị trí
Ước lượng vị trí
POST/api/location
Ước lượng vị trí người dùng từ dấu vân tay Wi-Fi, kết quả quét BLE và dữ liệu định vị vệ tinh.
Tham số
- data
- JSON, như bên dưới.
{
"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)
}Cập nhật dữ liệu khảo sát
POST/api/db/updateSurveyData
Tải dữ liệu khảo sát Wi-Fi (quét điểm truy cập tại vị trí đã biết) lên cơ sở dữ liệu bản đồ vô tuyến.
Tham số
- data
- JSON, như bên dưới.
{
"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
},
...
]
}Phản hồi Mã trạng thái HTTP.
API bản đồ
Lấy bản đồ tầng
GET/floors/{floorId}/image
Trả về ảnh sơ đồ của tầng.
Tham số
- floorId
- ID tầng.
GET /floors/554ff57ec900625812229172/imageLấy POI của một tầng
GET/pois/floor/{floorId}
Trả về POI đăng ký trên tầng. Thêm ID tầng vào URL; phản hồi là chuỗi cần phân tích dưới dạng JSON.
Tham số
- floorId
- ID tầng.
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"
}
]Ví dụ Android (Java, từ tài liệu gốc)
// 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.
}
}
}Lấy POI của tầng theo danh mục
GET/pois/floor/{floorId}/{categoryType}
Tương tự lấy POI của tầng, nhưng thêm loại danh mục từ danh sách bên dưới vào URL. Phản hồi có cùng định dạng.
Tham số
- floorId
- ID tầng.
- categoryType
- Loại danh mục POI, ví dụ
elevator.
Danh mục POI
POI sử dụng các loại sau, được nhóm theo danh mục.
| Danh mục | Loại |
|---|---|
| education |
|
| Khẩn cấp |
|
| store |
|
| facility |
|
| general |
|
| floorchange |
|
| etc |
|
Lấy các tầng của tòa nhà
GET/floors/building/{buildingId}
Trả về danh sách tầng của tòa nhà.
Tham số
- buildingId
- ID tòa nhà.
[
{
"_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 tuyến đường
Tìm đường
POST/routes
Tìm tuyến dẫn đường giữa hai điểm trong nhà hoặc ngoài trời. Phản hồi là chuỗi cần phân tích dưới dạng JSON: tuyến đường gồm một danh sách các đoạn.
Nội dung yêu cầu (application/x-www-form-urlencoded)
- startFloorId
- ID tầng của điểm đầu nếu ở trong nhà; chuỗi rỗng nếu ở ngoài trời.
- startX
- Kinh độ điểm đầu.
- startY
- Vĩ độ điểm đầu.
- endFloorId
- ID tầng của điểm đến nếu ở trong nhà; chuỗi rỗng nếu ở ngoài trời.
- endX
- Kinh độ điểm đến.
- endY
- Vĩ độ điểm đến.
[
{
"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
},
...
]Ví dụ Android (Java, từ tài liệu gốc)
// 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());
}
}
}Các endpoint trước đây
Bản tiếng Anh của tài liệu gốc mô tả phiên bản Map và Route API trước đây, trong đó mọi truy vấn là yêu cầu POST đến /api/map/…. Chúng được liệt kê ở đây cho các tích hợp hiện có.
Hiện endpoint Map và Route trước đây
Lấy bản đồ tầng
POST/api/map/getFloorMaps
Tham số
- data
- JSON, như bên dưới.
{
"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"
},
...
]
}Lấy POI
POST/api/map/directory
Tham số
- data
- JSON, như bên dưới.
{
"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"
}
]
}Lấy mạng đường đi của một tầng
POST/api/map/route
Tham số
- queryType
GET_ROADS_BY_FLOORID- floorId
- ID tầng (chuỗi).
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"]
]
]
}Tìm đường ngắn nhất
POST/api/map/route
Tham số
- queryType
FIND_PATH- from
- Điểm đầu: kinh độ, vĩ độ, ID tầng (chuỗi).
- to
- Điểm đến: kinh độ, vĩ độ, ID tầng (chuỗi).
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"]
]
}Hỗ trợ API
Với câu hỏi về cách dùng KAILOS, API hoặc yêu cầu API bổ sung, hãy trao đổi với nhóm chúng tôi.
Trao đổi với chúng tôiBan đầu được Phòng thí nghiệm Tích hợp Dịch vụ Thông minh của KAIST công bố dưới tên KAILOS Manual trên kailos.io.




