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