How to organize by proximity using PHP?

Asked

Viewed 1,124 times

4

I have a few locations registered in the database, and each one of them has longitude and latitude. When the user enters the site, I ask him to inform his geolocation. I am using the library Phpgeo to calculate the distance between each one, but how can I organize this result?

Ex: Local 1, Local 2, Local 3

I’m closer to the Location 2, afterward Location 3 and then the Location 1.

How do I organize it?

  • You are doing a select across BD and then bringing all the results, to filter in PHP which one is closest?

2 answers

9

Starting from Phpgeo itself, as mentioned in the question:

Vincenty’s formula

<?php
   use Location\Coordinate;
   use Location\Distance\Vincenty;
   $coordenada1 = new Coordinate( -23.575, -46.658 );
   $coordenada2 = new Coordinate( -21.279, -44.297 );
   $calculadora = new Vincenty();
   echo $calculadora->getDistance( $coordenada1, $coordenada2 );
?>


Haversine’s formula

To haversine formula is much faster to calculate, but less precise.

<?php
   use Location\Coordinate;
   use Location\Distance\Haversine;
   $coordenada1 = new Coordinate( -23.575, -46.658 );
   $coordenada2 = new Coordinate( -21.279, -44.297 );
   $calculadora = new Haversine();
   echo $calculadora->getDistance( $coordenada1, $coordenada2 );
?>

Github - Phpgeo


Calculating the distance of the origin to several points, and ordering:

To sort the results, you can start from the reference point, and in a loop store the calculated distances in an array, and then sort them:

<?php
    $origem       = new Coordinate( -22.155, -45.158 );

    // Lembre-se de inicializar as arrays de acordo com seu código
    $nome[1] = 'Ponto1';
    $coordenada[1] = new Coordinate( -23.575, -46.658 );

    $nome[2] = 'Ponto2';
    $coordenada[2] = new Coordinate( -21.279, -44.297 );

    $nome[3] = 'Ponto3';
    $coordenada[3] = new Coordinate( -21.172, -44.017 );
    ... etc ...

    // Vamos calcular a distância de todos para a $origem:
    $calculadora = new Haversine();
    $count = count( $coordenada );
    for ($i = 0; $i < $count; $i++) {
       $distancia[i] = calculadora->getDistance( $origem, $coordenada[i] );
    }

    // Agora ordenamos os pontos de acordo com a $distancia:
    array_multisort( $distancia, $coordenada, $nome );
?>

0

First you need to know your location in coordinates. Then you calculate the distances between the starting point(you) and the other points, using the haversine formula, or some PHPGEO resource if it has, I do not know. Then you take the smallest value and ready, this is the shortest distance, with this logic you can put the distances in an array, so array[0] -> shortest distance, array[1] -> shortest second distance...

Browser other questions tagged

You are not signed in. Login or sign up in order to post.