跳转至正文
KPT —韩国定位技术

产品文档

KAILOS 手册

构建建筑物的室内地图和无线电地图,然后利用KAILOS API开发基于室内位置的服务。

使用KAILOS制作您的室内地图并建立您自己的室内位置服务。手册分为两个步骤:步骤1使用基于Web的地图构建工具和Android数据采集工具构建建筑物的无线电地图; 步骤 2 使用 KAILOS RESTful API 开发应用程序。

KAILOS系统架构

KAILOS室内定位系统将室内地图构建工具、传感器数据采集工具、数据采集服务器、位置服务器和地图服务器集成在一个系统中,为基于位置的服务提供了便捷的开发环境。

KAILOS运行在服务器端。这使得系统易于使用和维护,并保持其上构建的基于位置的服务轻量级。

室内地图构建工具

  • 平面规划工具
  • POI编辑器
  • 调查规划工具
  • 路网编辑

传感器数据采集工具

Android应用程序

数据收集服务器

  • 原始数据处理器
  • 无线电地图生成器

原始数据

位置服务器

输入:Wi-Fi · PDR · 其他信号

  1. 信号滤波器
  2. 位置过滤器
  3. 地图匹配
  4. 混合位置提供商

地图服务器

  • 目录服务
  • 路由服务

Maps

基于位置的服务
KAILOS系统架构。地图构建和数据收集工具向数据收集服务器提供数据,数据收集服务器为定位服务器生成无线电地图;基于位置的服务使用位置服务器和地图服务器。

步骤1:构建无线电地图

在可以提供建筑物或楼层的室内地图之前,必须构建该区域的无线电地图。请按照以下步骤操作;注册兴趣点 (POI) 和道路是可选的。

  1. 步骤 1添加建筑物
  2. 步骤 2添加楼层
  3. 步骤 3规划信号采集
  4. 步骤 4信号采集
  5. 步骤 5无线电地图构建完成
基于网络的地图构建步骤。添加楼层后,可以选择注册 POI 和道路。

建筑物、楼层和信号收集平面图被注册在KAILOS基于网络的地图构建工具中。无线电地图信号通过Android应用程序KAILOS数据采集工具进行采集,结果可以通过测试导航应用程序进行检查。

  • 基于网络的地图构建工具建筑物、平面图、兴趣点、道路和测量图·浏览器(Chrome)
  • 数据采集工具步行调查收集器·Android应用程序(WSTool.apk)
  • 测试导航KAILOS Localization Tester · Android 应用程序 (kailos-tester.apk)

我们的团队安排了对您建筑物的工具的访问。

请求访问

基于网络的地图构建工具

基于网络的地图构建工具运行在浏览器中:在计算机上打开KAILOS站点即可使用。

最低要求

  • 具有互联网接入的计算机或移动设备
  • 一种支持HTML5 Canvas的浏览器
  • 一种支持标准JavaScript的浏览器

添加建筑物

登录KAILOS使用地图构建工具。无需登录,您可以查看其他用户构建的室内地图,但无法添加或更改建筑物。

登录后,打开工具,将地图移动到您想要提供室内定位服务的建筑物。左上角的搜索框可以通过地址或名称快速找到建筑物。放大直到建筑物看起来足够大以便可以舒适地工作 (图 1)。

将鼠标指针放置在建筑物上并单击鼠标右键(图 2)。从菜单中选择 添加建筑物:屏幕上会出现一个新图层,即建筑物图层。单击顶部工具栏中的“修改建筑物”,进入建筑物修改模式(图 3)。

在建筑物修改模式下,拖动图层边界上的点以将其与实际建筑物的轮廓(图 4–5)对齐。

地图构建工具放大了KAIST园区,左上方为建筑物搜索框,右上方为已注册建筑物列表。 —打开全尺寸图像
图 1 找到建筑物并放大。
地图上的建筑物上的右键菜单,提供添加建筑物、POI或道路。 —打开全尺寸图像
图 2 右键单击​​建筑物并选择添加建筑物。
新建筑物,建筑物和楼层信息面板位于左侧,修改建筑物按钮在工具栏中突出显示。 —打开全尺寸图像
图 3 进入建筑物改造模式。
建筑物修改方式:新的建筑物图层是一个矩形,其边界上有可拖动的点。 —打开全尺寸图像
图 4 新建一层。
建筑物层被拖动并旋转以匹配地图上建筑物的轮廓。 —打开全尺寸图像
图 5 将层与建筑物轮廓对齐。

添加楼层地图

