O MaxCompute oferece suporte nativo ao tipo de dados GEOGRAPHY, que representa objetos geográficos como pontos, linhas e polígonos na superfície da Terra. Esse tipo permite armazenar, construir e operar dados geoespaciais com eficiência. O tipo de dados GEOGRAPHY no MaxCompute utiliza a biblioteca S2 Geometry.
Tipos de geometria suportados
O MaxCompute suporta os seguintes tipos de geometria:
Tipo de geometria | Descrição |
Point | Posição na superfície da Terra definida por coordenadas de longitude e latitude, com a longitude especificada primeiro, seguida pela latitude. Exemplo: |
LineString | Curva unidimensional composta por uma série de pontos e pelas linhas geodésicas que os conectam. Exemplo: |
Polygon | Superfície bidimensional descrita por um ou mais loops fechados. O primeiro loop define o limite externo (shell), e os loops subsequentes definem buracos dentro do polígono. Os buracos especificam áreas excluídas do polígono. Exemplos: |
MultiPoint | Coleção de pontos. |
MultiLineString | Coleção de LineStrings. |
MultiPolygon | Coleção de Polygons. |
GeometryCollection | Coleção de objetos de diferentes tipos de geometria. |
Especifique as coordenadas como (longitude, latitude) em graus, seguindo o sistema de coordenadas WGS84. A longitude deve estar no intervalo [-180, 180] e a latitude no intervalo [-90, 90].
O tipo de dados GEOGRAPHY do MaxCompute usa a biblioteca S2 Geometry. Diferentemente das bibliotecas tradicionais de Sistemas de Informações Geográficas (GIS), a S2 Geometry não utiliza projeções de mapa planares, como a projeção de Mercator. Em vez disso, trata a Terra como uma esfera perfeita. Primeiro, converte as coordenadas de latitude e longitude em coordenadas cartesianas tridimensionais (x, y, z) na esfera. Essa abordagem evita o aumento de erros computacionais causados por projeções planares, especialmente perto dos polos.
A biblioteca S2 Geometry usa o tipo DOUBLE para descrever as coordenadas de objetos geográficos. Ao converter dados de entrada em objetos S2, pode ocorrer uma pequena perda de precisão, resultando em uma discrepância mínima entre a entrada e a saída.
Limitações
Restrições de versão do cliente: Para consultar dados GEOGRAPHY, use o odpscmd versão 0.56.0 ou posterior. A configuração
use_instance_tunnel=truenão é suportada.Restrições de tipo de dados: O tipo de dados GEOGRAPHY não é suportado no sistema de tipos de dados 1.0. Ative o sistema de tipos de dados 2.0 no nível do projeto ou da sessão definindo
odps.sql.type.system.odps2=true;.O tipo de dados GEOGRAPHY não suporta operações de comparação. Portanto, não é possível usá-lo em cláusulas SELECT DISTINCT, GROUP BY ou ORDER BY, nem como condição para uma equi-join em uma cláusula JOIN.
O tipo de dados GEOGRAPHY não suporta as dimensões Z (elevação) ou M (medida) para objetos geográficos.
-
O tipo de dados GEOGRAPHY não suporta a construção de um objeto geográfico maior que um hemisfério. Por exemplo, a seguinte instrução SQL tenta criar um objeto geográfico que cobre quase todo o globo, da longitude 179 graus oeste até 179 graus leste. No entanto, o resultado real é um objeto menor que um hemisfério, cuja longitude se estende para leste a partir de 179°E, cruza o meridiano de 180° e termina em 179°W.
SELECT ST_GEOGFROMTEXT( 'POLYGON ((-179 -89, 179 -89, 179 89, -179 89, -179 -89))' ); -- Result: +------+ | _c0 | +------+ | POLYGON ((-179 89, 179 89, 179 -89, -179 -89, -179 89)) | +------+
Crie e use dados GEOGRAPHY
Use o tipo de dados GEOGRAPHY como tipo de campo ao criar uma tabela:
SET odps.sql.type.system.odps2=true;
CREATE TABLE spatial_points (
id BIGINT,
name STRING,
location GEOGRAPHY,
region GEOGRAPHY
);
Utilize funções integradas, como ST_GEOGPOINT, ST_GEOGFROMTEXT, ST_GEOGFROMWKB, ST_MAKELINE e ST_MAKEPOLYGON, para construir objetos geográficos. Para mais informações, consulte Geography function overview.
-- Insert data: Construct GEOGRAPHY objects using geography functions.
INSERT INTO spatial_points VALUES
(1, 'Beijing Center', ST_GEOGPOINT(116.4074, 39.9042),
ST_GEOGFROMTEXT('POLYGON((116.3 39.8, 116.5 39.8, 116.5 40.0, 116.3 40.0, 116.3 39.8))')),
(2, 'The Bund', ST_GEOGPOINT(121.4894, 31.2403),
ST_MAKEPOLYGON(ST_MAKELINE(ARRAY(
ST_GEOGPOINT(121.4, 31.2),
ST_GEOGPOINT(121.5, 31.2),
ST_GEOGPOINT(121.5, 31.3),
ST_GEOGPOINT(121.4, 31.3),
ST_GEOGPOINT(121.4, 31.2)
))));
-- Query the inserted data.
SELECT * FROM spatial_points;
-- Result:
+------------+--------------+--------------------------+--------+
| id | name | location | region |
+------------+--------------+--------------------------+--------+
| 1 | Beijing Center | POINT (116.4074 39.9042) | POLYGON ((116.3 39.8, 116.5 39.8, 116.5 40, 116.3 40, 116.3 39.8)) |
| 2 | The Bund | POINT (121.4894 31.2403) | POLYGON ((121.4 31.2, 121.5 31.2, 121.5 31.3, 121.4 31.3, 121.4 31.2)) |
+------------+--------------+--------------------------+--------+
Funções de geografia
O MaxCompute fornece uma série de funções de geografia com o prefixo ST_ para construir, converter e analisar dados GEOGRAPHY. Essas funções permitem criar objetos geográficos, como pontos, linhas e polígonos, a partir de coordenadas de longitude e latitude ou de texto WKT/WKB. Também é possível extrair propriedades como coordenadas e caixas delimitadoras, determinar relações espaciais como contenção, interseção e cobertura, além de calcular a distância entre objetos geográficos.
Para mais informações, consulte Geography function overview.
As seguintes funções de geografia são suportadas:
Categoria | Função | Descrição |
Construção e análise | Constrói um objeto geográfico de ponto a partir da longitude e latitude especificadas. | |
Constrói um objeto geográfico de linha a partir dos endpoints especificados. | ||
Constrói um objeto geográfico de polígono a partir de um limite externo (shell) especificado e zero ou mais buracos. | ||
Converte uma string no formato WKT para um objeto GEOGRAPHY. | ||
Converte um valor BINARY no formato WKB para um objeto GEOGRAPHY. | ||
Formatação | Converte um valor GEOGRAPHY para um valor BINARY no formato WKB. | |
Converte um valor GEOGRAPHY para um valor STRING no formato WKT. | ||
Acesso a propriedades | Retorna a caixa delimitadora de um valor GEOGRAPHY. | |
Retorna a longitude de um objeto geográfico de ponto. | ||
Retorna a latitude de um objeto geográfico de ponto. | ||
Operações espaciais | Verifica se o primeiro objeto geográfico contém o segundo. | |
Verifica se o primeiro objeto geográfico cobre o segundo (todos os pontos do segundo objeto estão no limite ou dentro do primeiro). | ||
Verifica se dois objetos geográficos se interceptam (eles têm pelo menos um ponto em comum). | ||
Verifica se o primeiro objeto geográfico está dentro do segundo. | ||
Verifica se a menor distância entre dois objetos geográficos é menor ou igual a uma distância especificada. | ||
Calcula a menor distância entre dois objetos geográficos, em metros. |
Spatial join
Um spatial join é uma operação de junção não equitativa entre duas tabelas que contêm dados GEOGRAPHY. A condição de junção usa uma função de predicado espacial (como ST_CONTAINS ou ST_INTERSECTS) para avaliar a relação espacial entre os objetos geográficos.
Um caso de uso comum envolve utilizar uma função de geografia como condição JOIN para avaliar a relação espacial entre colunas GEOGRAPHY.
Cenários típicos incluem determinar se um ponto de interesse (POI) está dentro de uma área especificada ou analisar a interseção de uma trajetória com um geofence.
O MaxCompute implementa spatial joins com base em uma tabela de broadcast. Use um MAPJOIN HINT para especificar qual tabela transmitir via broadcast.
Para mais informações, consulte Spatial JOIN.