XOOPS Brasil

 

10.5. Analisando Informação Espacial

Depois de preencher colunas espaciais com valores, você está pronto para consultá-los e analisá-los. O MySQL fornece um conjunto de funções para realizar diversas operações em dados espaciais. Estas funções podem ser agrupadas em quatro grandes categorias de acordo com o tipo de operação que eles realizam:

  • Funções que convertem geometrias entre vários formatos.

  • Funções que fornecem acesso a propriedades qualitativas ou quantitativas de um geometria

  • Funções que descrevem realções entre duas geometrias.

  • Funções que criam novas geometrias de outras existentes.

Funções de análise espacial podem ser usados em muitos contextos, tais como:

  • Qualquer programa SQL interativo, como mysql ou MySQLCC.

  • Aplicativos escritos em qualquer linguagem duportando uma API do cliente MySQL.

10.5.1. Funções Para Converter Geometrias Entre Formatos Diferentes

O MySQL suporta as seguintes funções para converter valores geométricos entre formatos internos e os formatos WKB e WKT:

  • GeomFromText(wkt[,srid])

    Converte um valor string de sua representação WKT em formato de geometria interna e retorna o resultado. Um número de funções específicas de tipo também são suportadas, como PointFromText() e LineFromText(); veja Seção 10.4.2.1, “Criando Valores Geometry Usando Funções WKT”.

  • GeomFromWKB(wkb [,srid])

    Converte um valor binário da sua representação WKB em formato de geometria interna e retorna o resultado. Um número de funções específicas de tipo também são suportadas, como PointFromWKB() e LineFromWKB(); veja Seção 10.4.2.2, “Criando Valores Geometry Usando Funções WKB”.

  • AsText(g)

    Converte um valor em formato de geomtria interna em sua representação WKT e retorna a string resultante.

    mysql> SET @g = 'LineString(1 1,2 2,3 3)';
    mysql> SELECT AsText(GeomFromText(@g));
    +--------------------------+
    | AsText(GeomFromText(@G)) |
    +--------------------------+
    | LINESTRING(1 1,2 2,3 3) |
    +--------------------------+
    

  • AsBinary(g)

    Converte um valor em formato de geomtria interna em sua representação WKB e retorna o valor binário resultante

10.5.2. Funções de Análise das Propriedades de Geometry

Cada função que pertencem a este grupo tomam um valor de geometria como seus argumentos e retornam alguma propriedade quantitativa e qualitativa desta geometria. Algumas funções restrigem os seus tipos de argumentos. tais funções retornam NULL se o argumento é de um tipo de geometria incorreta. Por exemplo, Area() retorna NULL se o tipo do objeto não for nem Polygon nem MultiPolygon.

10.5.2.1. Funções de Análise das Propriedades de Geometry em Geral

