docker-compose安装tile38、初识区域搜索

474 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

背景

最近在做一个gps区域搜索相关的功能,需要实时监测多个指定的gps设备是否在划定的区域范围之内;这个功能里面有两个难点:

  • 划定的区域形状多样,有可能是圆形、矩形或者多边形;
  • 如何计算某个不断变化的经纬度坐标是否离开划定的区域;

经过多方查找,终于找到了tile38这个神器,tile38是基于golang编写,用于地理空间和实时地理围栏应用的高性能数据库。所以我们的这个功能就可以使用到这个工具来辅助实现了。

安装tile38

version: "3.7"
services:
  tile38:
    image: tile38/tile38
    # 开放端口,以便客户端通信
    ports:
      - "9851:9851"
    # 数据存储路径
    volumes:
      - "./tile38/data:/data"

通过docker-compose up -d tile38命令启动容器实例。

其他安装方式可以查看tile38官网

配置文件

一般直接启动的话,tile38会在/data文件夹中创建默认的配置文件config文件,启动成功后,里面会有一个配置项server_id,我们如果还想添加其他配置项,可以先停止当前服务,把需要添加的配置项补充进去,再重新启动。

配置项描述
requirepass设置服务端密码,默认是没有密码
leaderauth如果leader设置了密码,那么follower必须要设置leaderauth来连接目标leader服务
protected-modetile38只允许经过身份验证的客户端或来自本地主机的连接。默认是开启保护模式的。默认值为yes
maxmemory以字节为单位设置最大内存。可以使用单位kb/mb/gb
autogc执行一次垃圾收集的时间,单位秒,默认为 0,没有垃圾收集
keep_alive客户端连接存活时长,默认值:300,单位秒
follow_hostleader服务的ip或域名
follow_portleader服务的端口
follow_posleader服务的aof文件同步偏移点
follow_idleader服务的id
server_id当前服务的id
read_only是否只读
logconfig日志配置;使用json格式的zap.Config文件

启动本机客户端

在容器实例启动成功后,我们可以执行以下命令启动tile38-cli客户端工具:

  • 进入tile38容器中

    docker exec -it ${容器id} /bin/sh
    
  • 开启本机客户端

    进入容器实例内后,执行下面命令:

    tile38-cli
    

    进入客户端后,我们就可以使用客户端来与tile38服务进行交互了;下面我们来使用这个工具创建一些对象。

对象类型

  • Point类型

    SET fleet truck1 POINT 33.5123 -112.2693SET fleet truck1 POINT 33.5123 -112.2693 225
    

    以上命令就是创建一个Point类型的数据,命令格式如下:

    SET [key] [field] POINT 经度 纬度 [附加数据]

    我们可以把以上命令理解成redis中的哈希结构,我们可以在key里面设置多个POINT数据,只要保证field名称不同即可。

  • Bound类型

    SET fleet truck1 BOUNDS 30 -110 40 -100
    

    命令格式如下:

    SET [key] [field] BOUNDS 经度1 维度1 经度2 维度2

    上面命令通过两个点构建了一个边界框,类似矩形。

  • Geohash类型

    SET fleet truck1 HASH 9tbnthxzr
    

    命令格式如下:

    SET [key] [field] HASH hash值

    其中的hash值相当于一个坐标点,所以这个命令相当于创建了一个POINT数据。

    Geohash相关知识可以参考en.wikipedia.org/wiki/Geohas…

  • GeoJSON类型

    SET city tempe OBJECT '{"type":"Polygon","coordinates":[[[-111.9787,33.4411],[-111.8902,33.4377],[-111.8950,33.2892],[-111.9739,33.2932],[-111.9787,33.4411]]]}'
    

    命令格式如下:

    SET [key] [field] OBJECT '{"type":"Polygon","coordinates":[坐标组]}'

    上面的命令就是通过一组坐标系创建一个多边形区域。里面有两个需要注意的点:

    • 如果设置的时候报错invalid coordinates,请检查数组中第一个经纬度是否与最后一个经纬度一致,GeoJSON要求最后一个点一定要回到起始点。
    • GEOJson区域的点的顺序是(纬度,经度)。

    上面命令中的type支持以下类型:PointLineStringPolygonMultiPointMultiLineStringMultiPolygon

    另外,附上GeoJSON格式规范

下面两个类型都无法直接在服务中提前定义,只有在需要使用的时候才能定义:

  • CIRCLE圆形

    WITHIN fleet CIRCLE 122.1 30 10000
    

    这个命令的意思是,查询fleet中有哪些点或区域是在后面的圆形范围内。这个圆形就是以122.1 30为圆心,10000米为半径的范围。

  • Sector扇形

    WITHIN fleet SECTOR 33.5123 -112.2693 1000 0 90
    

    这个命令也和上面的圆形一样,这个是扇形;以33.5123 -112.2693为中心,1000米范围内,夹角为0度到90度范围。