Avatar billede shjorth Nybegynder
15. november 2009 - 03:52 Der er 2 kommentarer og
1 løsning

Sortere afstande fra mysql

Hejsa.

Jeg har en database med en masse byer og deres længde - breddegrader

Jeg bruger flg funktion til at beregne afstanden mellem de to byer:


function getDistance($lat1,$lon1,$lat2,$lon2) {
    $lat1 = deg2rad($lat1);
    $lat2 = deg2rad($lat2);
    $lon1 = deg2rad($lon1);
    $lon2 = deg2rad($lon2);

    $a = 6378137; $b = 6356752.3142; $f = 1/298.257223563; // WGS-84 ellipsoid
    $L = $lon2 - $lon1;

    $U1 = atan((1-$f) * tan($lat1));
    $U2 = atan((1-$f) * tan($lat2));

    $sinU1 = sin($U1); $cosU1 = cos($U1);
    $sinU2 = sin($U2); $cosU2 = cos($U2);

    $lambda = $L; $lambdaP = 2 * M_PI;
    $iterLimit = 20;

    while (abs($lambda - $lambdaP) > 1e-12 && --$iterLimit > 0) {
        $sinLambda = sin($lambda);
        $cosLambda = cos($lambda);
        $sinSigma  = sqrt(($cosU2 * $sinLambda) * ($cosU2 * $sinLambda) +
                          ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda) *
                          ($cosU1 * $sinU2 - $sinU1 * $cosU2 * $cosLambda));

        if ($sinSigma == 0) return 0; // co-incident points
        $cosSigma  = $sinU1 * $sinU2 + $cosU1 * $cosU2 * $cosLambda;
        $sigma      = atan2($sinSigma, $cosSigma); // was atan2
        $alpha      = asin($cosU1 * $cosU2 * $sinLambda / $sinSigma);
        $cosSqAlpha = cos($alpha) * cos($alpha);
        $cos2SigmaM = $cosSigma - 2 * $sinU1 * $sinU2 / $cosSqAlpha;
        $C          = $f / 16 * $cosSqAlpha * (4 + $f * (4 - 3 * $cosSqAlpha));
        $lambdaP    = $lambda;
        $lambda    = $L + (1 - $C) * $f * sin($alpha) *
                      ($sigma + $C * $sinSigma * ($cos2SigmaM + $C * $cosSigma *
                      (-1 + 2 * $cos2SigmaM * $cos2SigmaM)));
    }
    if ($iterLimit == 0) return false; // formula failed to converge

    $uSq = $cosSqAlpha * ($a * $a - $b * $b) / ($b * $b);
    $A  = 1 + $uSq / 16384 * (4096 + $uSq * (-768 + $uSq * (320 - 175 * $uSq)));
    $B  = $uSq / 1024 * (256 + $uSq * (-128 + $uSq * (74 - 47 * $uSq)));

    $deltaSigma = $B * $sinSigma * ($cos2SigmaM + $B / 4 * ($cosSigma * (-1 + 2 * $cos2SigmaM * $cos2SigmaM) -
                  $B / 6 * $cos2SigmaM * (-3 + 4 * $sinSigma * $sinSigma) * (-3 + 4 * $cos2SigmaM * $cos2SigmaM)));

    $s = $b * $A * ($sigma - $deltaSigma);
    $s = round($s/1000); // round to 1mm precision
    return $s;
}

Men jeg kunne godt tænke mig at lave en funktion så man kan indtaste en afstand og så deraf kunne outputte byer der er inden for den afstand.
Jeg har dog ingen ide om hvordan jeg gør, da selve afstandende ikke ligger i databasen, men i beregningen.

Håber der er nogen der kan hjælpe :)
Avatar billede intenz Novice
15. november 2009 - 21:35 #1
Hvis du skal gøre det, skal du jo have alt data ud af din database og så lave den beregning på dem. Og så efterfølgende finde ud af hvilke ligger indenfor den afstand du har valgt.

Det ville nok være smartere hvis du kunne finde min/max længde/breddegrad på den afstand du vil finde byer indenfor. Og så lave et BETWEEN x AND y på både længde- og breddegrad i dit SQL kald.

Giver det mening?
Avatar billede shjorth Nybegynder
15. november 2009 - 23:18 #2
Okay.. Men i så fald skal jeg så på en måde sortere efter størst difference. Hvordan kan jeg mon gøre det ?
Avatar billede shjorth Nybegynder
03. december 2009 - 21:26 #3
Snupper points. Hvis der er noget brok, så bare skriv, og du får points :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester