TairGIS est une structure de données SIG basée sur des index R-tree qui permet de stocker et d'interroger des points, des linestrings et des polygones au format Well-Known Text (WKT). Contrairement aux commandes GEO natives de Redis — qui utilisent GeoHash et Sorted Set pour gérer uniquement les requêtes ponctuelles — TairGIS prend en charge les requêtes de relations spatiales (contains, within, intersects) et la recherche de proximité par rayon pour les trois types de géométries.
Le module est open source. Pour plus d'informations, consultez TairGIS.
Concepts clés
Requêtes de relations spatiales : contains, within et intersects
Ces trois commandes interrogent différentes relations directionnelles entre une géométrie fournie et les formes stockées dans une zone. La distinction est importante car GIS.CONTAINS et GIS.WITHIN peuvent sembler similaires, mais fonctionnent dans des directions opposées :
GIS.CONTAINS — identifie les formes stockées qui contiennent votre entrée. Utilisez cette commande lorsque vous disposez d'un point (comme la position GPS d'un utilisateur) et souhaitez savoir quelles régions stockées l'englobent. Par exemple : « Dans quelles zones de livraison cette adresse se situe-t-elle ? »
GIS.WITHIN — identifie les formes stockées qui se trouvent à l'intérieur de votre entrée. Utilisez cette commande lorsque vous disposez d'une grande forme englobante et souhaitez savoir quelles formes stockées y tiennent entièrement. Par exemple : « Quels parkings sont entièrement situés dans ce district ? »
GIS.INTERSECTS — identifie les formes stockées qui partagent des coordonnées avec votre entrée. Utilisez cette commande lorsqu'un chevauchement partiel suffit. Par exemple : « Quelles routes traversent cette zone de construction ? »
Types de géométrie WKT
TairGIS utilise le format Well-Known Text (WKT) pour décrire les géométries. Les trois types suivent le format TYPE (coordinates) :
| Type | Exemple WKT | Contrainte |
|---|---|---|
| POINT | 'POINT (120.086631 30.138141)' |
Longitude en premier, puis latitude |
| LINESTRING | 'LINESTRING (30 10, 40 40)' |
Au moins deux paires de coordonnées |
| POLYGON | 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))' |
Trois paires de coordonnées ou plus ; la première et la dernière doivent correspondre |
Plage de longitude valide : -180 à 180. Plage de latitude valide : -90 à 90.
Les types MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRY et COLLECTION ne sont pas pris en charge.
Le paramètre area
Chaque commande TairGIS accepte un argument area comme premier paramètre. Une area est un conteneur logique — une clé Redis — qui regroupe des géométries connexes. Toutes les formes ajoutées à la même area peuvent être interrogées ensemble.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Tair basée sur DRAM
Mettez à jour votre instance vers la dernière version mineure pour bénéficier de davantage de fonctionnalités et d'une stabilité accrue. Pour plus d'informations, consultez Mettre à jour la version mineure d'une instance . Pour les instances en cluster ou avec séparation lecture/écriture , mettez également à jour les nœuds proxy vers la dernière version mineure afin de garantir le bon fonctionnement de toutes les commandes.
Notes d'utilisation
Les données TairGIS sont stockées sur l'instance Tair.
Commandes prises en charge
| Commande | Syntaxe | Description |
|---|---|---|
| GIS.ADD | GIS.ADD area polygonName polygonWkt [polygonName polygonWkt ...] |
Ajoute une ou plusieurs géométries décrites en WKT à une area |
| GIS.GET | GIS.GET area polygonName |
Récupère le WKT d'une géométrie nommée |
| GIS.GETALL | GIS.GETALL area [WITHOUTWKT] |
Récupère tous les noms de géométrie (et éventuellement leur WKT) dans une area |
| GIS.CONTAINS | GIS.CONTAINS area polygonWkt [WITHOUTWKT] |
Renvoie les géométries stockées qui contiennent la géométrie d'entrée |
| GIS.WITHIN | GIS.WITHIN area polygonWkt [WITHOUTWKT] |
Renvoie les géométries stockées situées à l'intérieur de la géométrie d'entrée |
| GIS.INTERSECTS | GIS.INTERSECTS area polygonWkt |
Renvoie les géométries stockées qui intersectent la géométrie d'entrée |
| GIS.SEARCH | GIS.SEARCH area [RADIUS lon lat dist M|KM|FT|MI] [MEMBER field dist M|KM|FT|MI] [GEOM geom] [COUNT count] [ASC|DESC] [WITHDIST] [WITHOUTWKT] |
Interroge les points situés dans un rayon ou une limite polygonale |
| GIS.DEL | GIS.DEL area polygonName |
Supprime une géométrie nommée d'une area |
| DEL | DEL key [key ...] |
Supprime une ou plusieurs clés TairGIS (commande native Redis) |
Conventions de syntaxe des commandes :
UPPERCASE: mot-clé de commande*
Italics* : variable[options]: paramètre facultatif ; les paramètres sans crochets sont obligatoiresA|B: mutuellement exclusif — spécifiez-en un seul...: le paramètre précédent peut se répéter
GIS.ADD
Ajoute une ou plusieurs géométries décrites en WKT à une area.
Time complexity| Élément | Détails |
|---|---|
| Syntaxe | GIS.ADD area polygonName polygonWkt [polygonName polygonWkt ...] |
| Complexité temporelle |
O(log n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonName |
Le nom de la géométrie |
polygonWkt |
La géométrie au format WKT. Types pris en charge : POINT, LINESTRING, POLYGON |
WKT (Well-Known Text) est un langage de balisage textuel standard pour représenter des objets de géométrie vectorielle, des systèmes de référence spatiale et les transformations entre ces systèmes.
Valeur de retour
Succès : le nombre de géométries ajoutées ou mises à jour
Échec : un message d'erreur
Exemple
GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
Sortie :
(integer) 1
GIS.GET
Récupère le WKT d'une géométrie nommée au sein d'une area.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.GET area polygonName |
| Complexité temporelle | O(1) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonName |
Le nom de la géométrie à récupérer |
Valeur de retour
Succès : la représentation WKT de la géométrie
Introuvable (l'area ou la géométrie n'existe pas) :
nilÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.GET hangzhou campus
Sortie :
'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
GIS.GETALL
Récupère tous les noms de géométrie dans une area, avec leur WKT par défaut.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.GETALL area [WITHOUTWKT] |
| Complexité temporelle | O(n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
WITHOUTWKT |
(Facultatif) Si spécifié, renvoie uniquement les noms des géométries, sans leur WKT |
Valeur de retour
Succès : les noms des géométries et leur WKT (ou uniquement les noms si
WITHOUTWKTest spécifié)Introuvable (l'area n'existe pas) :
nilÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.GETALL hangzhou
Sortie :
1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.CONTAINS
Renvoie les géométries stockées dans une area qui contiennent la géométrie d'entrée.
Utilisez GIS.CONTAINS lorsque vous disposez d'une géométrie (comme un point de coordonnées) et souhaitez savoir quelles régions stockées l'englobent.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.CONTAINS area polygonWkt [WITHOUTWKT] |
| Complexité temporelle | Optimal : O(log² n) ; pire cas : O(log n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonWkt |
La géométrie d'entrée au format WKT. Types pris en charge : POINT, LINESTRING, POLYGON |
WITHOUTWKT |
(Facultatif) Si spécifié, renvoie uniquement les noms des géométries, sans leur WKT |
Valeur de retour
Succès : le nombre et le WKT des géométries qui contiennent l'entrée
Introuvable (l'area n'existe pas) :
empty list or setÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
L'exemple suivant vérifie quels polygones stockés contiennent le point situé aux coordonnées (30, 11) :
GIS.CONTAINS hangzhou 'POINT (30 11)'
Sortie :
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.WITHIN
Renvoie les géométries stockées dans une area qui se trouvent entièrement à l'intérieur de la géométrie d'entrée.
Utilisez GIS.WITHIN lorsque vous disposez d'une limite (comme un polygone de district) et souhaitez savoir quelles formes stockées y sont complètement incluses.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.WITHIN area polygonWkt [WITHOUTWKT] |
| Complexité temporelle | Optimal : O(log² n) ; pire cas : O(log n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonWkt |
La géométrie d'entrée au format WKT. Types pris en charge : POINT, LINESTRING, POLYGON |
WITHOUTWKT |
(Facultatif) Si spécifié, renvoie uniquement les noms des géométries, sans leur WKT |
Les types MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRY et COLLECTION ne sont pas pris en charge.
Valeur de retour
Succès : le nombre et le WKT des géométries situées à l'intérieur de l'entrée
Introuvable (l'area n'existe pas) :
empty list or setÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
L'exemple suivant vérifie quels polygones stockés se trouvent à l'intérieur du grand polygone englobant :
GIS.WITHIN hangzhou 'POLYGON ((30 5, 50 50, 20 50, 5 20, 30 5))'
Sortie :
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.INTERSECTS
Renvoie les géométries stockées dans une area qui partagent des coordonnées avec la géométrie d'entrée.
Utilisez GIS.INTERSECTS lorsqu'un chevauchement partiel suffit, par exemple pour trouver toutes les routes qui traversent une zone de construction.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.INTERSECTS area polygonWkt |
| Complexité temporelle | Optimal : O(log² n) ; pire cas : O(log n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonWkt |
La géométrie d'entrée au format WKT. Types pris en charge : POINT, LINESTRING, POLYGON |
WITHOUTWKT |
(Facultatif) Si spécifié, renvoie uniquement les noms des géométries, sans leur WKT |
Valeur de retour
Succès : le nombre et le WKT des géométries qui intersectent l'entrée
Introuvable (l'area n'existe pas) :
empty list or setÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
L'exemple suivant vérifie quels polygones stockés intersectent la linestring allant de (30, 10) à (40, 40) :
GIS.INTERSECTS hangzhou 'LINESTRING (30 10, 40 40)'
Sortie :
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.SEARCH
Interroge les géométries ponctuelles dans une area qui se situent dans un rayon donné ou une limite polygonale. Cette commande est l'équivalent TairGIS de la commande native Redis GEORADIUS.
Spécifiez exactement l'une des options RADIUS, MEMBER ou GEOM pour définir la limite de recherche.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.SEARCH area [RADIUS lon lat dist M|KM|FT|MI] [MEMBER field dist M|KM|FT|MI] [GEOM geom] [COUNT count] [ASC|DESC] [WITHDIST] [WITHOUTWKT] |
| Complexité temporelle | Optimal : O(log² n) ; pire cas : O(log n) |
Options de limite de recherche (spécifiez-en exactement une)
| Option | Description | Exemple |
|---|---|---|
RADIUS lon lat dist unit |
Recherche dans un rayon de dist autour de la longitude et de la latitude données. Unités : M (mètre), KM (kilomètre), FT (pied), MI (mile) |
RADIUS 15 37 200 KM |
MEMBER field dist unit |
Utilise un point stocké comme centre et recherche dans un rayon de dist autour de celui-ci |
MEMBER Agrigento 100 KM |
GEOM geom |
Recherche à l'intérieur du polygone défini par une chaîne WKT | GEOM 'POLYGON((10 30,20 30,20 40,10 40))' |
Options supplémentaires
| Option | Description |
|---|---|
COUNT count |
Limite le nombre de résultats renvoyés. Exemple : COUNT 3 |
ASC |
Renvoie les résultats triés par distance, du plus proche au plus éloigné |
DESC |
Renvoie les résultats triés par distance, du plus éloigné au plus proche |
WITHDIST |
Renvoie la distance entre chaque point de résultat et le point central spécifié |
WITHOUTWKT |
Renvoie uniquement les noms des géométries, sans leur WKT |
Valeur de retour
Succès : le nombre et le WKT des points correspondants
Introuvable (l'area n'existe pas) :
empty list or setÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD Sicily "Palermo" "POINT (13.361389 38.115556)" "Catania" "POINT(15.087269 37.502669)".
L'exemple suivant trouve tous les points dans l'area Sicily situés dans un rayon de 200 km autour de (15, 37), triés par distance :
GIS.SEARCH Sicily RADIUS 15 37 200 km WITHDIST ASC
Sortie :
1) (integer) 2
2) 1) "Catania"
2) "POINT(15.087269 37.502669)"
3) "56.4413"
4) "Palermo"
5) "POINT(13.361389 38.115556)"
6) "190.4424"
GIS.DEL
Supprime une géométrie nommée d'une area.
| Élément | Détails |
|---|---|
| Syntaxe | GIS.DEL area polygonName |
| Complexité temporelle | O(log n) |
Paramètres
| Paramètre | Description |
|---|---|
area |
L'area (clé) qui regroupe les géométries connexes |
polygonName |
Le nom de la géométrie à supprimer |
Valeur de retour
Succès :
OKIntrouvable (l'area ou la géométrie n'existe pas) :
nilÉchec : un message d'erreur
Exemple
Prérequis : exécutez GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.DEL hangzhou campus
Sortie :
OK