As funções listadas nesta seção não restrigem seus argumentos e acitam um valor geometria de qualquer tipo.

  • GeometryType(g)

    Retorna como string o nome do tipo da geometria da qual esta instância g de geometry é um membro. O nome corresponderá a uma das subclasses instanciáveis de Geometry.

    mysql> SELECT GeometryType(GeomFromText('POINT(1 1)'));
    +-------------------------------------------------+
    | GeometryType(GeomFromText('POINT(1 1)')) |
    +-------------------------------------------------+
    | POINT |
    +-------------------------------------------------+
    

  • Dimension(g)

    Retorna a dimensão herdada deste objeto g de geometria. O resultado pode ser −1, 0, 1 or 2. (o significado destes valores é dado em Seção 10.2.2, “Classe Geometry.)

    mysql> SELECT Dimension(GeomFromText('LineString(1 1,2 2)'));
    +------------------------------------------------+
    | Dimension(GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------+
    | 1 |
    +------------------------------------------------+
    

  • SRID(g)

    Retorna um inteiro indicando ID do Sistema de Referência Espacial do valor de geometria g.

    mysql> SELECT SRID(GeomFromText('LineString(1 1,2 2)'));
    +-----------------------------------------------+
    | SRID(GeomFromText('LineString(1 1,2 2)',101)) |
    +-----------------------------------------------+
    | 101 |
    +-----------------------------------------------+
    

  • Envelope(geometry g):geometry

    Retorna o Retângulo de Limite Mínimo (Minimum Bounding Rectangle (MBR)) para o valor de geometria g. O resultado é retornado como um polygon (polígono).

    mysql> SELECT AsText(Envelope(GeomFromText('LineString(1 1,2 2)',101)));
    +------------------------------------------------------+
    | AsText(Envelope(GeomFromText('LineString(1 1,2 2)')) |
    +------------------------------------------------------+
    | POLYGON((1 1,2 1,2 2,1 2,1 1)) |
    +------------------------------------------------------+
    

    O polygon é definido pelos pontos nos cantos da caixa que o limita:

    POLYGON((MINX MINY, MAXX MINY, MAXX MAXY, MINX MAXY, MINX MINY))
    

A especificação OpenGIS também define as seguintes funções, que o MySQL ainda não implementou:

  • Boundary(g)

    Retorna uma geometria que é o fechamento do limite combinacional do valor da geometria g.

  • IsEmpty(g)

    Retorna 1 se o valor da geometria g e a geometria vazia, 0 se ela não está vazia e −1 se o argumento é NULL. Se a geometria está vazia, ela representa um conjunto de pontos vazios.

  • IsSimple(g)

    Atualmewnte esta função não deve ser usada. Quando implementada, seu comportamento será como descrito no próximo parágrafo.

    Retorna 1 se o valor da geometria g não tem nenhum ponto geométrico anormal, como a interseção própria ou tangente própria. IsSimple retorna 0 se o argumento não é simples, e −1 se é NULL.

    A descrição de cada geométrica instanciável dada anteriormente neste capítulo inclui a condição específica que faz com que uma instância desta classe seja classificada como não simples.

10.5.2.2. Funções de Análise das Propriedades de Point

Um Point consiste de suas coordenadas X e Y, que podem ser obtidas usando as seguintes funções:

  • X(p)

    Retorna o valor da coordenada X para o ponto p como um número de dupla precisão.

    mysql> SELECT X(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | X(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    | 56.7 |
    +--------------------------------------+
    

  • Y(p)

    Retorna o valor da coordenada Y para o ponto p como um número de dupla precisão.

    mysql> SELECT Y(GeomFromText('Point(56.7 53.34)'));
    +--------------------------------------+
    | Y(GeomFromText('Point(56.7 53.34)')) |
    +--------------------------------------+
    | 53.34 |
    +--------------------------------------+
    

10.5.2.3. Funções de Análise das Propriedades de LineString

Uma LineString consiste de valores Point. Você pode extrair pontos particulares de uma LineString, contar o número de pontos que ela contém ou obter o seu tamanho.

  • EndPoint(ls)

    Retorna o Point que é o ponto final do valor LineString ls.

    mysql> SELECT AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
    +------------------------------------------------------------+
    | AsText(EndPoint(GeomFromText('LineString(1 1,2 2,3 3)'))) |
    +------------------------------------------------------------+
    | POINT(3 3) |
    +------------------------------------------------------------+
    

  • GLength(ls)

    Returna como um número de precisão dupla o tamanho do valor LineString ls em sua referência espacial associada.

    mysql> SELECT GLength(GeomFromText('LineString(1 1,2 2,3 3)'));
    +--------------------------------------------------+
    | GLength(GeomFromText('LineString(1 1,2 2,3 3)')) |
    +--------------------------------------------------+
    | 2.8284271247462 |
    +--------------------------------------------------+
    

  • IsClosed(ls)

    Returna 1 se o valor LineString ls é fechado (isto é, seus valores StartPoint() e EndPoint() são os mesmos). Returna 0 se ls não é fechado, e −1 se ele é NULL.

    mysql> SELECT IsClosed(GeomFromText('LineString(1 1,2 2,3 3)'));
    +---------------------------------------------------+
    | IsClosed(GeomFromText('LineString(1 1,2 2,3 3)')) |
    +---------------------------------------------------+
    | 0 |
    +---------------------------------------------------+
    

  • NumPoints(ls)

    retorna o número de pontos no valor LineString ls.

    mysql> SELECT NumPoints(GeomFromText('LineString(1 1,2 2,3 3)'));
    +----------------------------------------------------+
    | NumPoints(GeomFromText('LineString(1 1,2 2,3 3)')) |
    +----------------------------------------------------+
    | 3 |
    +----------------------------------------------------+
    

  • PointN(ls,n)

    Returna o n-ésimo ponto no valor Linestring ls.

    mysql> SELECT AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2));
    +-----------------------------------------------------------+
    | AsText(PointN(GeomFromText('LineString(1 1,2 2,3 3)'),2)) |
    +-----------------------------------------------------------+
    | POINT(2 2) |
    +-----------------------------------------------------------+
    

  • StartPoint(ls)

    Returna o Point que é o ponto inicial do valor LineString ls.

    mysql> SELECT AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)')));
    +-------------------------------------------------------------+
    | AsText(StartPoint(GeomFromText('LineString(1 1,2 2,3 3)'))) |
    +-------------------------------------------------------------+
    | POINT(1 1) |
    +-------------------------------------------------------------+
    

A especificação OpenGIS também define as seguintes funções, que o MySQL ainda não implementou:

  • IsRing(ls)

    Retorna 1 se o valor LineString ls é fechado (isto é, seus valores StartPoinnt() e EndPoint() são os mesmos) e é simples (não passa pelo mesmo ponto mais de uma vez). Retorna 0 se ls não é um anel, −1 se é NULL.

10.5.2.4. Funções de Análise das Propriedades de MultiLineString

  • GLength(mls)

    Retorna o tamanho do valor de MultiLineString mls como um número e precisão dupla. O tamanha de mls é igual a soma dos tamanhos de seus elementos.

    mysql> SELECT GLength(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))'));
    +-------------------------------------------------------------------+
    | GLength(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')) |
    +-------------------------------------------------------------------+
    | 4.2426406871193 |
    +-------------------------------------------------------------------+
    

  • IsClosed(MultiLineString m):Integer, IsClosed(mls)

    Returna 1 se o valor MultiLineString mls é fechado (isto é, os valores StartPoint() e EndPoint() são os mesmos para cada LineString em mls). Returna 0 se mls não é fechada, e −1 se for NULL.

    mysql> SELECT IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))'));
    +--------------------------------------------------------------------+
    | IsClosed(GeomFromText('MultiLineString((1 1,2 2,3 3),(4 4,5 5))')) |
    +--------------------------------------------------------------------+
    | 0 |
    +--------------------------------------------------------------------+
    

