Maison >base de données >tutoriel mysql >Comment puis-je trouver efficacement tous les bâtiments dans un rayon de 5 miles d'un point donné ?

Comment puis-je trouver efficacement tous les bâtiments dans un rayon de 5 miles d'un point donné ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-09 11:56:46159parcourir

How Can I Efficiently Find All Buildings Within 5 Miles of a Given Point?

Optimisez la requête spatiale : recherchez efficacement tous les bâtiments dans un rayon de 8 km

Cet article explore un problème spatial courant : récupérer tous les bâtiments dans un rayon spécifié à partir d'un point de coordonnées donné. L'utilisation directe de la fonction ST_CONTAINS peut ne pas être efficace, c'est pourquoi cet article explorera de meilleures solutions.

L'importance de la représentation des données

Avant d'entrer dans les détails techniques, il est important de souligner l'importance d'une représentation correcte des données. Le stockage des données géospatiales dans des colonnes distinctes de longitude et de latitude crée des inefficacités dans les opérations de requête. À cette fin, il est fortement recommandé d'utiliser les types de données geometry ou geography, qui encapsulent deux coordonnées dans un seul champ.

Utilisez ST_DWithin pour effectuer efficacement des requêtes de proximité

ST_DWithin est une fonction puissante qui vérifie directement si deux géométries se trouvent à une distance spécifiée. En convertissant le rayon de recherche en mètres et en le comparant à la distance calculée à l'aide de ST_DWithin, nous pouvons identifier efficacement les bâtiments dans la plage souhaitée.

<code class="language-sql">SELECT name, long, lat
FROM building
WHERE ST_DWithin(
  ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'),
  ST_POINT(long, lat),
  8046.72
);
-- 8046.72 米 = 5 英里</code>

Utilisez ST_Distance pour gérer la distance convertie en miles

Vous pouvez également utiliser ST_Distance pour calculer la distance entre les formes géométriques. Le résultat est initialement en mètres, mais nous pouvons le convertir en miles en utilisant un simple facteur de multiplication :

<code class="language-sql">SELECT name, long, lat,
  ST_Distance(
    ST_GEOMETRY_FROM_TEXT('POINT(-84.38653999999998,33.72024)'),
    ST_POINT(long, lat)
  ) * 0.000621371 AS distance
FROM building
WHERE distance < 5;</code>

Remarque : Lors de l'utilisation de ST_Distance, les requêtes spatiales doivent être traitées efficacement à l'aide d'index. Bien que ST_Distance lui-même ne prenne pas en charge l'indexation, la création d'un index spatial sur ST_GEOMETRY peut optimiser les performances globales des requêtes.

Résumé

En explorant des approches alternatives et en mettant l'accent sur l'optimisation de la représentation des données, nous démontrons une méthode permettant de récupérer efficacement des bâtiments dans une plage spécifiée. Les techniques présentées dans cet article offrent des améliorations en termes d'évolutivité et de performances pour les requêtes spatiales dans les applications du monde réel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn