O TairGIS é uma estrutura de dados GIS baseada em índices R-tree que permite armazenar e consultar pontos, linestrings e polígonos no formato WKT (well-known text). Diferentemente dos comandos GEO nativos do Redis — que utilizam GeoHash e Sorted Set apenas para consultas de pontos — o TairGIS suporta consultas de relacionamento espacial (contains, within, intersects) e busca por proximidade baseada em raio para os três tipos de geometria.
Este módulo é open source. Para mais informações, consulte TairGIS.
Conceitos principais
Consultas de relacionamento espacial: contains, within e intersects
Esses três comandos consultam diferentes relações direcionais entre uma geometria fornecida por você e as formas armazenadas em uma área. A distinção é importante porque GIS.CONTAINS e GIS.WITHIN parecem semelhantes, mas operam em direções opostas:
GIS.CONTAINS — localiza formas armazenadas que contêm sua entrada. Utilize este comando quando você tiver um ponto (como a localização GPS de um usuário) e precisar saber quais regiões armazenadas o englobam. Exemplo: "Em quais zonas de entrega este endereço está localizado?"
GIS.WITHIN — localiza formas armazenadas que estão dentro da sua entrada. Recomendado quando você possui uma forma delimitadora grande e deseja identificar quais formas armazenadas cabem inteiramente nela. Exemplo: "Quais estacionamentos estão totalmente dentro deste distrito?"
GIS.INTERSECTS — localiza formas armazenadas que compartilham quaisquer coordenadas com sua entrada. Ideal para casos em que a sobreposição parcial é suficiente. Exemplo: "Quais estradas cruzam esta zona de construção?"
Tipos de geometria WKT
O TairGIS utiliza o formato WKT (well-known text) para descrever geometrias. Todos os três tipos seguem o formato TYPE (coordinates):
|
Tipo |
Exemplo WKT |
Restrição |
|
POINT |
|
Longitude primeiro, depois latitude |
|
LINESTRING |
|
Pelo menos dois pares de coordenadas |
|
POLYGON |
|
Três ou mais pares de coordenadas; o primeiro e o último devem ser iguais |
Intervalo válido de longitude: -180 a 180. Intervalo válido de latitude: -90 a 90.
Os tipos MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRY e COLLECTION não são suportados.
O parâmetro area
Todo comando do TairGIS recebe um argumento area como primeiro parâmetro. Uma área é um contêiner lógico — uma chave do Redis — que agrupa geometrias relacionadas. Todas as formas adicionadas à mesma área podem ser consultadas em conjunto.
Pré-requisitos
Antes de começar, certifique-se de ter:
Uma instância Tair baseada em DRAM
Atualize sua instância para a versão secundária mais recente para obter mais recursos e maior estabilidade. Para mais informações, consulte Atualizar a versão secundária de uma instância . Para instâncias cluster ou leitura/gravação dividida , atualize também os nós de proxy para a versão secundária mais recente, garantindo que todos os comandos sejam executados conforme o esperado.
Notas de uso
Os dados do TairGIS são armazenados na instância Tair.
Comandos suportados
|
Comando |
Sintaxe |
Descrição |
|||||||
|
|
Adiciona uma ou mais geometrias descritas em WKT a uma área |
||||||||
|
|
Recupera o WKT de uma geometria nomeada |
||||||||
|
|
Recupera todos os nomes de geometrias (e opcionalmente seus WKT) em uma área |
||||||||
|
|
Retorna geometrias armazenadas que contêm a geometria de entrada |
||||||||
|
|
Retorna geometrias armazenadas que estão dentro da geometria de entrada |
||||||||
|
|
Retorna geometrias armazenadas que interceptam a geometria de entrada |
||||||||
|
|
KM |
FT |
MI] [MEMBER field dist M |
KM |
FT |
MI] [GEOM geom] [COUNT count] [ASC |
DESC] [WITHDIST] [WITHOUTWKT]` |
Consulta pontos dentro de um raio ou limite de polígono |
|
|
|
Exclui uma geometria nomeada de uma área |
||||||||
|
|
Exclui uma ou mais chaves do TairGIS (comando nativo do Redis) |
Convenções de sintaxe de comandos:
MAIÚSCULAS: palavra-chave do comando*
Itálico*: variável[opções]: parâmetro opcional; parâmetros sem colchetes são obrigatóriosA|B: mutuamente exclusivos — especifique apenas um...: o parâmetro anterior pode se repetir
GIS.ADD
Adiciona uma ou mais geometrias descritas em WKT a uma área.
Time complexity|
Item |
Detalhes |
|
Sintaxe |
|
|
O(log n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
O nome da geometria |
|
|
A geometria no formato WKT. Tipos suportados: POINT, LINESTRING, POLYGON |
WKT (well-known text) é uma linguagem de marcação de texto padrão para representar objetos de geometria vetorial, sistemas de referência espacial e transformações entre sistemas de referência espacial.
Valor de retorno
Sucesso: a quantidade de geometrias adicionadas ou atualizadas
Falha: uma mensagem de erro
Exemplo
GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
Saída:
(integer) 1
GIS.GET
Recupera o WKT de uma geometria nomeada dentro de uma área.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
O(1) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
O nome da geometria a ser recuperada |
Valor de retorno
Sucesso: a representação WKT da geometria
Não encontrado (a área ou geometria não existe):
nilFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.GET hangzhou campus
Saída:
'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'
GIS.GETALL
Recupera todos os nomes de geometrias em uma área, com seus respectivos WKT por padrão.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
O(n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
(Opcional) Se especificado, retorna apenas os nomes das geometrias, sem seus WKT |
Valor de retorno
Sucesso: nomes das geometrias e WKT (ou apenas nomes se
WITHOUTWKTfor especificado)Não encontrado (a área não existe):
nilFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.GETALL hangzhou
Saída:
1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.CONTAINS
Retorna as geometrias armazenadas em uma área que contêm a geometria de entrada.
Utilize GIS.CONTAINS quando você tiver uma geometria (como um ponto de coordenada) e quiser saber quais regiões armazenadas a englobam.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
Ótimo: O(log² n); pior caso: O(log n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
A geometria de entrada no formato WKT. Tipos suportados: POINT, LINESTRING, POLYGON |
|
|
(Opcional) Se especificado, retorna apenas os nomes das geometrias, sem seus WKT |
Valor de retorno
Sucesso: a quantidade e o WKT das geometrias que contêm a entrada
Não encontrado (a área não existe):
empty list or setFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
O exemplo abaixo verifica quais polígonos armazenados contêm o ponto em (30, 11):
GIS.CONTAINS hangzhou 'POINT (30 11)'
Saída:
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.WITHIN
Retorna as geometrias armazenadas em uma área que estão inteiramente dentro da geometria de entrada.
Use GIS.WITHIN quando você tiver um limite (como um polígono de distrito) e precisar saber quais formas armazenadas estão completamente dentro dele.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
Ótimo: O(log² n); pior caso: O(log n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
A geometria de entrada no formato WKT. Tipos suportados: POINT, LINESTRING, POLYGON |
|
|
(Opcional) Se especificado, retorna apenas os nomes das geometrias, sem seus WKT |
Os tipos MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRY e COLLECTION não são suportados.
Valor de retorno
Sucesso: a quantidade e o WKT das geometrias dentro da entrada
Não encontrado (a área não existe):
empty list or setFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
O exemplo a seguir verifica quais polígonos armazenados estão dentro do polígono delimitador maior:
GIS.WITHIN hangzhou 'POLYGON ((30 5, 50 50, 20 50, 5 20, 30 5))'
Saída:
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.INTERSECTS
Retorna as geometrias armazenadas em uma área que compartilham quaisquer coordenadas com a geometria de entrada.
Este comando é adequado quando a sobreposição parcial é suficiente — por exemplo, para encontrar todas as estradas que cruzam uma zona de construção.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
Ótimo: O(log² n); pior caso: O(log n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
A geometria de entrada no formato WKT. Tipos suportados: POINT, LINESTRING, POLYGON |
|
|
(Opcional) Se especificado, retorna apenas os nomes das geometrias, sem seus WKT |
Valor de retorno
Sucesso: a quantidade e o WKT das geometrias que interceptam a entrada
Não encontrado (a área não existe):
empty list or setFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
O exemplo abaixo verifica quais polígonos armazenados interceptam a linestring de (30, 10) a (40, 40):
GIS.INTERSECTS hangzhou 'LINESTRING (30 10, 40 40)'
Saída:
1) "1"
2) 1) "campus"
2) "POLYGON((30 10,40 40,20 40,10 20,30 10))"
GIS.SEARCH
Consulta geometrias de ponto em uma área que estão dentro de um determinado raio ou limite de polígono. Este comando é o equivalente no TairGIS ao comando nativo do Redis GEORADIUS.
Especifique exatamente um entre RADIUS, MEMBER ou GEOM para definir o limite de busca.
|
Item |
Detalhes |
|||||||
|
Sintaxe |
|
KM |
FT |
MI] [MEMBER field dist M |
KM |
FT |
MI] [GEOM geom] [COUNT count] [ASC |
DESC] [WITHDIST] [WITHOUTWKT]` |
|
Complexidade de tempo |
Ótimo: O(log² n); pior caso: O(log n) |
Opções de limite de busca (especifique exatamente uma)
|
Opção |
Descrição |
Exemplo |
|
|
Busca dentro de |
|
|
|
Usa um ponto armazenado como centro e busca dentro de |
|
|
|
Busca dentro do polígono definido por uma string WKT |
|
Opções adicionais
|
Opção |
Descrição |
|
|
Limita o número de resultados retornados. Exemplo: |
|
|
Retorna resultados ordenados por distância, do mais próximo ao mais distante |
|
|
Retorna resultados ordenados por distância, do mais distante ao mais próximo |
|
|
Retorna a distância entre cada ponto resultante e o ponto central especificado |
|
|
Retorna apenas os nomes das geometrias, sem seus WKT |
Valor de retorno
Sucesso: a quantidade e o WKT dos pontos correspondentes
Não encontrado (a área não existe):
empty list or setFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD Sicily "Palermo" "POINT (13.361389 38.115556)" "Catania" "POINT(15.087269 37.502669)".
O exemplo a seguir encontra todos os pontos na área Sicily dentro de 200 km de (15, 37), ordenados por distância:
GIS.SEARCH Sicily RADIUS 15 37 200 km WITHDIST ASC
Saída:
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
Exclui uma geometria nomeada de uma área.
|
Item |
Detalhes |
|
Sintaxe |
|
|
Complexidade de tempo |
O(log n) |
Parâmetros
|
Parâmetro |
Descrição |
|
|
A área (chave) que agrupa geometrias relacionadas |
|
|
O nome da geometria a ser excluída |
Valor de retorno
Sucesso:
OKNão encontrado (a área ou geometria não existe):
nilFalha: uma mensagem de erro
Exemplo
Pré-requisito: execute GIS.ADD hangzhou campus 'POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))'.
GIS.DEL hangzhou campus
Saída:
OK