点击“上传”,将准备好的楼层平面图图像上传到KAILOS服务器(图 6)。该图像出现在建筑图层 (图 7) 内。

单击对齐地图图像以将平面图放置在实际建筑物上:移动、缩放和旋转图像直到其与建筑物匹配(图 8–11)。

对齐完成后,输入建筑物、楼层的名称等信息,然后点击“保存”即可完成(图 12)。

用于选择要为所选楼层上传的平面图图像的文件对话框。 —打开全尺寸图像
图 6 上传平面图图像。
上传的平面图在建筑层内显示为小。 —打开全尺寸图像
图 7 上传的平面图。
图像对齐模式:地图变暗并且平面图图像显示用于移动、缩放和旋转的手柄。 —打开全尺寸图像
图 8 对齐平面图图像。
平面图图像在建筑物上按比例放大并旋转。 —打开全尺寸图像
图 9 缩放和旋转图像。
平面图与地图上的建筑物占地面积对齐。 —打开全尺寸图像
图 10 平面图与建筑物相匹配。
对齐的平面图放置在地图上,编辑工具栏位于顶部。 —打开全尺寸图像
图 11 对齐的平面图。
在保存之前在信息面板中输入建筑物和楼层名称和描述。 —打开全尺寸图像
图 12 命名建筑物和楼层,然后保存。

