2009-12-14 4 views
2
SELECT `NAME` FROM world_boundaries 
WHERE Within(GeomFromText('POINT(8.5929098 50.0286713)'), ogc_geom); 

Pourquoi cette requête renvoie-t-elle 3 pays lorsqu'elle doit renvoyer une réponse? Il retourne: 1. France 2. Allemagne (correct un) 3. AmériqueRequête MySQL dans la géométrie

Mes données des limites territoriales des pays défectueux ou est-il un truc avec ces fonctions de géométrie?

+0

J'ai ajouté l'approche que j'ai utilisée pour résoudre un problème similaire. J'espère que cela t'aides. –

Répondre

4

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 . :)

+0

Existe-t-il un algorithme php qui peut utiliser des données mysql géométriques et vérifier si un point est dans une polyligne donnée? – dfilkovi

+0

Vous pouvez étendre l'algorithme que j'ai donné pour plusieurs polys. Il est préférable de confier ce travail à MySQL plutôt que de le calculer en PHP, mais de toute façon vous pouvez voir l'article que j'ai lié et réécrire ce morceau de code en PHP. –