2009-12-28 16 views

Répondre

3

Pour autant que je sache, les fonctions tampons sont not yet implemented dans MySQL:

Ces fonctions sont pas mises en œuvre dans MySQL. Ils peuvent apparaître dans les prochaines versions.

* Buffer(g,d) 

    Returns a geometry that represents all points whose distance from the geometry value g is less than or equal to a distance of d. 

Si je comprends bien votre question à droite, vous ne pouvez pas même besoin d'une fonction spatiale pour effectuer cette requête vous pouvez utiliser une requête SQL « régulière » et le Euclidean distance:

select * 
from gistable g 
where SQRT(POW(circleCenterPT.x - point.x,2) + POW(circleCenterPT.y - point.y,2)) < radius 

Espoir CA aide.


Edit: Performance serait certainement un problème avec cette requête. En ce qui concerne les fonctions spatiales dans MySQL, il semble que les dernières instantanés incluent de nouvelles fonctions telles que Buffer ou Distance. Vous pouvez essayer:

+1

En effet, mettre la formule dans la requête fonctionnerait ... mais serait également incroyablement lent (analyse de table). Ajouter un rectangle de délimitation serait utile, mais je préfère que la base de données gère ces détails pour moi. :) Je pense que MySQL n'a pas encore de fonctions pour aider, cependant. – jsight

1

Même si vous utilisez PostGIS, vous n'avez pas besoin d'utiliser ST_Buffer fonction, mais ST_Expand qui effectue une opération étant équivalente à ce (pseudo-code):

-- expand bounding box with 'units' in each direction 
envelope.xmin -= units; 
envelope.ymin -= units; 
envelope.xmax += units; 
envelope.ymax += units; 
-- also Z coordinate can be expanded this way 

Dans la syntaxe PostGIS, requête SQL regarde habituellement comme suit:

SELECT AsText(geom) FROM mypoints 
WHERE 
    -- operator && triggers use of spatial index, for better performance 
    geom && ST_Expand(ST_GeometryFromText('POINT(10 20)', 1234), 5) 
AND 
    -- and here is the actual filter condition 
    Distance(geom, ST_GeometryFromText('POINT(10 20)', 1234)) < 5 

Trouver explication Buffer vs Expand utilisateurs de PostGIS liste de diffusion. Donc, idéalement, serait de reproduire un comportement similaire avec MySQL. Je ne suis pas du tout expert en MySQL, mais je suppose que c'est faisable même s'il n'y a pas de fonction ST_Expand.

Voici comment mimer la fonction ST_Expand:

CONCAT('POLYGON((', 
    X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',', 
    X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, ',', 
    X(GeomFromText('POINT(10 20)')) + 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',', 
    X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) + 5, ',', 
    X(GeomFromText('POINT(10 20)')) - 5, ' ', Y(GeomFromText('POINT(10 20)')) - 5, '))' 
); 

Ensuite moissonneuse-batteuse ce résultat avec requête comme ceci:

SELECT AsText(geom) FROM mypoints 
WHERE 
    -- AFAIK, this should trigger use of spatial index in MySQL 
    -- replace XXX with the of expanded point as result of CONCAT above 
    Intersects(geom, GeomFromText(XXX)) 
AND 
    -- test condition 
    Distance(geom, GeomFromText('POINT(10 20)')) < 5 

Si vous travaillez avec les versions de MySQL où la fonction Distance âgées ne sont pas disponibles, alors vous pouvez simplement utiliser l'utilisation de amercader du calcul basé sur SQRT.

J'espère que cela vous donne une idée.

0

Depuis MySQL 5.7.6.
ST_Distance_sphere(g1, g2[, radius])

Renvoie la distance sphérique mimimum entre deux points et/ou multipoints sur une sphère, en mètres, ou NULL si un des arguments de géométrie est nul ou vide

Les calculs utilisent une terre sphérique et un configurable rayon. L'argument radius optionnel doit être indiqué en mètres. Si omis, le rayon par défaut est 6 370 986 mètres. Une erreur ER_WRONG_ARGUMENTS se produit si l'argument radius est présent mais pas positif