sql >> Databáze >  >> RDS >> PostgreSQL

Nejúčinnější způsob, jak najít body v určitém poloměru od daného bodu

Vytváření vyrovnávací paměti pro nalezení bodů je jednoznačné ne-ne, protože (1) je režie při vytváření geometrie, která představuje vyrovnávací paměť, a (2) výpočet bodu v polygonu je mnohem méně efektivní než jednoduchý výpočet vzdálenosti.

Zjevně pracujete s daty (zeměpisná délka, šířka), takže byste je měli převést na vhodný kartézský souřadnicový systém, který má stejnou měrnou jednotku jako vaše vzdálenost 10 000. Pokud je tato vzdálenost v metrech, můžete bod z tabulky přenést také do geography a vypočítat přímo na (dlouhé, zeměpisné) souřadnice. Protože chcete identifikovat pouze body, které jsou v zadané vzdálenosti, můžete použít ST_DWithin() funkce s výpočtem na kouli pro přidanou rychlost (nedělejte to, když jste ve velmi vysokých zeměpisných šířkách nebo na velmi dlouhé vzdálenosti):

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


  1. Návrh databáze:Registrace a ověření

  2. Zkontrolujte, zda existuje spoušť

  3. Jak vrátit NULL, když je výsledek prázdný?

  4. mysql_real_escape_string není dost dobrý?