Lorsque les plateformes de commerce électronique doivent faire correspondre la localisation d'un consommateur à la zone de livraison d'un magasin, les requêtes adressées aux bases de données sur disque comme MySQL ou PostGIS peuvent devenir un goulot d'étranglement à grande échelle. TairGIS, une structure de données géospatiales dans Tair (Enterprise Edition), utilise des index R-tree pour exécuter les requêtes CONTAINS, WITHIN et INTERSECTS en quelques millisecondes, ce qui le rend particulièrement adapté aux scénarios d'achat en ligne et de retrait en magasin (BOPIS) et de livraison intra-urbaine où une faible latence est cruciale.
Ce guide explique comment utiliser TairGIS pour créer un service de recherche de magasins : à partir des coordonnées d'un consommateur, identifiez les magasins dont la zone de service couvre cette localisation.
Pourquoi choisir TairGIS plutôt que MySQL ou PostGIS
| Facteur | MySQL / PostGIS | TairGIS |
|---|---|---|
| Stockage | Sur disque | En mémoire |
| Latence des requêtes | Lente pour les grands volumes de données | Quelques millisecondes |
| Type d'index | B-tree / GiST | R-tree |
| Opérations spatiales | API GIS complète | CONTAINS, WITHIN, INTERSECTS |
Fonctionnement
Chaque magasin sur une plateforme de commerce électronique définit une zone de service, c'est-à-dire la zone géographique dans laquelle il accepte les commandes. Une zone de service peut être un district spécifique, une zone de forme irrégulière ou un cercle d'un rayon donné autour du magasin.
Lorsqu'un consommateur passe une commande, le système vérifie si sa localisation se trouve à l'intérieur de la zone de service d'un magasin. TairGIS gère cette opération grâce à deux fonctions :
Ajoutez les zones de disponibilité des magasins d'une marque à TairGIS.
Recherchez les magasins disponibles situés à proximité d'un consommateur en fonction de sa localisation.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Tair (Enterprise Edition) avec TairGIS activé
Python 3.8
Le SDK Tair-py installé : exécutez
pip3 install tair
Se connecter à une instance Tair
Créez une connexion à votre instance Tair. Remplacez les valeurs d'espace réservé par votre endpoint réel et votre mot de passe.
# -*- coding: utf-8 -*-
from typing import Dict
from tair import Tair
from tair import ResponseError
def get_tair() -> Tair:
"""
Connect to a Tair instance.
- host: the endpoint of your Tair instance
- port: the port number (default: 6379)
- password: the password of the default database account.
To connect with a custom database account, use the username:password format.
"""
tair: Tair = Tair(
host="r-8vb************.redis.zhangbei.rds.aliyuncs.com",
port=6379,
db=0,
password="D******23",
decode_responses=True
)
return tair
Ajouter des zones de service de magasin
Utilisez GIS.ADD pour stocker la zone de service de chaque magasin sous forme de géométrie POLYGON Well-Known Text (WKT). Regroupez les magasins par ID de marque afin de pouvoir interroger tous les magasins d'une marque donnée en un seul appel.
def add_brand_store(brandID: str, mapping: Dict[str, str]) -> bool:
"""
Add service areas for all stores of a brand using GIS.ADD.
- brandID: the brand identifier (used as the TairGIS key)
- mapping: a dict mapping store IDs to their WKT POLYGON geometries
"""
try:
tair = get_tair()
ret = tair.gis_add(brandID, mapping)
return ret == 1
except ResponseError as e:
print(e)
return False
Rechercher les magasins disponibles selon la localisation du consommateur
Utilisez gis_contains pour déterminer quels magasins incluent la localisation du consommateur dans leur zone de service. Transmettez les coordonnées du consommateur sous forme de géométrie WKT POINT.
def get_service_store(brandID: str, user_location: str):
"""
Return stores whose service area contains the consumer's location.
- brandID: the brand identifier
- user_location: the consumer's location as a WKT POINT, e.g. 'POINT(lon lat)'
"""
try:
tair = get_tair()
return tair.gis_contains(brandID, user_location)
except:
return None
(Facultatif) Interroger toutes les zones de service d'une marque
Utilisez GIS.GETALL pour récupérer les zones de service de tous les magasins d'une marque donnée. Cette opération s'avère utile pour le débogage ou pour créer une vue cartographique des magasins.
def get_brand_all(brandID):
"""
Return all stores and their service areas for a brand using GIS.GETALL.
"""
try:
tair = get_tair()
return tair.gis_getall(brandID)
except:
return None
Exemple
L'exemple suivant ajoute deux magasins pour brand1, récupère toutes les zones de service, puis identifie le magasin qui dessert un consommateur situé aux coordonnées (120.19707, 30.19539).
if __name__ == "__main__":
tair = get_tair()
# Add service areas for two stores of brand1
add_brand_store(
"brand1",
{
"store_1": "POLYGON ((120.14772 30.19513, 120.15370 30.17838, 120.19385 30.18011, 120.18853 30.20817))",
"store_2": "POLYGON ((120.18986 30.20852, 120.19651 30.17988, 120.22512 30.17978, 120.21667 30.22292))"
},
)
print("Query all the stores of brand1 and their available scopes:")
print(get_brand_all('brand1'))
print("Query the available stores for a consumer who is located at coordinates (120.19707, 30.19539):")
print(get_service_store('brand1', 'POINT(120.19707 30.19539)'))
Sortie attendue :
Query all the stores of brand1 and their available scopes.
['store_1', 'POLYGON((120.14772 30.19513,120.1537 30.17838,120.19385 30.18011,120.18853 30.20817))', 'store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']
Query the available stores for a consumer who is located at coordinates (120.19707, 30.19539).
[1, ['store_2', 'POLYGON((120.18986 30.20852,120.19651 30.17988,120.22512 30.17978,120.21667 30.22292))']]
Le magasin disponible pour le consommateur situé aux coordonnées (120.19707, 30.19539) est store_2.
Étapes suivantes
Implémenter des clôtures numériques à l'aide de TairGIS — utilisez TairGIS pour surveiller si une entité suivie entre ou sort d'une limite géographique définie
Référence des commandes TairGIS — référence complète pour GIS.ADD, GIS.GETALL, GIS.CONTAINS et autres commandes TairGIS