Pregunta

Esta pregunta es para expertos en extensión geoespacial de Mysql.

La siguiente consulta no produce el resultado que esperaba:

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)'));

Básicamente, estamos creando 2 polígonos y estamos intentando usar MBRContains para determinar si un punto está dentro de cualquiera de los dos polígonos.

¡Sorprendentemente, devuelve ambos polígonos!El punto 3,6 sólo debería existir en el primer polígono insertado.

Tenga en cuenta que ambos polígonos están inclinados (una vez que dibuje los polígonos en una hoja de papel, verá)

¿Cómo es que MySql devuelve ambos polígonos?Estoy usando MySql Community Edition 5.1.

¿Fue útil?

Solución

ACTUALIZAR:Esperemos que MySQL haya quedado obsoleta con esta respuesta: http://forge.mysql.com/wiki/GIS_Functions!Se dejará como referencia para implementaciones anteriores de MBRContains, pero una nueva respuesta que explique los cambios sería bienvenida y debería "aceptarse" por encima de esta.

comenzar respuesta obsoleta

Estás usando (por necesidad) rectángulos delimitadores mínimos, no los polígonos como tales.A los efectos de su consulta, la forma que se compara es equivalente a:

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

para la primera forma y:

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

para el segundo.(3,6) está en ambos.

MBR es una forma aproximada de estimación; imagine que el rectángulo tiene líneas verticales en min(x) y max(x), y líneas horizontales en max(y) y min(y).Esas formas son más fáciles de calcular para la base de datos, MySQL no admite todas las funciones poligonales.(Área sí, cadenas lineales generalmente sí, contains aún no.Más detalles aquí.).Si desea una geometría geoespacial más precisa en este momento, la mejor opción en el lado del código abierto es PostGIS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top