器→工具, 开源项目, 术→技巧, 研发

地理空间数据库Tile38

钱魏Way · · 121 次浏览

Tile38简介

Tile38 是一个开源的内存型地理空间数据库,专门用于处理地理空间数据和位置服务。它是由 Axiom Data Science 开发的,旨在支持实时地理空间应用。Tile38 提供了丰富的功能,使其成为处理地理位置数据的强大工具。

核心功能

  • 地理空间数据支持
    • Tile38 支持各种地理空间数据类型,包括点(Point)、线(LineString)、多边形(Polygon)、集合(Collection)等。支持多种对象:lat/lon,bboxGeohashGeoJSONQuadKey, and XYZ tile.
    • 它允许用户存储和检索这些地理数据,并支持复杂的地理空间查询。支持类似附近、包含、相交..
  • 实时位置服务
    • Tile38 提供实时的地理围栏(Geofencing)功能,可以监控对象进入或离开指定的地理区域。通过webhookspub/sub channels实现实时地理围栏
    • 这种实时性对于需要位置跟踪的应用非常有用,比如物流、配送服务和资产追踪等。
  • 简单的命令接口
  • Tile38 使用类似于 Redis 的命令行接口,支持简单易懂的命令语法。完整的命令行接口command line interface.
    • 用户可以通过 TCP 协议或 HTTP 接口与 Tile38 进行交互。支持各种协议,包括:http(curl)、 websocketstelnetRedis RESP. 服务器返回格式可以设定为:RESPJSON.
  • 高性能和可扩展性
    • 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
  • SCANSEARCH
    • 用于遍历和查找数据集中的对象。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 文件中调整内存限制、日志级别等配置,以优化性能。

参考链接:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注