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

地理空间数据库Tile38

钱魏Way · · 236 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

Tile38简介

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

核心功能

  • 地理空间数据支持
    • Tile38支持各种地理空间数据类型,包括点(Point)、线(LineString)、多边形(Polygon)、集合(Collection)等。支持多种对象:lat/lon, bbox, Geohash, GeoJSON, QuadKey, andXYZ 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的使用

设置和获取数据

存储地理空间对象

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#存储地理空间对象
SET fleet truck1 POINT 33.5123 -112.2693
#获取对象信息
GET fleet truck1
#存储地理空间对象 SET fleet truck1 POINT 33.5123 -112.2693 #获取对象信息 GET fleet truck1
#存储地理空间对象
SET fleet truck1 POINT 33.5123 -112.2693
#获取对象信息
GET fleet truck1

地理空间查询

Tile38提供了一系列强大的地理空间查询功能,能够处理和分析地理空间数据。以下是Tile38支持的一些主要地理空间查询:

  • NEARBY
    • 用于查找在指定位置附近的对象。可以根据距离限制结果集,并按距离排序。
    • 示例:查找距离某个点10公里内的所有对象。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#查找距离点(33.5123,-112.2693)10公里内的所有对象
NEARBY fleet POINT 33.5123 -112.2693 10000
#查找距离点(33.5123,-112.2693)10公里内的所有对象 NEARBY fleet POINT 33.5123 -112.2693 10000
#查找距离点(33.5123,-112.2693)10公里内的所有对象
NEARBY fleet POINT 33.5123 -112.2693 10000
  • WITHIN
    • 用于查找位于特定地理空间区域内的对象。区域可以是一个多边形、圆形或其他几何形状。
    • 示例:查找位于某个多边形区域内的所有对象。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#查找位于指定多边形区域内的所有对象
WITHIN fleet POLYGON 5 33.462 -112.268 33.491 -112.268 33.491 -112.251 33.462 -112.251 33.462 -112.268
#查找位于指定多边形区域内的所有对象 WITHIN fleet POLYGON 5 33.462 -112.268 33.491 -112.268 33.491 -112.251 33.462 -112.251 33.462 -112.268
#查找位于指定多边形区域内的所有对象
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
    • 用于查找与指定几何形状相交的对象。这对于需要检查两个地理空间对象是否重叠的情况非常有用。
    • 示例:查找与特定多边形相交的所有对象。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#查找与指定圆形区域相交的所有对象
INTERSECTS fleet CIRCLE 33.462 -112.268 1000
#查找与指定圆形区域相交的所有对象 INTERSECTS fleet CIRCLE 33.462 -112.268 1000
#查找与指定圆形区域相交的所有对象
INTERSECTS fleet CIRCLE 33.462 -112.268 1000
  • BOUNDS
    • 用于查找在指定边界框(bounding box)内的对象。
    • 示例:查找在给定矩形边界内的所有对象。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#查找在给定矩形边界内的所有对象
BOUNDS fleet 33.462 -112.268 33.491 -112.251
#查找在给定矩形边界内的所有对象 BOUNDS fleet 33.462 -112.268 33.491 -112.251
#查找在给定矩形边界内的所有对象
BOUNDS fleet 33.462 -112.268 33.491 -112.251
  • GET
    • 检索存储的地理空间对象的详细信息。虽然不算是一个复杂的查询,但对于获取特定对象的信息很有用。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#获取特定对象的地理信息
GET fleet truck1
#获取特定对象的地理信息 GET fleet truck1
#获取特定对象的地理信息
GET fleet truck1
  • SCANSEARCH
    • 用于遍历和查找数据集中的对象。SCAN提供无序遍历,而 SEARCH 支持条件过滤和排序。
Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#SCAN命令用于无序遍历数据集
SCAN fleet
#SEARCH命令用于按条件过滤和排序
SEARCH fleet WHERE speed 60 100
#SCAN命令用于无序遍历数据集 SCAN fleet #SEARCH命令用于按条件过滤和排序 SEARCH fleet WHERE speed 60 100
#SCAN命令用于无序遍历数据集
SCAN fleet

#SEARCH命令用于按条件过滤和排序
SEARCH fleet WHERE speed 60 100

地理围栏

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#设置地理围栏
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
#设置地理围栏 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
#设置地理围栏
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

数据管理

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#删除单个对象
DEL fleet truck1
#清空集合
DROP fleet
#删除单个对象 DEL fleet truck1 #清空集合 DROP fleet
#删除单个对象
DEL fleet truck1

#清空集合
DROP fleet

集成与扩展

Python示例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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));
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));
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参数指定数据目录以启用持久化存储。

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
./tile38-server -d /path/to/data
./tile38-server -d /path/to/data
./tile38-server -d /path/to/data

调整配置

可以在tile38.conf文件中调整内存限制、日志级别等配置,以优化性能。

参考链接:

发表回复

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