O PostGIS estende o Hologres com tipos de dados espaciais, funções e operadores. Use-o para armazenar, consultar e analisar dados geográficos — desde filtros de bounding box e buscas por proximidade até verificações de interseção de polígonos e cálculos de distância.
O Hologres oferece suporte ao PostGIS 3.0.0.
Suporte a engines
No Hologres V1.3 e versões posteriores, a maioria das funções do PostGIS executa na Hologres Query Engine (HQE), desenvolvida pela Alibaba Cloud, que proporciona melhor desempenho de consulta em comparação à PQE. Em versões anteriores à V1.3, as funções executam na PostgreSQL Query Engine (PQE), onde o desempenho pode ser inferior. Para verificar qual engine cada função utiliza, consulte Spatial functions: cada tabela de funções indica a engine correspondente ao grupo inteiro ou lista essa informação na coluna Required engine.
Instalar e desinstalar a extensão PostGIS
Execute a instrução abaixo como superusuário para instalar o PostGIS em um banco de dados. A instalação ocorre por banco de dados — repita esta etapa para cada banco que necessite de suporte espacial.
-- Install PostGIS explicitly into the public schema.
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public;
Não é possível instalar o PostGIS no schema pg_catalog.
Para verificar a instalação, execute:
SELECT public.postgis_full_version();
Uma instalação bem-sucedida retorna uma string de versão como POSTGIS="3.0.0 ...".
A função postgis_full_version() é uma função PL/pgSQL localizada no schema public. O search_path padrão do Hologres inclui o schema public, permitindo chamar a função sem prefixo de schema. Caso o search_path da sessão atual não inclua o schema public, a chamada falhará com o erro function postgis_full_version() does not exist. Os exemplos neste tópico utilizam o prefixo public. para garantir o funcionamento independentemente do search_path configurado.
Desinstalar o PostGIS
Para remover a extensão:
DROP EXTENSION postgis;
Se o banco de dados ainda contiver objetos dependentes do tipo geometry ou geography — por exemplo, uma tabela criada conforme descrito em Create and query a geometry table — a instrução falhará com a mensagem cannot drop extension postgis because other objects depend on it. Exclua primeiro os objetos dependentes:
-
Identifique os objetos e colunas que ainda utilizam algum tipo espacial:
SELECT n.nspname AS schema_name, c.relname AS object_name, a.attname AS column_name, t.typname FROM pg_attribute a JOIN pg_class c ON c.oid = a.attrelid JOIN pg_type t ON t.oid = a.atttypid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE t.typname IN ('geometry', 'geography') AND c.relkind IN ('r', 'p', 'm', 'f') AND a.attnum > 0 AND NOT a.attisdropped AND n.nspname NOT LIKE 'pg_%'; -
Exclua cada tabela retornada pela consulta ou remova apenas suas colunas espaciais:
DROP TABLE <TABLE_NAME>;NotaCaso a lixeira de tabelas esteja ativada — configuração padrão no Hologres V3.1 e versões posteriores — o comando
DROP TABLEmove a tabela para a lixeira, exigindo também a execução da próxima etapa. Para ignorar a lixeira e pular a etapa seguinte, useDROP TABLE <TABLE_NAME> FORCE;. Para mais informações, consulte Table recycle bin. -
Esvazie a lixeira. Tabelas na lixeira ainda dependem dos tipos espaciais, mantendo esses tipos em uso até que a lixeira seja esvaziada:
CALL hologres.hg_purge_all_tables();ImportanteA função
hg_purge_all_tables()exclui permanentemente todas as tabelas presentes na lixeira do banco de dados atual. Essa ação é irreversível. Antes de executá-la, confirme que a lixeira não contém nenhuma tabela ainda necessária. Um superusuário da instância atual deve executar este comando. -
Desinstale a extensão:
DROP EXTENSION postgis;
Exclua os objetos dependentes conforme descrito acima em vez de usar DROP EXTENSION postgis CASCADE, mesmo que a mensagem de erro do PostgreSQL sugira o uso de CASCADE. A opção CASCADE remove os dados da extensão (PostGIS, RoaringBitmap, Proxima, Binlog e dados BSI) juntamente com todos os objetos dependentes, incluindo metadados, tabelas, views e dados do servidor. Essa ação é irreversível.
Resolver o conflito da tabela spatial_ref_sys
Se o comando CREATE EXTENSION postgis falhar com o erro relation spatial_ref_sys already exists, significa que o banco de dados contém uma tabela de sistema spatial_ref_sys residual de uma instalação anterior. Um comando DROP EXTENSION postgis normal não deixa resíduos, portanto esse erro geralmente ocorre após uma migração de outro banco de dados ou quando uma tabela com o mesmo nome foi criada manualmente. Resolva o conflito da seguinte forma:
-
Remova a extensão parcialmente instalada:
DROP EXTENSION IF EXISTS postgis; -
Remova a tabela de sistema residual. Antes de executar esta instrução, confirme que a tabela é realmente um resíduo de instalação anterior e não uma tabela de negócios:
DROP TABLE IF EXISTS spatial_ref_sys CASCADE; -
Reinstale a extensão PostGIS:
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public; -
Verifique a instalação:
SELECT public.postgis_full_version();
Criar e consultar uma tabela geometry
O PostGIS oferece suporte a dois tipos de dados espaciais no Hologres: geometry (coordenadas planares/cartesianas) e geography (coordenadas esféricas de longitude/latitude). Para detalhes sobre o tipo geography, consulte a documentação de geography do PostGIS.
O tipo geometry é o mais utilizado. As etapas a seguir demonstram como criar uma tabela geometry e executar consultas espaciais.
1. Criar uma tabela geometry
Ao criar uma tabela, especifique um subtipo geometry se necessário. Subtipos suportados: Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon.
Sem subtipo:
CREATE TABLE holo_gis_1 (
id INT,
geom geometry,
PRIMARY KEY (id)
);
Com subtipo e identificador de sistema de referência espacial (SRID):
CREATE TABLE holo_gis_2 (
id INT,
geom geometry(point, 4326),
PRIMARY KEY (id)
);
Neste exemplo, o subtipo é Point e o SRID é 4326 (WGS 84). Se nenhum SRID for especificado, o valor padrão será 0. O SRID das geometrias inseridas ou utilizadas em predicados de consulta deve corresponder ao SRID da coluna. Caso contrário, a instrução falhará com erros como Geometry SRID (0) does not match column SRID (4326) ou Operation on mixed SRID geometries. Para mais informações sobre SRIDs, consulte a documentação do PostGIS.
2. Inserir dados espaciais
-- Without SRID
INSERT INTO holo_gis_1 VALUES (1, ST_GeomFromText('point(116 39)'));
-- With SRID 4326
INSERT INTO holo_gis_2 VALUES (1, ST_GeomFromText('point(116 39)', 4326));
Para mais informações sobre funções espaciais, consulte Spatial functions.
3. Consultar dados espaciais
Após inserir os dados, execute os seguintes tipos de consulta.
Consulta por intervalo retangular
Retorna todos os pontos dentro de um bounding box.
Sem SRID:
SELECT st_astext(geom)
FROM holo_gis_1
WHERE ST_Covers(
ST_MakeBox2D(ST_Point(116, 39), ST_Point(117, 40)),
geom
);
Com SRID:
SELECT st_astext(geom)
FROM holo_gis_2
WHERE ST_Covers(
ST_SetSRID(ST_MakeBox2D(ST_Point(116, 39), ST_Point(117, 40)), 4326),
geom
);
Ambas as consultas retornam:
st_astext
-------------
POINT(116 39)
Para grandes conjuntos de dados, use o operador de bounding box && como filtro preliminar antes de aplicar um predicado espacial exato. Isso reduz o número de linhas processadas no cálculo exato. O operador && executa na HQE, tendo custo menor que funções topológicas como ST_Intersects e ST_Covers, delegadas à PQE. Por exemplo:
SELECT st_astext(geom)
FROM holo_gis_1
WHERE geom && ST_MakeBox2D(ST_Point(116, 39), ST_Point(117, 40))
AND ST_Intersects(ST_GeomFromText('POLYGON((116 39,117 39,117 40,116 40,116 39))'), geom);
Se precisar apenas de um filtro por intervalo retangular, sem semântica topológica exata, use geom && ST_MakeBox2D(...) isoladamente. Caso a coluna possua SRID, envolva o box com ST_SetSRID usando o mesmo SRID. Caso contrário, a instrução falhará com Operation on mixed SRID geometries.
Verificação de interseção de polígono
Para encontrar pontos dentro de um polígono arbitrário ou em sua fronteira, use ST_Intersects com o polígono. Diferentemente do bounding box criado por ST_MakeBox2D, o polígono pode ter qualquer forma, e ST_Intersects considera o contato na fronteira como uma correspondência válida.
Sem SRID:
SELECT st_astext(geom)
FROM holo_gis_1
WHERE ST_Intersects(
ST_GeomFromText('POLYGON((116 39,117 39,117 40,116 40,116 39))'),
geom
);
Com SRID:
SELECT st_astext(geom)
FROM holo_gis_2
WHERE ST_Intersects(
ST_SetSRID(ST_GeomFromText('POLYGON((116 39,117 39,117 40,116 40,116 39))'), 4326),
geom
);
Ambas as consultas retornam:
st_astext
-------------
POINT(116 39)
Funções espaciais
O PostGIS fornece funções espaciais para converter e analisar valores geometry. A sintaxe das funções utiliza os seguintes parâmetros:
geom: um valor
geometryou uma expressão que resulte emgeometry-
precision: um
INTEGERque controla a precisão de saída das coordenadas. O nome do parâmetro, sua semântica e o valor padrão variam conforme a função:ST_AsText(geom [, precision]): número de dígitos significativos. O padrão é15.ST_AsGeoJSON(geom [, maxdecimaldigits]): número máximo de casas decimais. O padrão é9. Especifique este parâmetro explicitamente caso precise manter maior precisão; caso contrário, as coordenadas exportadas perderão precisão.
Recomendamos especificar um valor entre 1 e 20. Valores fora desse intervalo são aceitos, mas não produzem dígitos adicionais significativos, pois um float de dupla precisão comporta aproximadamente 15 a 17 dígitos significativos.
index:
INTEGER; índice base 1, salvo indicação em contráriosrid:
INTEGER; identificador do sistema de referência espacial
Cada função executa em uma das seguintes engines de consulta:
|
Engine |
Quando se aplica |
Desempenho |
|
HQE (Hologres Query Engine) |
Hologres V1.3 e posterior |
Superior — otimizada para cargas analíticas |
|
PQE (PostgreSQL Query Engine) |
Todas as versões; obrigatória para certas funções |
Inferior — modo de compatibilidade |
Para a especificação completa das funções do PostGIS, consulte a documentação de referência do PostGIS.
As atribuições de engine nas tabelas a seguir refletem o comportamento medido no Hologres V4.2 e indicam apenas a engine atual (HQE ou PQE). A engine utilizada por uma função pode mudar entre versões. Para confirmar a engine da sua instância, verifique se a saída do
EXPLAINcontém um nó PQE. Para visão geral do suporte a engines por versão, consulte Engine support.As tabelas a seguir listam a assinatura mais comum de cada função. Algumas funções aceitam sobrecargas adicionais — por exemplo,
ST_MakeLinetambém aceita um array de geometrias, eST_AddPointtambém aceita uma posição de inserção. Consulte a documentação de referência do PostGIS para obter a lista completa de sobrecargas, bem como funções que aparecem nos exemplos mas não estão listadas nestas tabelas, comoST_MakeBox2D.
Construtores de geometry
Todas as funções deste grupo executam na HQE.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Cria uma linestring a partir de uma geometria multipoint, preservando a ordem dos pontos. A geometria retornada possui o mesmo SRID da entrada. |
|
|
|
|
Gera o polígono retangular definido pelas coordenadas dos cantos fornecidos, onde as coordenadas especificam os cantos inferior esquerdo e superior direito. O resultado é sempre um POLYGON, mesmo quando as coordenadas formam uma linha ou um único ponto. Se um SRID for fornecido, a geometria retornada usará esse SRID; caso contrário, o SRID será 0. |
|
|
|
|
Constrói uma linestring a partir de duas geometrias de entrada. |
|
|
|
|
Cria um ponto a partir de valores de coordenadas. |
|
|
|
|
Gera um ponto com base em valores de coordenadas. |
|
|
|
|
Cria um polígono cujo anel externo é a linestring de entrada, com o SRID especificado. |
Acessadores de geometry
Todas as funções deste grupo executam na HQE, exceto ST_IsPolygonCCW, que executa na PQE. Elas não são complementares: quando o anel externo e os anéis internos possuem a mesma orientação, ambas retornam false. Não negue ST_IsPolygonCW para testar orientação anti-horária. Ao filtrar uma tabela grande por orientação de anel, observe também que essas duas funções executam em engines diferentes.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Retorna o nome do subtipo da geometria de entrada como string, sem prefixo e em maiúsculas, como POINT ou POLYGON. |
|
|
|
|
Devolve a fronteira da geometria de entrada. Uma geometria vazia retorna a entrada inalterada; um ponto ou multipoint não vazio retorna uma coleção de geometrias vazia; uma linestring retorna um multipoint de seus pontos de fronteira; um polígono sem anéis internos retorna uma linestring fechada; um polígono com anéis internos ou um multipolígono retorna uma multilinestring de todos os anéis de fronteira. |
|
|
|
|
Indica a dimensão intrínseca do subtipo da geometria. |
|
|
|
|
Retorna o bounding box mínimo da geometria de entrada. Devolve um ponto se o box degenerar para um ponto, uma linestring de dois pontos se for unidimensional, ou um polígono orientado no sentido horário nos demais casos. A geometria retornada mantém o mesmo SRID da entrada. |
|
|
|
|
Extrai o anel externo de um polígono como uma linestring fechada. |
|
|
|
|
Obtém a geometria no índice base 1 especificado. Para geometrias simples (ponto, linestring, polígono) com índice 1, retorna a própria geometria; caso contrário, retorna null. Para coleções, devolve o elemento no índice indicado. |
|
|
|
|
Fornece o nome do subtipo da geometria de entrada como string, prefixado com ST_, como ST_Point ou ST_Polygon. Esse prefixo é a única diferença em relação a GeometryType, portanto considere o formato ao escrever condições de igualdade. |
|
|
|
|
Recupera o anel interno de um polígono na posição de índice dada, como uma linestring fechada. |
|
|
|
|
Retorna |
|
|
|
|
Devolve |
|
|
|
|
Indica |
|
|
|
|
Retorna |
|
|
|
|
Retorna |
|
|
|
|
Indica |
|
|
|
|
Conta o número de pontos na geometria. |
|
|
|
|
Informa a quantidade de anéis na geometria. |
|
|
|
|
Retorna o total de elementos em uma coleção de geometrias. |
|
|
|
|
Devolve o número de anéis internos em um polígono. |
|
|
|
|
Fornece a contagem de pontos na geometria. |
|
|
|
|
Extrai o ponto no índice especificado de uma linestring. Índices negativos contam a partir do final: |
|
|
|
|
Coleta todos os pontos não vazios da geometria como um multipoint. Pontos duplicados, incluindo pontos iniciais e finais de anéis, são preservados. |
|
|
|
|
Obtém o primeiro ponto de uma linestring. A geometria retornada mantém o mesmo SRID da entrada. |
|
|
|
|
Recupera a coordenada X de um ponto. |
|
|
|
|
Recupera a coordenada Y de um ponto. |
Editores de geometry
Todas as funções deste grupo executam na HQE.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Adiciona um ponto a uma linestring e retorna o resultado. |
|
|
|
|
Converte uma geometria para seu multi-tipo correspondente. Se a entrada já for um multi-tipo ou coleção, retorna uma cópia. |
|
|
|
|
Remove o ponto no índice base zero especificado de uma linestring. A geometria retornada mantém o mesmo SRID da entrada. |
|
|
|
|
Inverte a ordem dos vértices de uma geometria linear ou areal. Para ponto ou multipoint, retorna uma cópia. Para coleções, inverte os vértices de cada elemento. |
|
|
|
|
Substitui o ponto no índice especificado pelas coordenadas do ponto de entrada em uma linestring. |
Validação de geometry
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
PQE |
Verifica se a geometria é válida conforme a especificação OGC, retornando |
Funções de sistema de referência espacial
Todas as funções deste grupo executam na HQE.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Atualiza o SRID da geometria de entrada para o valor especificado, sem reprojetar as coordenadas. |
|
|
|
|
Obtém o SRID da geometria de entrada. |
Entrada de geometry
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
PQE |
Constrói uma geometria a partir de sua representação WKT (well-known text). |
Saída de geometry
Todas as funções deste grupo executam na HQE.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Converte a geometria para sua representação WKB (well-known binary), codificada como string hexadecimal usando caracteres ASCII |
|
|
|
|
Exporta a geometria em formato EWKB (extended well-known binary). |
|
|
|
|
Exporta a geometria em formato EWKT (extended well-known text). |
|
|
|
|
Serializa a geometria como GeoJSON. |
|
|
|
|
Converte a geometria para sua representação WKT. |
Predicados de relacionamento espacial
A engine varia conforme a função neste grupo. Consulte a coluna Required engine.
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
PQE |
Retorna |
|
|
|
|
PQE |
Devolve |
|
|
|
|
HQE |
Indica |
|
|
|
|
PQE |
Retorna |
|
|
|
|
HQE |
Verifica se as duas geometrias se cruzam, retornando |
|
|
|
|
HQE |
Retorna |
|
|
|
|
PQE |
Avalia se a distância euclidiana entre as duas geometrias não excede o limiar, retornando |
|
|
|
|
HQE |
Retorna |
|
|
|
|
HQE |
Confirma se as duas geometrias possuem conjuntos de pontos iguais e seus interiores se interceptam, retornando |
|
|
|
|
PQE |
Retorna |
|
|
|
|
HQE |
Indica |
|
|
|
|
PQE |
Retorna |
Funções de medição
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
HQE |
Calcula o ângulo horário em radianos no intervalo [0, 2π). Com três pontos, mede a rotação de P1 a P3 em torno de P2. Com quatro pontos, mede o ângulo entre as linhas direcionadas P1–P2 e P3–P4; retorna null se P1 for igual a P2 ou P3 for igual a P4. |
|
|
|
|
HQE |
Retorna a área cartesiana da geometria nas mesmas unidades do sistema de coordenadas. Devolve |
|
|
|
|
HQE |
Calcula o azimute cartesiano baseado no norte, definido por dois pontos. |
|
|
|
|
HQE |
Mede a distância cartesiana entre duas geometrias, expressa nas mesmas unidades das coordenadas de entrada. Para calcular a distância esférica em metros, use |
|
|
|
|
HQE |
Calcula a distância esférica entre duas localizações geográficas em metros. Parâmetros em ordem: longitude da Localização 1, latitude da Localização 1, longitude da Localização 2, latitude da Localização 2. Faixa válida de latitude: [-90, +90]. Faixa válida de longitude: [-180, +180]. Oferece suporte no Hologres V2.0.8 e posterior. Entradas constantes não têm suporte na versão atual. |
|
|
|
|
HQE |
Retorna o comprimento cartesiano de uma geometria linear nas mesmas unidades do sistema de coordenadas. Devolve |
|
|
|
|
HQE |
Calcula o perímetro cartesiano (comprimento da fronteira) de uma geometria areal nas mesmas unidades do sistema de coordenadas. Retorna |
Função de sobreposição
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
HQE |
Produz a interseção geométrica de duas geometrias. |
Funções de processamento de geometry
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
Mesmo tipo da entrada: |
PQE |
Gera a geometria que representa todos os pontos dentro do raio especificado em relação à geometria de entrada. |
|
|
|
|
HQE |
Calcula o casco convexo (convex hull) de todos os pontos não vazios na geometria de entrada. |
|
|
|
|
HQE |
Retorna uma cópia simplificada da geometria usando o algoritmo Ramer-Douglas-Peucker com a tolerância especificada. A topologia pode não ser preservada. |
Funções de bounding box
Todas as funções deste grupo executam na PQE.
|
Função |
Sintaxe |
Retorno |
Descrição |
|
|
|
|
Obtém a coordenada X máxima do bounding box da geometria. O tipo do parâmetro é box3d; uma entrada geometry é convertida implicitamente. |
|
|
|
|
Obtém a coordenada X mínima do bounding box da geometria. O tipo do parâmetro é box3d; uma entrada geometry é convertida implicitamente. |
|
|
|
|
Obtém a coordenada Y máxima do bounding box da geometria. O tipo do parâmetro é box3d; uma entrada geometry é convertida implicitamente. |
|
|
|
|
Obtém a coordenada Y mínima do bounding box da geometria. O tipo do parâmetro é box3d; uma entrada geometry é convertida implicitamente. |
Função de referência linear
|
Função |
Sintaxe |
Retorno |
Engine necessária |
Descrição |
|
|
|
|
HQE |
Interpola um ponto a uma distância fracionária ao longo da linha, medida a partir do início. Por exemplo, |
Melhores práticas para uso de funções espaciais
Para exemplos completos de padrões comuns de análise geográfica, consulte Use spatial functions to query data.