requête mysql points à l'intérieur du polygone - pas de résultats
Je suis assez sûr que je suis en train de faire plusieurs choses de mal ici, mais je ne suis pas sûr de ce que...
La table (moins quelques champs):
CREATE TABLE IF NOT EXISTS `stuff` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`lat` decimal(12,7) NOT NULL,
`lon` decimal(12,7) NOT NULL,
`location` point NOT NULL,
UNIQUE KEY `id` (`id`),
KEY `distance` (`distance`),
KEY `lat` (`lat`),
KEY `lon` (`lon`),
SPATIAL KEY `location` (`location`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5;
Les déclencheurs pour définir automatiquement le point d'emplacement:
DROP TRIGGER IF EXISTS `stuff_insert_defaults`;
DELIMITER //
CREATE TRIGGER `stuff_insert_defaults` BEFORE INSERT ON `stuff`
FOR EACH ROW SET NEW.location = PointFromText(CONCAT('POINT(',NEW.lat,' ',NEW.lon,')'))
//
DELIMITER ;
DROP TRIGGER IF EXISTS `stuff_update_location`;
DELIMITER //
CREATE TRIGGER `stuff_update_location` BEFORE UPDATE ON `stuff`
FOR EACH ROW SET NEW.location = PointFromText(CONCAT('POINT(',NEW.lat,' ',NEW.lon,')'))
//
DELIMITER ;
Certaines données-échantillon (4 points aléatoires dans l'état du Colorado):
/* 4 random points within the state of colorado */
INSERT INTO `stuff` (`id`, `distance`, `lat`, `lon`, `location`) VALUES
(1, 5.0000000, 40.2488450, -103.8003460, 0x000000000101000000f6622827da1f444001df6dde38f359c0),
(2, 5.0000000, 38.4849180, -107.8726700, 0x000000000101000000f19e03cb113e4340d28c45d3d9f75ac0),
(3, 5.0000000, 39.5040250, -105.3584800, 0x000000000101000000e6ae25e483c0434049111956f1565ac0),
(4, 5.0000000, 39.1904180, -106.8179680, 0x000000000101000000ed48f59d5f9843402b4b749659b45ac0);
Bruts outter frontière de l'état du Colorado:
NW corner: 41.000497 -109.050149
NE corner: 41.002380 -102.051881
SE corner: 36.993237 -102.041959
SW corner: 36.999037 -109.045220
La requête qui DOIT retourner les 4 dossiers que nous avons inséré:
SELECT *, AsText(location) FROM stuff
WHERE Contains(
GeomFromText('POLYGON((41.000497 -109.050149, 41.002380 -102.051881, 36.993237 -102.041959, 36.999037 -109.045220, 41.000497 -109.050149))'), location );
Ce que je suis de retour...
nada...
zip...
nil...
nothing...
OriginalL'auteur ppetree | 2013-06-12
Vous devez vous connecter pour publier un commentaire.
Comme indiqué sous La classe
Polygone
(italiques ajoutés):Vous devez donc fermer le polygone en finition au point de départ:
Voir sur sqlfiddle.
La fermeture du polygone dans l'exemple original de travail mais quand je lance la requête sur le serveur de production, je ne reçois rien... même quand il y a plus de 1000 résultats possibles.
ce n'est pas précis, c'est comme la vérification d'un bâtiment rectangulaire, pas un polygone
Il est exact que les
Contains()
des tests sur le MBR (comme de la v5.6.1, on peut utiliserST_Contains()
pour tester contre l'exacte polygone), mais ce n'était pas la question posée: je maintiens le fait que ce post correctement et répond pleinement à la problématique posée.OriginalL'auteur eggyal