sql >> Databasteknik >  >> RDS >> Mysql

Koordinatjämförelse i databas

Det bästa sättet att hantera närhetssökningar är att börja med någon form av avgränsande rektangel-approximation och sedan gå därifrån till ett verkligt avstånd i en stor cirkel mellan människor.

Så länge dina breddgrader inte är för nära polerna, är en slarvig men användbar approximation för avståndet mellan två punkter detta (på SQLish):

GREATEST(ABS(lat1-lat2),ABS(long1-long2))

Om du vill vara mer exakt och du vet att du bara bryr dig om människor som är inom, låt oss säga, 10 km varandra kan du använda en avgränsande rektangelsökning som denna.

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))))

Detta fungerar eftersom det finns 111.045 km på en latitud. Cosinustermera i longitudgränserna förklarar det faktum att latitudlinjerna är närmare varandra när du kommer nära polerna. Detta låter dig utnyttja MySQL-index i kolumnerna latitude_from_table och longitude_from_table.

När du väl har närhet till gränsruta kan du använda en formel för storcirkelavstånd. Här är bakgrunden om det. http://www.plumislandmedia.net/mysql/haversine-mysql- närmaste-loc/

För den typ av applikation du överväger, är 32-bitars IEEE-488 flyttal gott om precision för dina koordinater. Om punkterna du tittar på ligger riktigt nära varandra (mindre än en km eller så) vill du använda Vincenty-formeln (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) snarare än den vanligare så kallade haversineformeln (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Om ditt antal personer går mycket över 300K, kanske du vill överväga att använda MySQL geospatiala indexeringsschema. Det fungerar bara med MyISAM-tabeller, men det är mycket snabb på att göra sökningar med avgränsande rektangel. Kolla här. http://www.plumislandmedia.net/mysql/haversine-mysql- närmaste-loc/



  1. mysql uppdatering ökar int-fältet som är null

  2. En SQL-fråga för att välja en sträng mellan två kända strängar

  3. SQL Server-index - stigande eller fallande, vilken skillnad gör det?

  4. Ta bort en rad med relationer till andra tabeller