{"id":19124209,"url":"https://github.com/tair-opensource/tairgis","last_synced_at":"2025-10-17T17:25:58.516Z","repository":{"id":155998685,"uuid":"632337653","full_name":"tair-opensource/TairGis","owner":"tair-opensource","description":"TairGis is a Redis Module that supports the query of intersection, contains, and within relationships between points, lines, and polygons.","archived":false,"fork":false,"pushed_at":"2023-05-06T06:02:28.000Z","size":140,"stargazers_count":43,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-05T19:24:05.744Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tair-opensource.png","metadata":{"files":{"readme":"README-CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-04-25T07:48:42.000Z","updated_at":"2024-12-09T07:05:30.000Z","dependencies_parsed_at":"2023-05-26T00:31:17.390Z","dependency_job_id":null,"html_url":"https://github.com/tair-opensource/TairGis","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tair-opensource/TairGis","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairGis","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairGis/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairGis/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairGis/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tair-opensource","download_url":"https://codeload.github.com/tair-opensource/TairGis/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tair-opensource%2FTairGis/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266342809,"owners_count":23914262,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-21T11:47:31.412Z","response_time":64,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T05:28:25.309Z","updated_at":"2025-10-17T17:25:58.447Z","avatar_url":"https://github.com/tair-opensource.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=center\u003e\n\u003cimg src=\"imgs/tairgis_logo.png\" width=\"500\"/\u003e\n\u003c/div\u003e\n\n## 简介 [English introduction](README.md)  \nTairGis 是一个 Redis Module，支持点、线、面之间相交、包含、被包含关系的判断，具有以下特点：\n- 查询性能快\n- 使用`RTree`存储\n- 通过`GIS.SEARCH`可实现Redis`GEORADIUS`命令的功能\n\n## 感谢\n特别感谢 https://github.com/tidwall/redis-gis, TairGis 依赖 redis-gis，并修复了其部分问题。\n\n## 快速开始\n```\n// 插入一个 POLYGON\n127.0.0.1:6379\u003e GIS.ADD hangzhou campus 'POLYGON ((120.028041 30.285179, 120.031203 30.28691, 120.037311 30.286239, 120.034185 30.280844))'\n(integer) 1\n// 获取 POLYGON\n127.0.0.1:6379\u003e GIS.GET hangzhou campus\n\"POLYGON((120.028041 30.285179,120.031203 30.28691,120.037311 30.286239,120.034185 30.280844))\"\n// 判断点 'POINT (120.031939 30.285179)' 和 POLYGON 是否包含\n127.0.0.1:6379\u003e GIS.CONTAINS hangzhou 'POINT (120.031939 30.285179)'\n1) (integer) 1\n2) 1) \"campus\"\n   2) \"POLYGON((120.028041 30.285179,120.031203 30.28691,120.037311 30.286239,120.034185 30.280844))\"\n// 判断线和 POLYGON 是否相交   \n127.0.0.1:6379\u003e GIS.INTERSECTS hangzhou 'LINESTRING (120.029622 30.288952, 120.035488 30.280056)'\n1) (integer) 1\n2) 1) \"campus\"\n   2) \"POLYGON((120.028041 30.285179,120.031203 30.28691,120.037311 30.286239,120.034185 30.280844))\"\n127.0.0.1:6379\u003e\n```\n\n## 编译及使用\n```\nmake\n```\n编译成功后，会在当前目录下产生`tairgis.so`文件。\n```\n./redis-server --loadmodule /path/to/tairgis.so\n```\n\n## 测试方法\n修改 tests 目录下 tairgis.tcl 文件中的路径为：`set testmodule [file your_path/tairgis.so]`\n\n将 tests 目录下 tairgis.tcl 拷贝至 redis 目录 tests 下  \n```  \ncp tests/tairgis.tcl your_redis_path/tests\n```\n将 tairgis 添加到 redis 的 test_helper.tcl 的 all_tests 中\n```      \ndiff --git a/tests/test_helper.tcl b/tests/test_helper.tcl\nindex 1a5096937..d5a1ba40a 100644\n--- a/tests/test_helper.tcl\n+++ b/tests/test_helper.tcl\n@@ -13,6 +13,7 @@ source tests/support/test.tcl\nsource tests/support/util.tcl\n\nset ::all_tests {\n+    tairgis\n```  \n在redis根目录下运行 ./runtest --single tairgis\n\n## 客户端\n| language | GitHub |\n|----------|---|\n| Java     |https://github.com/alibaba/alibabacloud-tairjedis-sdk|\n| Python   |https://github.com/alibaba/tair-py|\n| Go       |https://github.com/alibaba/tair-go|\n| .Net     |https://github.com/alibaba/AlibabaCloud.TairSDK|\n\n## API\n\n### GIS.ADD\n#### 语法及复杂度\n\u003e GIS.ADD area polygonName polygonWkt [polygonName polygonWkt ...]  \n\u003e 时间复杂度：O(log n)\n\n#### 命令描述\n\u003e 在area中添加指定名称的多边形（可添加多个），使用WKT（Well-known text）描述。WKT是一种文本标记语言，用于描述矢量几何对象、\n\u003e 空间参照系统及空间参照系统之间的转换。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonName：多边形的名称。  \n\u003e polygonWkt：多边形的描述信息，表示现实世界的经、纬度，使用WKT（Well-known text）描述，支持如下类型。\n\u003e - POINT：描述一个点的WKT信息，例如'POINT (120.086631 30.138141)'，表示该POINT位于经度120.086631，纬度30.138141。\n\u003e - LINESTRING：描述一条线的WKT信息，由两个POINT组成，例如'LINESTRING (30 10, 40 40)'。\n\u003e - POLYGON：描述一个多边形的WKT信息，由多个POINT组成，例如'POLYGON ((31 20, 29 20, 29 21, 31 31))'。  \n\u003e 说明：经度的取值范围为(-180,180)， 纬度的取值范围为(-90,90)。不支持如下集合类型：MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRY和COLLECTION。\n\n#### 返回值\n\u003e 执行成功：返回插入和更新成功的多边形数量。  \n\u003e 其它情况返回相应的异常信息。  \n\n#### 示例\n```\n127.0.0.1:6379\u003e GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'\n(integer) 1\n127.0.0.1:6379\u003e\n```\n\n### GIS.GET\n#### 语法及复杂度\n\u003e GIS.ADD area polygonName   \n\u003e 时间复杂度：O(1)\n\n#### 命令描述\n\u003e 获取目标area中指定多边形的WKT信息。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonName：多边形的名称。\n\n#### 返回值\n\u003e 执行成功：WKT信息。 \n\u003e area或polygonName不存在：nil。\n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.GET hangzhou campus\n\"POLYGON((30 10,40 40,20 40,10 20,30 10))\"\n127.0.0.1:6379\u003e\n```\n\n### GIS.GETALL\n#### 语法及复杂度\n\u003e GIS.ADD area [WITHOUTWKT]  \n\u003e 时间复杂度：O(n)\n\n#### 命令描述\n\u003e 获取目标area中所有多边形的名称和WKT信息。如果设置了WITHOUTWKT选项，仅返回多边形的名称。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e WITHOUTWKT：用于控制是否返回多边形的WKT信息，如果加上该参数，则不返回多边形的WKT信息。\n\n#### 返回值\n\u003e 执行成功：返回多边形名称和WKT信息，如果设置了WITHOUTWKT选项，仅返回多边形的名称。  \n\u003e area不存在：nil。  \n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.GETALL hangzhou\n1) \"campus\"\n2) \"POLYGON((30 10,40 40,20 40,10 20,30 10))\"\n127.0.0.1:6379\u003e\n```\n\n### GIS.DEL\n#### 语法及复杂度\n\u003e GIS.DEL area polygonName\n\u003e 时间复杂度：O(log n)\n\n#### 命令描述\n\u003e 删除目标area中指定的多边形。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonName：多边形的名称。\n\n#### 返回值\n\u003e 执行成功：OK。  \n\u003e area或polygonName不存在：nil。\n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.DEL hangzhou campus\nOK\n127.0.0.1:6379\u003e\n```\n\n### GIS.CONTAINS\n#### 语法及复杂度\n\u003e GIS.CONTAINS area polygonWkt [WITHOUTWKT]  \n\u003e 时间复杂度：最好O(log M n)，最差O(log n)\n\n#### 命令描述\n\u003e 判断指定的点、线或面是否包含在目标area的多边形中，若包含，则返回目标area中命中的多边形数量与多边形信息。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonWkt：指定与目标area进行比较的多边形描述信息，使用WKT（Well-known text）描述，支持如下类型。\n\u003e - POINT：描述一个点的WKT信息。  \n\u003e - LINESTRING：描述一条线的WKT信息。  \n\u003e - POLYGON：描述一个多边形的WKT信息。\n\u003e \n\u003e WITHOUTWKT：用于控制是否返回多边形的WKT信息，如果加上该参数，则不返回多边形的WKT信息。\n\n#### 返回值\n\u003e 执行成功：命中的多边形数量与多边形信息。  \n\u003e area不存在：empty list or set。    \n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.CONTAINS hangzhou 'POINT (30 11)'\n1) (integer) 1\n2) 1) \"campus\"\n   2) \"POLYGON((30 10,40 40,20 40,10 20,30 10))\"\n127.0.0.1:6379\u003e\n```\n\n### GIS.WITHIN\n#### 语法及复杂度\n\u003e GIS.WITHIN area polygonWkt [WITHOUTWKT]  \n\u003e 时间复杂度：最好O(log M n)，最差O(log n)\n\n#### 命令描述\n\u003e 判断目标area是否包含在指定的点、线或面中，若包含，则返回目标area中命中的多边形数量与多边形信息。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonWkt：指定与目标area进行比较的多边形描述信息，使用WKT（Well-known text）描述，支持如下类型。\n\u003e - POINT：描述一个点的WKT信息。\n\u003e - LINESTRING：描述一条线的WKT信息。\n\u003e - POLYGON：描述一个多边形的WKT信息。\n\u003e\n\u003e WITHOUTWKT：用于控制是否返回多边形的WKT信息，如果加上该参数，则不返回多边形的WKT信息。\n\n#### 返回值\n\u003e 执行成功：命中的多边形数量与多边形信息。  \n\u003e area不存在：empty list or set。    \n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.WITHIN hangzhou 'POLYGON ((30 5, 50 50, 20 50, 5 20, 30 5))'\n1) (integer) 1\n2) 1) \"campus\"\n   2) \"POLYGON((30 10,40 40,20 40,10 20,30 10))\"\n127.0.0.1:6379\u003e\n```\n\n### GIS.INTERSECTS\n#### 语法及复杂度\n\u003e GIS.INTERSECTS area polygonWkt [WITHOUTWKT]  \n\u003e 时间复杂度：最好O(log M n)，最差O(log n)\n\n#### 命令描述\n\u003e 判断指定的点、线或面与目标area的多边形是否相交，若相交，则返回目标area中与其相交的多边形数量与多边形信息。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e polygonWkt：指定与目标area进行比较的多边形描述信息，使用WKT（Well-known text）描述，支持如下类型。\n\u003e - POINT：描述一个点的WKT信息。\n\u003e - LINESTRING：描述一条线的WKT信息。\n\u003e - POLYGON：描述一个多边形的WKT信息。\n\u003e\n\u003e WITHOUTWKT：用于控制是否返回多边形的WKT信息，如果加上该参数，则不返回多边形的WKT信息。\n\n#### 返回值\n\u003e 执行成功：命中的多边形数量与多边形信息。  \n\u003e area不存在：empty list or set。    \n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行 GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'命令  \n\n127.0.0.1:6379\u003e GIS.INTERSECTS hangzhou 'LINESTRING (30 10, 40 40)'\n1) (integer) 1\n2) 1) \"campus\"\n   2) \"POLYGON((30 10,40 40,20 40,10 20,30 10))\"\n127.0.0.1:6379\u003e\n```\n\n### GIS.SEARCH\n#### 语法及复杂度\n\u003e GIS.SEARCH area [RADIUS longitude latitude distance m|km|ft|mi]  \n\u003e [MEMBER field distance m|km|ft|mi]   \n\u003e [GEOM geom]  \n\u003e [COUNT count]  \n\u003e [LIMIT limit]  \n\u003e [ASC|DESC]  \n\u003e [WITHDIST]  \n\u003e [WITHOUTWKT]  \n\u003e 时间复杂度：最好O(log M n)，最差O(log n)\n\n#### 命令描述\n\u003e 在指定经、纬度及半径距离范围内，查找目标area中的点。\n\n#### 参数描述\n\u003e area：一个几何概念。  \n\u003e RADIUS：传入经度（longitude）、纬度（latitude）、半径距离（distance）和半径单位（m表示米、km表示千米、ft表示英尺、mi表示英里）进行搜索，例如RADIUS 15 37 200 km。  \n\u003e MEMBER：选择当前area中已存在的POINT作为搜索原点，并指定半径进行搜索，取值顺序为多边形名称（field）、半径（distance）、半径单位（m表示米、km表示千米、ft表示英尺、mi表示英里），例如MEMBER Agrigento 100 km。\n\u003e GEOM：按照WKT的格式设置搜索范围，可以是任意多边形，例如GEOM 'POLYGON((10 30,20 30,20 40,10 40))'。  \n\u003e COUNT：用于限定返回的个数，例如COUNT 3。  \n\u003e LIMIT：Limit 与 Count 的区别是 Limit 是在搜索过程完成，只要搜索到 limit 个元素，就停止搜索（并不一定是最近的范围）；但 Count 是搜索完所有元素并排序之后再进行过滤。    \n\u003e ASC|DESC：用于控制返回信息按照距离排序，ASC表示根据中心位置，由近到远排序；DESC表示由远到近排序。  \n\u003e WITHDIST：用于控制是否返回目标点与搜索原点的距离。  \n\u003e WITHOUTWKT：用于控制是否返回多边形的WKT信息，如果加上该参数，则不返回多边形的WKT信息。\n\u003e \n\u003e 说明:只能同时使用RADIUS、MEMBER和GEOM中的一种方式。\n\n#### 返回值\n\u003e 执行成功：命中的目标点数量与WKT信息。    \n\u003e area不存在：empty list or set。    \n\u003e 其它情况返回相应的异常信息。\n\n#### 示例\n```\n提前执行GIS.ADD Sicily \"Palermo\" \"POINT (13.361389 38.115556)\" \"Catania\" \"POINT(15.087269 37.502669)\"命令。 \n\n127.0.0.1:6379\u003e GIS.SEARCH Sicily RADIUS 15 37 200 km WITHDIST ASC\n1) (integer) 2\n2) 1) \"Catania\"\n   2) \"POINT(15.087269 37.502669)\"\n   3) \"56.4413\"\n   4) \"Palermo\"\n   5) \"POINT(13.361389 38.115556)\"\n   6) \"190.4424\"\n127.0.0.1:6379\u003e\n```\n\n## Tair Modules\n[TairHash](https://github.com/alibaba/TairHash): 和redis hash类似，但是可以为field设置expire和version，支持高效的主动过期和被动过期。  \n[TairZset](https://github.com/alibaba/TairZset): 和redis zset类似，但是支持多（最大255）维排序，同时支持incrby语义，非常适合游戏排行榜场景。  \n[TairString](https://github.com/alibaba/TairString): 和redis string类似，但是支持设置expire和version，并提供CAS/CAD等实用命令，非常适用于分布式锁等场景。  \n[TairGis](https://github.com/alibaba/TairGis): 一个支持点、线、面之间相交、包含、被包含关系判断的Redis Module。  ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftair-opensource%2Ftairgis","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftair-opensource%2Ftairgis","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftair-opensource%2Ftairgis/lists"}