注册兴趣点(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 根据楼层需要规划尽可能多的测量线。

收集信号

安装并运行数据收集工具

在将收集信号的移动设备上安装Android数据收集工具——步行调查收集器(Walking Survey Collector),例如智能手机或平板电脑(图 22)。

要求

  • Android 4.3或更高版本
  • 无线局域网(Wi-Fi)模块
  • SD卡

安装

  1. 将 WSTool.apk 文件复制到设备 SD 卡上的文件夹中。
  2. 使用设备上的文件资源管理器应用程序打开APK文件。
  3. 点击安装来安装数据收集工具。
  4. 运行安装的工具。

在使用该工具之前登录。首次登录后,工具启动时自动登录;要注销,请按设备的 菜单 按钮并选择 注销。

配置设备

在主屏幕上,打开菜单→设置,在连接选项卡上选择Wi-Fi,然后打开菜单→高级。打开始终允许扫描 (图 23)。

步行调查收集器应用程序的 Android 安装屏幕,列出了它请求的权限。 —打开全尺寸图像
图 22 安装数据收集工具。
Android高级Wi-Fi设置始终允许扫描打开。 —打开全尺寸图像
图 23 打开始终允许扫描。

主视图

调查列表选项卡。该选项卡列出了在基于网络的地图构建工具中注册的楼层。点击加载调查楼层,加载用您的ID注册的楼层并以列表形式显示(图 24–25)。点击要收集信号的楼层:该工具会下载楼层平面图和为其注册的测量线,将它们存储在设备上并打开楼层的收集视图。

“收集信息”选项卡。 您在“调查列表”选项卡中选择的楼层被添加到“收集信息”选项卡,并且它们的信息被存储在设备(图 26)上。因此,即使没有互联网连接(Wi-Fi、3G或4G),您也可以打开这些楼层的采集视图;下面步骤 3 中的注意事项 2 解释了连接的重要性。该选项卡还总结了每个楼层的收集情况 - 有多少条调查线(调查路径)以及已收集了多少条调查线 - 其 发送数据 按钮会在收集完成后将收集到的数据上传到服务器。

在加载任何楼层之前步行调查收集器的调查列表选项卡,其中加载调查楼层按钮位于底部。 —打开全尺寸图像
图 24 调查列表选项卡。
调查列表选项卡列出要收集的注册楼层,例如N1 7F、N24 B1和E11 5F。 —打开全尺寸图像
图 25 从网络工具加载的楼层。
收集信息选项卡显示存储的楼层 ISI Lab N1 7F、其勘测路径的数量已被收集以及发送数据按钮。 —打开全尺寸图像
图 26 “收集信息”选项卡。

分四步收集数据

在收集视图中,您可以移动、旋转和缩放平面图。

步骤1-检查测量计划。收集视图显示登记的平面图及其计划的测量线(图 27)。一层可以有一条或多条测量线,具体取决于它们在网络工具中的绘制方式。

步骤2——准备好并检查方向。选择测量线:它变成蓝色并显示从哪里开始和在哪里结束——红色三角形是起点,红色圆圈是终点(图 28)。

  • 调查信息显示所选调查线已被收集了多少次;点击它了解详细信息(请参阅下面的“检查收集的数据”)。
  • 收集开始收集。 取消取消选择测量线并返回到之前的状态。

步骤3——开始采集。转到规划路径的起点(红色三角形),点击采集并以舒适、规则的步伐沿着测量线行走。当您到达终点(红色圆圈)时,点击完成收集。

在收集时,该工具记录Wi-Fi和BLE信号强度和传感器数据——3轴加速度计、陀螺仪、指南针和气压计。 正在收集...视图实时显示进度 (图 29)。如果平面图变得混乱,您可以在收集过程中移动、缩放和旋转地图。

  • 取消收集 取消正在进行的收集。
  • 完成收集停止收集并将收集到的数据存储在设备上。

步骤4-保存。 当收集结束时,收集的数据被存储在设备上。 正在保存...视图显示每种类型的数据(Wi-Fi、BLE 和传感器数据)的进度,并在保存完成时显示完成 (图 30)。

检查收集到的数据

要查看收集了多少 Wi-Fi 扫描或传感器样本,请点击调查信息。它显示每个调查线已收集的次数以及每次收集的详细信息 (图 31)。如果集合出错,请在列表中选择它并将其删除。

何时应该删除采集的数据? 例如,在到达终点之前误点击“采集完成”,或者采集者走得太快或跑步时。然后收集的 Wi-Fi 扫描太少,不太可能获得良好的无线电地图;删除数据并重新收集。

显示平面图的收集视图,其规划的测量线为红色。 —打开全尺寸图像
图 27 步骤一:检查勘察计划。
选定的调查线以蓝色突出显示,在开始处有红色三角形,在结尾处有红色圆圈、调查信息面板和收集按钮。 —打开全尺寸图像
图 28 步骤二:选择测线。
正在进行收集:Wi-Fi、BLE和传感器读数的实时计数器,具有取消收集和完成收集按钮。 —打开全尺寸图像
图 29 步骤三:收集。
保存视图在存储时将每个数据类型报告为完整的或百分比的。 —打开全尺寸图像
图 30 步骤四:保存。
详细的调查信息,列出了为调查线收集的 Wi-Fi 扫描和传感器样本的数量。 —打开全尺寸图像
图 31 详细的调查信息。

将采集到的数据上传至KAILOS服务器

当收集按计划完成时,将收集到的数据上传到服务器:点击收集信息选项卡(图 32–33)中的发送数据。成功上传后,将显示一条消息进行确认,并且收集的数据将从设备中删除 (图 34)。

收集后的“收集信息”选项卡,显示收集的、准备发送的一个调查路径之一。 —打开全尺寸图像
图 32 准备发送。
上传对话框显示将收集的路径发送到服务器的进度。 —打开全尺寸图像
图 33 正在上传至服务器。
确认数据已发送到服务器并且收集的数据已从设备中删除。 —打开全尺寸图像
图 34 上传完成。

完成无线电地图

一旦收集到的信号和传感器数据已被发送到KAILOS服务器,则运行标记以完成无线电地图。标签分析收集到的数据,对收集到的指纹进行位置标记,并自动构建室内无线电地图。

选择您注册的调查计划(调查计划),然后在标签窗口中选择标签。无线电地图已完成(图 35)。

地图构造工具中的测量平面图视图,其中标签列表打开并且所收集的测量线显示在平面图上。 —打开全尺寸图像
图 35 运行标记以完成无线电地图。

测试导航

当无线电地图完成时,您可以使用KAILOS定位API来跟踪您的位置。 Android 测试导航应用程序 KAILOS Localization Tester 在您添加的地图上显示 KAILOS 定位 API 估计的位置。

要求

  • Android 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 聚焦于当前位置。
应用菜单从左边缘打开,显示帮助项目。 —打开全尺寸图像
图 39 从菜单中打开帮助。

步骤2:使用KAILOS API开发应用程序

KAILOS 以 RESTful Web 服务提供室内位置服务开发所需的 API。路径相对于 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}

返回在楼层上注册的兴趣点。将楼层 ID 附加到 URL 中;响应是一个解析为 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,来自原手册)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,来自原手册)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());
        }
    }
}

早期端点

原始手册的英文版记录了较早的 Map 和 Route API,其中每个查询都是发送至 /api/map/… 的 POST 请求。此处保留这些接口供现有集成使用。

显示先前的地图和路线端点

检索楼层地图

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"
    },
    ...
  ]
}

获取兴趣点

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手册发布。

将室内定位带入您的环境。

请告诉我们有关建筑物、所需覆盖范围、用户和目标应用的信息。

讨论KAILOS