MySQL ne peut pas encore vérifier un point dans poly. Il va vérifier si votre point est dans le ([minX, maxX], [minY, maxY]). En outre, je ne vois pas within
dans la documentation MySQL.
Remarque
Actuellement, MySQL ne met pas en œuvre ces fonctions selon le cahier des charges. Ceux qui sont implémentés renvoient le même résultat que les fonctions MBR correspondantes. Cela inclut les fonctions de la liste suivante autres que Distance() et Related().
Ces fonctions peuvent être implémentées dans les prochaines versions avec une prise en charge complète de l'analyse spatiale, et pas seulement du support MBR.
From here
J'ai utilisé un algorithme point-in-poly ray-tracing, qui peut être tout à fait exact en dehors des régions polaires si les lignes ne sont pas longues. Sinon, vous devrez résoudre des triangles sphériques.
La mise en œuvre est simple comme ceci:
create table point (x int, y int...) /* int values (int(lat * 10^6)) for better performance */
create table poly (x1 int, y1 int, x2 int, y2 int...) /* temporary table for 1 poly only */
requête qui sélectionne des points à l'intérieur du poly:
select point_id from point, poly
where ((y<y2 and y>=y1) or (y<y1 and y>=y2)) and ((x<x2 and x>=x1) or (x<x1 and x>=x2))
group by point_id
having sum(x1*(y2-y1)*sign(y2-y1) < x*(y2-y1)*sign(y2-y1) - (y-y1)*(x2-x1)) % 2
Comtes 20000 points contre un poly de 40 lignes en 0,06 secondes avec Pentium 2.5Ghz . :)
J'ai ajouté l'approche que j'ai utilisée pour résoudre un problème similaire. J'espère que cela t'aides. –