sql >> Database >  >> RDS >> Mysql

Coördinatenvergelijking in database

De beste manier om zoekopdrachten in de buurt uit te voeren, is door te beginnen met een soort benadering van de grensrechthoek en van daaruit naar een daadwerkelijke grote-cirkelafstand tussen mensen te gaan.

Zolang je breedtegraden niet te dicht bij de polen liggen, is dit een slordige maar werkbare benadering voor de afstand tussen twee punten (in SQL-achtig):

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

Als je nauwkeuriger wilt zijn en je weet dat je alleen geeft om mensen die zich binnen, laten we zeggen, 10 km van elkaar bevinden, dan kun je een begrenzende rechthoek zoeken zoals deze.

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

Dit werkt omdat er 111.045 km is op één breedtegraad. De cosinustermen in de lengtegraadgrenzen verklaren het feit dat breedtegraden dichter bij elkaar komen naarmate je dichter bij de polen komt. Hiermee kunt u MySQL-indexen gebruiken op uw latitude_from_table en longitude_from_table kolommen.

Zodra u de nabijheid van de begrenzingsbox hebt, kunt u een formule voor de grootcirkelafstand toepassen. Hier is achtergrond over. http://www.plumislandmedia.net/mysql/haversine-mysql- dichtstbijzijnde-loc/

Voor het soort toepassing dat u overweegt, is 32-bits IEEE-488 drijvende komma voldoende precisie voor uw coördinaten. Als de punten die u bekijkt heel dicht bij elkaar liggen (minder dan een km of zo), wilt u de Vincenty-formule gebruiken (http://www.plumislandmedia.net/mysql/vicenty-great-circle-distance-formula/ ) in plaats van de meer gebruikelijke zogenaamde haversine-formule (http://www.plumislandmedia.net/mysql/stored-function-haversine-distance-computation/ ).

Als uw aantal mensen veel boven de 300K komt, kunt u overwegen om het MySQL geospatiale indexeringsschema te gebruiken. Het werkt alleen met MyISAM-tabellen, maar het is erg snel in het zoeken naar begrenzingsrechthoeken. Kijk hier. http://www.plumislandmedia.net/mysql/haversine-mysql- dichtstbijzijnde-loc/



  1. Hoe te deblokkeren met mysqladmin flush hosts

  2. SQL Server 2016:Verbeteringen voor beschikbaarheidsgroepen

  3. Hoe een veld op te halen uit MySQL-queryresultaat in bash

  4. Intersectie van MySQL-geometrie produceert niet-kruisende resultaten