Tile38简介
Tile38 是一个开源的内存型地理空间数据库,专门用于处理地理空间数据和位置服务。它是由 Axiom Data Science 开发的,旨在支持实时地理空间应用。Tile38 提供了丰富的功能,使其成为处理地理位置数据的强大工具。
核心功能
- 地理空间数据支持:
- 实时位置服务:
- Tile38 提供实时的地理围栏(Geofencing)功能,可以监控对象进入或离开指定的地理区域。通过webhooks或pub/sub channels实现实时地理围栏
- 这种实时性对于需要位置跟踪的应用非常有用,比如物流、配送服务和资产追踪等。
- 简单的命令接口:
- Tile38 使用类似于 Redis 的命令行接口,支持简单易懂的命令语法。完整的命令行接口command line interface.
- 用户可以通过 TCP 协议或 HTTP 接口与 Tile38 进行交互。支持各种协议,包括:http(curl)、 websockets、telnet、Redis RESP. 服务器返回格式可以设定为:RESP或JSON.
- 高性能和可扩展性:
- Tile38 是用 Go 语言编写的,具有高效的性能表现。
- 它支持水平扩展,可以处理大量的地理空间数据和请求。
- 多种编程语言支持:
- Tile38 提供多种编程语言的客户端库,包括 Python、js、Java、Go 等,方便开发者集成到不同的应用中。
常用操作
- 设置和获取数据:
- SET命令用于存储地理空间对象,例如 SET fleet truck1 POINT 33.5123 -112.2693。
- GET命令用于检索存储的对象信息。
- 地理空间查询:
- NEARBY命令用于查找指定点附近的对象。
- WITHIN和 INTERSECTS 命令用于查找在特定区域内或与特定区域相交的对象。
- 地理围栏:
- SETCHAN和 WITHIN 等命令组合用于创建地理围栏,以监控对象的动态位置。
优缺点
优点:
- 兼容 redis 协议
- 功能函数丰富,比如超时设置, hook 调用通知, json 接口等
- golang 语言编写, 部署方便
- 支持主从, 以 redis 的 aof 格式存储数据
- 搜索函数比起 redis 丰富了很多
缺点:
- 不是特别稳定, github 还有很多未解决的 issue
- 没有配置文件, 都在代码里控制, 不清楚作者有没有这方面的打算
应用场景
- 物流和运输:实时跟踪车辆位置,优化路线规划,提高运输效率。
- 资产管理:监控移动资产的位置和状态,确保资产安全。
- 社交网络和游戏:提供基于位置的服务,如附近好友查找和地理位置游戏功能。
- 应急响应:在紧急情况下实时跟踪资源和人员的位置,提升响应速度。
Tile38的使用
设置和获取数据
存储地理空间对象
# 存储地理空间对象 SET fleet truck1 POINT 33.5123 -112.2693 # 获取对象信息 GET fleet truck1
地理空间查询
Tile38 提供了一系列强大的地理空间查询功能,能够处理和分析地理空间数据。以下是 Tile38 支持的一些主要地理空间查询:
- NEARBY:
- 用于查找在指定位置附近的对象。可以根据距离限制结果集,并按距离排序。
- 示例:查找距离某个点 10 公里内的所有对象。
# 查找距离点 (33.5123, -112.2693) 10 公里内的所有对象 NEARBY fleet POINT 33.5123 -112.2693 10000
- WITHIN:
- 用于查找位于特定地理空间区域内的对象。区域可以是一个多边形、圆形或其他几何形状。
- 示例:查找位于某个多边形区域内的所有对象。
# 查找位于指定多边形区域内的所有对象 WITHIN fleet POLYGON 5 33.462 -112.268 33.491 -112.268 33.491 -112.251 33.462 -112.251 33.462 -112.268
- INTERSECTS:
- 用于查找与指定几何形状相交的对象。这对于需要检查两个地理空间对象是否重叠的情况非常有用。
- 示例:查找与特定多边形相交的所有对象。
# 查找与指定圆形区域相交的所有对象 INTERSECTS fleet CIRCLE 33.462 -112.268 1000
- BOUNDS:
- 用于查找在指定边界框(bounding box)内的对象。
- 示例:查找在给定矩形边界内的所有对象。
# 查找在给定矩形边界内的所有对象 BOUNDS fleet 33.462 -112.268 33.491 -112.251
- GET:
- 检索存储的地理空间对象的详细信息。虽然不算是一个复杂的查询,但对于获取特定对象的信息很有用。
# 获取特定对象的地理信息 GET fleet truck1
- SCAN 和 SEARCH:
- 用于遍历和查找数据集中的对象。SCAN提供无序遍历,而 SEARCH 支持条件过滤和排序。
# SCAN 命令用于无序遍历数据集 SCAN fleet # SEARCH 命令用于按条件过滤和排序 SEARCH fleet WHERE speed 60 100
地理围栏
# 设置地理围栏 SETCHAN mychannel WITHIN fleet FENCE DETECT enter,exit POINT 33.5123 -112.2693 10000 # 监控地理围栏事件 SUBSCRIBE mychannel # 批量插入数据 MULTI SET fleet truck2 POINT 34.5123 -113.2693 SET fleet truck3 POINT 35.5123 -114.2693 EXEC
数据管理
# 删除单个对象 DEL fleet truck1 # 清空集合 DROP fleet
集成与扩展
Python 示例
import tile38 client = tile38.Tile38() client.set('fleet', 'truck1', point=(33.5123, -112.2693)) print(client.get('fleet', 'truck1')) Node.js 示例 const Tile38 = require('tile38'); const client = new Tile38(); client.set('fleet', 'truck1', [33.5123, -112.2693]) .then(() => client.get('fleet', 'truck1')) .then(data => console.log(data));
性能优化
使用持久化存储
在启动 Tile38 时,可以使用 -d 参数指定数据目录以启用持久化存储。
./tile38-server -d /path/to/data
调整配置
可以在 tile38.conf 文件中调整内存限制、日志级别等配置,以优化性能。
参考链接: