Mysql
 sql >> база данни >  >> RDS >> Mysql

Сравнение на координати в базата данни

Най-добрият начин да се справите с търсенето в близост е да започнете с някакво приближение на ограничаващ правоъгълник и след това да преминете оттам до реално разстояние с голям кръг между хората.

Докато вашите географски ширини не са твърде близо до полюсите, небрежно, но работещо приближение за разстоянието между две точки е това (на SQLish):

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

Ако искате да бъдете по-точни и знаете, че се интересувате само от хора, които са в рамките на, да кажем, на 10 км един от друг, можете да използвате търсене в ограничаващ правоъгълник като това.

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

Това работи, защото има 111,045 км на един градус географска ширина. Косинусовите термини в границите на дължината обясняват факта, че линиите на географска ширина са по-близо една до друга, когато се приближавате до полюсите. Това ви позволява да използвате MySQL индекси във вашите колони latitude_from_table и longitude_from_table.

След като имате близост до ограничаваща кутия, можете да приложите формула за голямо разстояние в кръг. Ето предистория за това. http://www.plumislandmedia.net/mysql/haversine-mysql- най-близкото местоположение/

За вида приложение, което обмисляте, 32-битовата IEEE-488 плаваща запетая е много прецизна за вашите координати. Ако точките, които разглеждате, са наистина близо една до друга (по-малко от километър), искате да използвате формулата на Vincenty (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ), а не по-често срещаната така наречена формула на hasrsine (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Ако вашият брой хора е много над 300K, може да помислите за използването на схемата за геопространствено индексиране на MySQL. Работи само с MyISAM таблици, но е много бърз при извършване на търсене с ограничаващ правоъгълник. Виж тук. http://www.plumislandmedia.net/mysql/haversine-mysql- най-близкото местоположение/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Задаване на времево ограничение php

  2. MySQL:СЪЕДИНЕТЕ две таблици на LIKE

  3. Има ли MySQL кеширане, как да го поправя?

  4. MySQL аналог с дълъг текст в Microsoft SQL?

  5. Използването на SUM, така че NULL в колоните, прави сумата NULL