Operadores geométricosCompatible with Milvus 2.6.4+
O Milvus suporta um conjunto de operadores para filtragem espacial nos campos GEOMETRY, essenciais para a gestão e análise de dados geométricos. Estes operadores permitem recuperar entidades com base nas relações geométricas entre objectos.
Todos os operadores de geometria funcionam com dois argumentos geométricos: o nome do campo GEOMETRY definido no esquema da coleção e um objeto geométrico de destino representado no formato Well-Known Text (WKT).
Sintaxe de utilização
Para filtrar num campo GEOMETRY, utilize um operador de geometria numa expressão:
Geral:
{operator}(geo_field, '{wkt}')Baseado em distância:
ST_DWITHIN(geo_field, '{wkt}', distance)
Onde:
operatoré um dos operadores de geometria suportados (por exemplo,ST_CONTAINS,ST_INTERSECTS). Os nomes dos operadores devem estar todos em maiúsculas ou minúsculas. Para obter uma lista dos operadores suportados, consulte Operadores de geometria suportados.geo_fieldé o nome do seu campoGEOMETRY.'{wkt}'é a representação WKT da geometria a consultar.distanceé o limiar específico paraST_DWITHIN.
Para saber mais sobre os campos GEOMETRY no Milvus, consulte Campo Geométrico.
Operadores de geometria suportados
A tabela seguinte apresenta uma lista dos operadores geométricos disponíveis no Milvus.
Os nomes dos operadores devem ser todos em maiúsculas ou em minúsculas. Não misture maiúsculas e minúsculas no mesmo nome de operador.
Operador |
Descrição do operador |
Exemplo |
|---|---|---|
|
Devolve TRUE se duas geometrias forem espacialmente idênticas, o que significa que têm o mesmo conjunto de pontos e dimensão. |
Duas geometrias (A e B) são exatamente iguais no espaço? |
|
Retorna VERDADEIRO se a geometria A contém completamente a geometria B, com os seus interiores tendo pelo menos um ponto em comum. |
Um limite de uma cidade (A) contém um parque específico (B)? |
|
Retorna TRUE se as geometrias A e B se intersectam parcialmente mas não se contêm totalmente. |
Duas estradas (A e B) cruzam-se numa intersecção? |
|
Retorna VERDADEIRO se as geometrias A e B tiverem pelo menos um ponto em comum. Esta é a consulta espacial mais geral e mais utilizada. |
Uma área de pesquisa (A) intersecta-se com alguma das localizações de lojas (B)? |
|
Devolve VERDADEIRO se as geometrias A e B tiverem a mesma dimensão, se sobrepuserem parcialmente e nenhuma delas contiver totalmente a outra. |
Duas parcelas de terreno (A e B) sobrepõem-se? |
|
Retorna TRUE se as geometrias A e B partilham um limite comum mas os seus interiores não se intersectam. |
Duas propriedades vizinhas (A e B) partilham uma fronteira? |
|
Devolve TRUE se a geometria A estiver completamente contida na geometria B, com os seus interiores a terem pelo menos um ponto em comum. É o inverso de |
Um ponto de interesse específico (A) está dentro de um raio de pesquisa definido (B)? |
|
Devolve TRUE se a distância entre a geometria A e a geometria B for inferior ou igual à distância especificada. Nota: Atualmente, a geometria B apenas suporta pontos. A unidade de distância é metros. |
Encontra todos os pontos num raio de 5000 metros de um ponto específico (B). |
ST_EQUALS / st_equals
O operador ST_EQUALS devolve TRUE se duas geometrias forem espacialmente idênticas, o que significa que têm o mesmo conjunto de pontos e dimensão. Isto é útil para verificar se dois objectos geométricos armazenados representam exatamente a mesma localização e forma.
Exemplo
Suponha que pretende verificar se uma geometria armazenada (como um ponto ou um polígono) é exatamente igual a uma geometria de destino. Por exemplo, é possível comparar um ponto armazenado com um ponto de interesse específico.
# The filter expression to check if a geometry matches a specific point
filter = "ST_EQUALS(geo_field, 'POINT(10 20)')"
ST_CONTAINS / st_contains
O operador ST_CONTAINS devolve TRUE se a primeira geometria contiver completamente a segunda geometria. Isto é útil para encontrar pontos dentro de um polígono, ou polígonos mais pequenos dentro de um polígono maior.
Exemplo
Imagine que tem uma coleção de distritos de uma cidade e quer encontrar um ponto de interesse específico, como um restaurante, que se situa dentro dos limites de um determinado distrito.
# The filter expression to find geometries completely within a specific polygon.
filter = "ST_CONTAINS(geo_field, 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))')"
ST_CROSSES / st_crosses
O operador ST_CROSSES devolve TRUE se a intersecção de duas geometrias formar uma geometria com uma dimensão inferior à das geometrias originais. Isto aplica-se normalmente a uma linha que atravessa um polígono ou outra linha.
Exemplo
Pretende encontrar todos os percursos pedestres (cadeias de linhas) que atravessam uma linha de limite específica (outra cadeia de linhas) ou que entram numa área protegida (polígono).
# The filter expression to find geometries that cross a line string.
filter = "ST_CROSSES(geo_field, 'LINESTRING(5 0, 5 10)')"
ST_INTERSECTS / st_intersects
O operador ST_INTERSECTS devolve TRUE se duas geometrias tiverem em comum algum ponto dos seus limites ou interiores. Trata-se de um operador de uso geral para detetar qualquer forma de sobreposição espacial.
Exemplo
Se tiver uma coleção de estradas e quiser encontrar todas as estradas que cruzam ou tocam uma linha específica que representa uma nova estrada proposta, pode utilizar ST_INTERSECTS.
# The filter expression to find geometries that intersect with a specific line string.
filter = "ST_INTERSECTS(geo_field, 'LINESTRING (1 1, 2 2)')"
ST_OVERLAPS / st_overlaps
O operador ST_OVERLAPS devolve TRUE se duas geometrias da mesma dimensão tiverem uma intersecção parcial, em que a própria intersecção tem a mesma dimensão que as geometrias originais, mas não é igual a nenhuma delas.
Exemplo
Tem um conjunto de regiões de vendas sobrepostas e pretende encontrar todas as regiões que se sobrepõem parcialmente a uma nova zona de vendas proposta.
# The filter expression to find geometries that partially overlap with a polygon.
filter = "ST_OVERLAPS(geo_field, 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')"
ST_TOUCHES / st_touches
O operador ST_TOUCHES devolve TRUE se os limites de duas geometrias se tocarem, mas os seus interiores não se intersectarem. Isto é útil para detetar adjacências.
Exemplo
Se tiver um mapa de parcelas de propriedade e quiser encontrar todas as parcelas que são diretamente adjacentes a um parque público sem qualquer sobreposição.
# The filter expression to find geometries that only touch a line string at their boundaries.
filter = "ST_TOUCHES(geo_field, 'LINESTRING(0 0, 1 1)')"
ST_WITHIN / st_within
O operador ST_WITHIN devolve TRUE se a primeira geometria estiver completamente dentro do interior ou no limite da segunda geometria. É o inverso de ST_CONTAINS.
Exemplo
Deseja encontrar todas as pequenas áreas residenciais que estão localizadas inteiramente dentro de uma área de parque designada maior.
# The filter expression to find geometries that are completely within a larger polygon.
filter = "ST_WITHIN(geo_field, 'POLYGON((110 38, 115 38, 115 42, 110 42, 110 38))')"
Para mais informações sobre como utilizar um campo GEOMETRY, consulte Campo de geometria.
ST_DWITHIN / st_dwithin
O operador ST_DWITHIN devolve TRUE se a distância entre a geometria A e a geometria B for inferior ou igual a um valor especificado (em metros). Atualmente, a geometria B tem de ser um ponto.
Exemplo
Suponha que tem uma coleção de localizações de lojas e pretende encontrar todas as lojas num raio de 5000 metros da localização de um cliente específico.
# Find all stores within 5000 meters of the point (120 30)
filter = "ST_DWITHIN(geo_field, 'POINT(120 30)', 5000)"