Question

Cette question est pour les experts Mysql-extension géospatiale.

La requête suivante ne pas le résultat que je me attends:

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

En gros nous créons 2 Polygones, et nous essayons d'utiliser MBRContains pour déterminer si un point se trouve dans l'une des deux polygones.

De façon surprenante, il renvoie les deux polygones! Point de 3,6 ne devrait exister dans le premier polygone inséré.

Notez que les deux polygones sont inclinés (une fois que vous dessinez les polygones sur un morceau de papier, vous verrez)

Comment se MySql retourne les deux polygones? J'utilise MySql Community Edition 5.1.

Était-ce utile?

La solution

UPDATE : Espérons que cette réponse a été rendu obsolète par MySQL: http: / /forge.mysql.com/wiki/GIS_Functions ! Laissera comme référence pour les anciennes implémentations de MBRContains mais une nouvelle réponse expliquant les changements seraient les bienvenus et devrait être « accepté » au-dessus celui-ci.

commencer réponse obsolète

Vous utilisez (par nécessité) rectangles de délimitation minimum , pas les polygones en tant que tels. Aux fins de votre requête la forme comparés est équivalente à:

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

pour la première forme et:

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

pour le second. (3,6) est en deux.

MBR est un moyen d'estimation grossière, de l'image du rectangle comme ayant des lignes verticales à min (x) et max (x), et des lignes horizontales au maximum (y) et min (y). Ces formes sont plus faciles pour la base de données pour calculer, MySQL ne supporte pas toutes les fonctions du polygone. (Zone oui, linestrings généralement oui, contains pas encore. Plus de détails PostGIS .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top