Nejlepší způsob, jak zacházet s prohledáváním blízkosti, je začít s nějakou aproximací ohraničujícího obdélníku a odtud přejít ke skutečné vzdálenosti mezi lidmi ve velkém kruhu.
Pokud vaše zeměpisné šířky nejsou příliš blízko pólů, nedbalá, ale funkční aproximace vzdálenosti mezi dvěma body je tato (v SQLish):
GREATEST(ABS(lat1-lat2),ABS(long1-long2))
Pokud chcete být přesnější a víte, že vám záleží pouze na lidech, kteří jsou mezi sebou, řekněme, 10 km, můžete použít vyhledávání v ohraničujícím obdélníku, jako je tento.
WHERE latitude_from_table
BETWEEN latpoint - (10.0 / 111.045)
AND latpoint + (10.0 / 111.045)
AND longitude_from_table
BETWEEN longpoint - (10.0 / (111.045 * COS(RADIANS(latpoint))))
AND longpoint + (10.0 / (111.045 * COS(RADIANS(latpoint))))
Funguje to, protože v jednom stupni zeměpisné šířky je 111 045 km. Kosinové členy v hranicích zeměpisné délky odpovídají za skutečnost, že čáry zeměpisné šířky jsou blíže k sobě, když se přibližujete k pólům. To vám umožní využívat indexy MySQL ve sloupcích latitude_from_table a longitude_from_table.
Jakmile budete mít blízkost ohraničovacího rámečku, můžete použít vzorec vzdálenosti velkého kruhu. Tady je pozadí toho. http://www.plumislandmedia.net/mysql/haversine-mysql- nejbližší-loc/
Pro druh aplikace, o kterém uvažujete, je 32bitový IEEE-488 s pohyblivou řádovou čárkou dostatečně přesný pro vaše souřadnice. Pokud jsou body, na které se díváte, opravdu blízko u sebe (méně než km nebo tak), chcete použít vzorec Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) spíše než běžnější takzvaný vzorec haversine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).
Pokud váš počet lidí přesáhne 300 000, možná budete chtít zvážit použití schématu geoprostorového indexování MySQL. Funguje pouze s tabulkami MyISAM, ale je to velmi rychle při vyhledávání ohraničujících obdélníků. Viz zde. http://www.plumislandmedia.net/mysql/haversine-mysql- nejbližší-loc/