10.5.2.5. Funções de Análise das Propriedades de Polygon

  • Area(poly)

    Returna como um número de dupla precisão a área do valor Polygon poly, como medido em seu sistema de referência espacial.

    mysql> SELECT Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'));
    +----------------------------------------------------------------------------+
    | Area(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')) |
    +----------------------------------------------------------------------------+
    | 8 |
    +----------------------------------------------------------------------------+
    

  • NumInteriorRings(poly)

    Retorna o número de anéis interiores no valor Polygon poly.

    mysql> SELECT NumInteriorRings(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'));
    +----------------------------------------------------------------------------------------+
    | NumInteriorRings(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')) |
    +----------------------------------------------------------------------------------------+
    | 1 |
    +----------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    

  • ExteriorRing(poly)

    Retorna o anel exterior do valor Polygon poly como uma LineString.

    mysql> SELECT AsText(ExteriorRing(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))')));
    +--------------------------------------------------------------------------------------------+
    | AsText(ExteriorRing(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'))) |
    +--------------------------------------------------------------------------------------------+
    | LINESTRING(0 0,0 3,3 3,3 0,0 0) |
    +--------------------------------------------------------------------------------------------+
    

  • InteriorRingN(poly,n)

    Retorna o n-ésimo anel exterior para o valor Polygon poly como uma LineString.

    mysql> SELECT AsText(InteriorRingN(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'),1));
    +-----------------------------------------------------------------------------------------------+
    | AsText(InteriorRingN(GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1))'),1)) |
    +-----------------------------------------------------------------------------------------------+
    | LINESTRING(1 1,1 2,2 2,2 1,1 1) |
    +-----------------------------------------------------------------------------------------------+
    

A especificação OpenGIS também define as seguintes funções, que o MySQL ainda não implementou:

  • Centroid(poly)

    O centóide matemático para o valor Polygon poly como um Point. O resultado não é garantido estar neste Polygon.

  • PointOnSurface(poly)

    Returna um valor Point que esta garantidamente no valor Polygon poly.

10.5.2.6. Funções de Análise das Propriedades de MultiPolygon

  • Area(mpoly)

    Retorna como um número de precisão dupla a área do valor MultiPolygon mpoly, como medido no sistema de referência espacial deste MultiPolygon.

    mysql> SELECT Area(GeomFromText('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))'));
    +-----------------------------------------------------------------------------------+
    | Area(GeomFromText('MultiPolygon(((0 0,0 3,3 3,3 0,0 0),(1 1,1 2,2 2,2 1,1 1)))')) |
    +-----------------------------------------------------------------------------------+
    | 8 |
    +-----------------------------------------------------------------------------------+
    

A especificação OpenGIS também define as seguintes funções, que o MySQL ainda não implementou:

  • Centroid(mpoly)

    O centróide matemático para este MultiPolygon como um Point. O resultado não é garantido estar neste MultiPolygon.

  • PointOnSurface(mpoly)

    Retorna um valor Point que é garantido estar no valor MultiPolygon mpoly.

10.5.2.7. Funções de Análise das Propriedades de GeometryCollection

  • NumGeometries(gc)

    Retorna o número de geometrias no valor GeometryCollection gc.

    mysql> SELECT NumGeometries(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'));
    +------------------------------------------------------------------------------------+
    | NumGeometries(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))')) |
    +------------------------------------------------------------------------------------+
    | 2 |
    +------------------------------------------------------------------------------------+
    

  • GeometryN(gc,n)

    Retorna o n-ésima geometria no valor GeometryCollection gc. O número de geometrias começa em 1.

    mysql> SELECT AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1));
    +------------------------------------------------------------------------------------------+
    | AsText(GeometryN(GeomFromText('GeometryCollection(Point(1 1),LineString(2 2, 3 3))'),1)) |
    +------------------------------------------------------------------------------------------+
    | POINT(1 1) |
    +------------------------------------------------------------------------------------------+
    

Nota: Funções para tipos de geometrias específicas retornam NULL se a geomtria passada é do tipo de geometria errado. Por exemplo Area() retorna NULL se o tipo do objeto não é nem Polygon nem MultiPolygon.

10.5.3. Funções Que Criam Novas Geometrias de Outras Existentes

10.5.3.1. Funções de Geometria Que Produzem Novas Geometrias

Na seção Seção 10.5.2, “Funções de Análise das Propriedades de Geometry nós já discutimos algumas funções que podem construir novas geometrias se outras existentes:

  • Envelope(g)

  • StartPoint(ls)

  • EndPoint(ls)

  • PointN(ls,n)

  • ExteriorRing(poly)

  • InteriorRingN(poly,n)

  • GeometryN(gc,n)

10.5.3.2. Operadores Espaciais

OpenGIS propõem algumas outras funções que podem produzir geometrias. Elas estão designadas a implementar Operadores Espaciais.

Estas funções ainda não estão implementadas no MySQL. Elas devem aparecer em distribuições futuras.

  • Intersection(g1,g2)

    Retorna uma geometria que representa a insterseção do conjunto de pontos dos valores das geometrias g1 com g2.

  • Union(g1,g2)

    Retorna uma geometria que representa a união do conjunto de pontos dos valores das geometrias g1 com g2.

  • Difference(g1,g2)

    Retorna uma geometria que representa a diferença do conjunto de pontos dos valores das geometrias g1 com g2.

  • SymDifference(g1,g2)

    Retorna uma geometria que representa a diferença simétrica do conjunto de pontos dos valores das geometrias g1 com g2.

  • Buffer(g,d)

    Retiorna uma geometria que representa todos os pontos cuja distância do valor da geometria g é menor que ou igual a distância de d.

  • ConvexHull(g)

    Retorna uma geometria que representa a casca convexa de do valor da geometria g.

10.5.4. Funções Para Testar Relações Espaciais Entre Objetos Geométricos

A função descrita nesta seção toma duas geometrias como parâmetros de entrada e retorna uma relação qualitativa ou quantitativa entre eles.

10.5.5. Relações de Retângulo de Limite Mínimo (Minimal Bounding Rectangles - MBR) em Geometrias

O MySQL fornece algumas funções que podem testar relações entre retângulos de limite mínimo de duas geometrias g1 e g2. Elas incluem:

  • MBRContains(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de g1 contém o Retângulo de Limite Mínimo de g2.

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Point(1 1)');
    mysql> SELECT MBRContains(@g1,@g2), MBRContains(@g2,@g1);
    ----------------------+----------------------+
    | MBRContains(@g1,@g2) | MBRContains(@g2,@g1) |
    +----------------------+----------------------+
    | 1 | 0 |
    +----------------------+----------------------+
    

  • MBRWithin(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de g1 esta dentro do Retângulo de Limite Mínimo de g2.

    mysql> SET @g1 = GeomFromText('Polygon((0 0,0 3,3 3,3 0,0 0))');
    mysql> SET @g2 = GeomFromText('Polygon((0 0,0 5,5 5,5 0,0 0))');
    mysql> SELECT MBRWithin(@g1,@g2), MBRWithin(@g2,@g1);
    +--------------------+--------------------+
    | MBRWithin(@g1,@g2) | MBRWithin(@g2,@g1) |
    +--------------------+--------------------+
    | 1 | 0 |
    +--------------------+--------------------+
    

  • MBRDisjoint(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de duas geometrias g1 e g2 não fazem interseção.

  • MBREqual(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de duas geometrias g1 e g2 são o mesmo.

  • MBRIntersects(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de duas geometrias g1 e g2 se interseptam.

  • MBROverlaps(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de duas geometrias g1 e g2 se sobrepõe.

  • MBRTouches(g1,g2)

    Retorna 1 ou 0 para indicar se o Retângulo de Limite Mínimo de duas geometrias g1 e g2 se tocam.

10.5.6. Funções que Testam Relacionamentos Espaciais Entre Geometrias

A especificação OpenGIS define as seguintes funções, que o MySQL ainda não implementou. Elas devem aparecer em distribuições futuras. Quando implementadas, fornecerão suporte total para análise espacial, não apenas suporte baseado em MBR.

As funções operam em dois valores de geometria g1 e g2.

  • Contains(g1,g2)

    Retorna 1 ou 0 para indicar se g1 contem completamente g2 ou não.

  • Crosses(g1,g2)

    Retorna 1 se g1 cruza espacialmente g2. Retorna NULL se g1 é um Polygon ou um MultiPolygon, ou se g2 é um Point ou um MultiPoint. Senão 0 é retornado.

    O termo spatially crosses denota uma relação espacial entre duas geometrias que têm as seguintes propriedades:

    • As duas geometrias se interseptam

    • A interseção resulta em uma geometria que tem uma dimensão que é menor que a dimensão máxima das duas geometrias dadas.

    • A interseção não é igual a nenhuma das duas geometrias dadas.

  • Disjoint(g1,g2)

    Retorna 1 ou 0 para indicar se g1 é espacialmente disjunta de g2 ou não.

  • Equals(g1,g2)

    Retorna 1 ou 0 para indicar se g1 é espacialmente igual a g2 ou não.

  • Intersects(g1,g2)

    Retorna 1 ou 0 para indicar se g1 intersepta espacialmente g2 ou não.

  • Overlaps(g1,g2)

    Retorna 1 ou 0 para indicar se g1 sobrepõe espacialmente a g2 ou não. O termo sobrepor espacialmente é usado se duas geometrias fazem interseção e suas interseções resultam em uma geometria da mesma dimensão mas difernete de ambas as geometrias dadas.

  • Touches(g1,g2)

    Retorna 1 ou 0 para indicar se g1 spatially touches g2, ou não. Duas geometrias se tocam espacialmente se o interiro de ambas geometrias não se interseptam, mas o limite de uma delas intersepta o limite ou o interior das geometrias.

  • Within(g1,g2)

    Retorna 1 ou 0 para indicar se g1 está espacialmente dentro da g2, ou não.

  • Distance(g1,g2)

    Retorna como um número de precisão dupla, a menor distância entre quaiquer dois pontos nas duas geometrias.

  • Related(g1,g2,pattern_matrix)

    Retorna 1 ou 0 indicando se o relacionamento espacial especificado por matriz_padrão existe entre g1 e g2 ou não. Retorna −1 se os argumentos são NULL. A matriz padrão é uma string. Sua especificação será indicada aqui quando esta função estiver implementada.