sql >> Database >  >> RDS >> PostgreSQL

Meest efficiënte manier om punten binnen een bepaalde straal van een bepaald punt te vinden

Het creëren van een buffer om de punten te vinden is een absolute no-no vanwege (1) de overhead van het maken van de geometrie die de buffer vertegenwoordigt, en (2) de point-in-polygoonberekening is veel minder efficiënt dan een eenvoudige afstandsberekening.

U werkt duidelijk met (lengtegraad, breedtegraad) gegevens, dus u moet dat converteren naar een geschikt Cartesisch coördinatensysteem dat dezelfde maateenheid heeft als uw afstand van 10.000. Als die afstand in meter is, dan zou je het punt ook uit de tabel kunnen casten naar geography en bereken direct op de (lange, lat) coördinaten. Aangezien u alleen de punten wilt identificeren die binnen de opgegeven afstand liggen, kunt u de ST_DWithin() functie met berekening op de bol voor extra snelheid (doe dit niet op zeer hoge breedtegraden of met zeer lange afstanden):

SELECT id, point 
FROM my_table 
WHERE ST_DWithin(point::geography,
                 ST_GeogFromText('POINT(-116.768347 33.911404)'),
                 10000, false);


  1. Krijg resultaten van mysql op basis van breedtegraad en lengtegraad

  2. Records ophalen uit een specifieke kolom in oracle

  3. MySQL vs PostgreSQL JSON zoekfuncties

  4. Hoe selecteer je alle kolommen, plus het resultaat van een CASE-statement in orakel 11g?