本章节介绍TairGIS数据支持的命令。

TairGIS简介

TairGis是一种使用R-Tree做索引,支持地理信息系统GIS(Geographic Information System)相关接口的数据结构。Redis的原生GEO命令是使用GeoHash和Redis Sorted Set结构完成的,主要用于点的查询,TairGIS在此基础上还支持线、面的查询,功能更加强大。

主要特性:

  • 使用R-Tree做索引存储。
  • 支持点、线、面的相关查询(含相交查询)。

使用前提

请注意,本章节介绍的命令只有在满足以下条件时才能生效。

  • Redis实例为云Redis企业版性能增强型实例。
  • 操作对象为性能增强型实例中的TairGIS数据。

命令列表

表 1. TairGIS命令
类型 命令列表 说明
GIS.ADD GIS.ADD <area> <PolygonName> <POLYGON> [<PolygonName2> <POLYGON> ...] 在area中添加一个名为PolygonName的多边形,使用WKT(Well-known text)描述。可同时添加多个多边形。
说明 WKT是一种文本标记语言,用于描述矢量几何对象、空间参照系统及空间参照系统之间的转换。
GIS.GET GIS.GET <area> <PolygonName> 在area中查找名为PolygonName的多边形的WKT信息。
GIS.DEL GIS.DEL <area> <PolygonName> 删除area下的名为PolygonName的多边形。
GIS.SEARCH GIS.SEARCH <area> <POINT | LINESTRING | POLYGON> 查找一个点/线/面所在的多边形,返回多边形的名称和WKT信息。
GIS.CONTAINS GIS.CONTAINS <area> <POINT | LINESTRING | POLYGON> 判断指定的点/线/面是否包含在area中的某个多边形内。
GIS.INTERSECTS GIS.INTERSECTS <area> <POINT | LINESTRING | POLYGON> 判断给定点/线/面和area中包含的多边形的相交情况。

参数说明

参数 说明
area 一个几何区域。
PolygonName 一个多边形的名称。
POINT 描述一个点的WKT信息。
LINESTRING 描述一条线的WKT信息。
POLYGON 描述一个多边形的WKT信息。

GIS.ADD

  • 语法

    GIS.ADD <area> <polygonName> <polygonWkt> [<polygonName> <polygonWkt> ...]

  • 时间复杂度

    O(log n)

  • 命令描述

    在area中添加一个名为polygonName的多边形,使用WKT表示,例如'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'。可以添加多个多边形。

  • 返回值
    • 成功:0。
    • 覆盖掉之前的值:1。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 1
    127.0.0.1:6379> GIS.GET hangzhou campus
    "POLYGON((30 10,40 40,20 40,10 20,30 10))"

GIS.GET

  • 语法

    GIS.GET <area> <polygonName>

  • 时间复杂度

    O(1)

  • 命令描述

    在area中查找名为PolygonName的多边形的WKT信息。

  • 返回值
    • 成功:返回查询到的WKT。
    • area或者polygonName不存在:nil。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.GET hangzhou campus
    "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.GET hangzhou not-exists
    (nil)
    127.0.0.1:6379> GIS.GET not-exists campus
    (nil)

GIS.DEL

  • 语法

    GIS.DEL <area> <polygonName>

  • 时间复杂度

    O(log n)

  • 命令描述

    删除area下的名为PolygonName的多边形。

  • 返回值
    • 成功:OK。
    • area或者polygonName不存在:nil。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.GET hangzhou campus
    "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.DEL hangzhou not-exists
    (nil)
    127.0.0.1:6379> GIS.DEL not-exists campus
    (nil)
    127.0.0.1:6379> GIS.DEL hangzhou campus
    OK
    127.0.0.1:6379> GIS.GET hangzhou campus
    (nil)

GIS.SEARCH

  • 语法

    GIS.SEARCH <area> <POINT/LINESTRING/POLYGONNAME>

  • 时间复杂度
    • 最好情况:O(logM n)
    • 最差情况:log(n)
  • 命令描述

    查找一个点/线/面所在的多边形,返回多边形的名称和WKT信息。

  • 返回值
    • 成功:返回查询到的WKT。
    • 未查询到:nil。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.SEARCH hangzhou 'POINT (30 11)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.SEARCH hangzhou 'LINESTRING (30 10, 40 40)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.SEARCH hangzhou 'POLYGON ((31 20, 29 20, 29 21, 31 31))'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"

GIS.CONTAINS

  • 语法

    GIS.CONTAINS <area> <POINT/LINESTRING/POLYGONNAME>

  • 时间复杂度
    • 最好情况:O(logM n)
    • 最差情况:log(n)
  • 命令描述

    判断指定的点/线/面是否包含在area中的某个多边形内。

  • 返回值
    • 成功:返回包含指定点/线/面的多边形的WKT信息。
    • 未查询到:nil。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.CONTAINS hangzhou 'POINT (30 11)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.CONTAINS hangzhou 'LINESTRING (30 10, 40 40)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.CONTAINS hangzhou 'POLYGON ((31 20, 29 20, 29 21, 31 31))'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"

GIS.INTERSECTS

  • 语法

    GIS.INTERSECTS <area> <POINT/LINESTRING/POLYGONNAME>

  • 时间复杂度
    • 最好情况:O(logM n)
    • 最差情况:log(n)
  • 命令描述

    判断指定的点/线/面与area中的某个多边形的相交情况。

  • 返回值
    • 成功:返回与指定点/线/面相交的多边形的WKT信息。
    • 未查询到:nil。
    • 其它情况返回相应的异常信息。
  • 使用示例
    127.0.0.1:6379> GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    (integer) 0
    127.0.0.1:6379> GIS.INTERSECTS hangzhou 'POINT (30 11)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.INTERSECTS hangzhou 'LINESTRING (30 10, 40 40)'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379> GIS.INTERSECTS hangzhou 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
    1) "0"
    2) 1) "campus"
       2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
    127.0.0.1:6379>