Pergunta

Esta questão é para especialistas em extensão geoespacial MySQL.

A consulta a seguir não resultado que estou esperando:

create database test_db;

use test_db;

create table test_table (g polygon not null);

insert into test_table (g) values (geomfromtext('Polygon((0 5,5 10,7 8,2 3,0 5))'));
insert into test_table (g) values (geomfromtext('Polygon((2 3,7  8,9 6,4 1,2 3))'));

select

X(PointN(ExteriorRing(g),1)), Y(PointN(ExteriorRing(g),1)),
X(PointN(ExteriorRing(g),2)), Y(PointN(ExteriorRing(g),2)),
X(PointN(ExteriorRing(g),3)), Y(PointN(ExteriorRing(g),3)),
X(PointN(ExteriorRing(g),4)), Y(PointN(ExteriorRing(g),4))

from test_table where MBRContains(g,GeomFromText('Point(3 6)'));

Basicamente, estamos criando 2 polígonos e estamos tentando usar o MBRContains para determinar se um ponto está dentro de um dos dois polígonos.

Surpreendentemente, ele retorna os dois polígonos! O ponto 3,6 deve existir apenas no primeiro polígono inserido.

Observe que ambos os polígonos estão inclinados (depois de desenhar os polígonos em um pedaço de papel, você verá)

Como é que o MySQL retorna os dois polígonos? Estou usando o MySQL Community Edition 5.1.

Foi útil?

Solução

ATUALIZAR: Espero que esta resposta tenha sido obsoleta por MySQL: http://forge.mysql.com/wiki/gis_functions! Sairá como referência para implementações mais antigas do MBRContains, mas uma nova resposta que explica as alterações seria bem -vinda e deve ser "aceita" acima deste.

Comece a resposta obsoleta

Você está usando (por necessidade) retângulos mínimos delimitadores, não os polígonos como tal. Para os fins de sua consulta, a forma comparada é equivalente a:

'POLYGON(0 2,0 10,7 10,7 2,0 2)'

para a primeira forma e:

'POLYGON(2 1,9 1,9 9,2 9,2 1)'

para o segundo. (3,6) está em ambos.

MBR é uma maneira aproximada de estimativa, imagine o retângulo como tendo linhas verticais em min (x) e max (x) e linhas horizontais em max (y) e min (y). Essas formas são mais fáceis para o banco de dados calcular, o MySQL não suporta todas as funções de polígono. (Área sim, linestrings geralmente sim, contains ainda não. Mais detalhes aqui.). Se você deseja geometria geoespacial mais precisa no momento, a melhor escolha no lado do código aberto é PostGIS.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top