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
Libérer: 2025-01-09 11:56:46
original
185 Les gens l'ont consulté

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.

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 英里
Copier après la connexion

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 :

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;
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal