2010-09-07 18 views
0

Je viens de développer une calculatrice de distance code postal pour mon entreprise Dads, où tous nos clients sont conservés dans les dossiers et chaque fois qu'un nouveau client potentiel fait une demande, le système vérifie les codes postaux de tous les autres clients. Le problème est qu'il ne fait pas encore le calcul de distance. Si vous tapez un code postal DT1 avec une distance de 5 miles, DT1, 2 et 3 sont proches. DT2 dit DT1 et 2, DT3 dit DT1, 3 et 4. Cela n'a aucun sens. Pourtant, si je mets en BH2 avec une distance de 50 miles, il ramènera Bournemouth, Dorchester, Portsmouth, Bath, Southampton et quelques autres villes. Ce sont tous corrects - mais je ne sais pas ce qui se passe avec les codes postaux DT. DT11 ne rapporte rien (moins de 5 miles), pas plus que DT10 (sauf pour eux-mêmes). J'ai tout d'abord utilisé la racine de (x * x + y * y) - je crois que c'est ce qu'on appelle le théorème de Pythagore .. pas sûr car cela fait des années que j'ai utilisé ce terme !!Calcul de distance code postal

J'ai également essayé les suivantes:

$sinstuff = sin(deg2rad($latitude))*sin(deg2rad($latitude2)); 
    $cosstuff = cos(deg2rad($latitude))*cos(deg2rad($latitude2))*cos(deg2rad($longitude-$longitude2)); 
    $sumstuff = $sinstuff + $cosstuff; 
    $acosstuff = rad2deg(acos($sumstuff)); 
    $distance = $acosstuff*60*1.1515; //dunno what the 60 and 1.1515 is all about - I got this formula off a website. 

C'est la formule qui semble apporter les résultats étranges. Je remarque également que la distance exacte entre DT11 et DT11 est quelque chose comme +/- 0.00000989 {et beaucoup d'autres nombres}. Cela semble également un peu étrange puisque, sûrement, la distance entre DT11 et lui-même est 0 ...

Quelqu'un at-il déjà fait quelque chose comme ça avant avec succès? J'ai un lot massif de fichiers - environ 158 Mo au total - contenant tous les codes postaux du Royaume-Uni dans leur intégralité, avec la latitude et la longitude correspondantes. Mon objectif est, plutôt que de comparer le code postal complet spécifié à tous les autres codes postaux complets, de déterminer quels codes régionaux sont à une certaine distance, puis de comparer le code postal spécifié à tous les codes postaux complets qui se trouvent dans ces zones. Est-ce efficace? Y a-t-il un moyen plus efficace?

Toute aide avec ceci serait grandement appréciée.

Cordialement,

Richard

PS Je sais qu'il ya des sites là-bas qui vous indiquent comment travailler les distances mais je ne semblent être en mesure d'obtenir l'un d'eux fonctionne correctement (comme vous pouvez dire d'en haut). PPS Je sais que je peux utiliser l'API Google pour cela - mais ce n'est pas une option car il s'agira d'une application hors ligne fonctionnant sur une installation locale de serveur wamp. Il est à utiliser dans les salons où nous ne pouvons pas garantir une connexion Internet.

+0

environ '+/- 0.00000989 {et beaucoup d'autres nombres}', c'est juste une erreur d'arrondi –

+0

Il devrait toujours être 0, sûrement ... quel que soit le calcul si les chiffres sont les mêmes, il devrait être 0 .. Je l'ai trouvé quand je l'ai arrondi à 2 dp et ça a fonctionné à 0 que c'était juste arrondi - mais il ne devrait pas besoin d'arrondi .. – ClarkeyBoy

Répondre

1

Vous êtes utiliser la formule Haversine:

$ l1 ==> latitude1
$ o1 ==> longitude1
l2 $ ==> latitude2
$ o2 ==> longitude2

(prise de http://www.go4expert.com/forums/showthread.php?t=339)

 
function haversine ($l1, $o1, $l2, $o2)
{
$l1 = deg2rad ($l1);
$sinl1 = sin ($l1);
$l2 = deg2rad ($l2);
$o1 = deg2rad ($o1);
$o2 = deg2rad ($o2);
return (7926 - 26 * $sinl1) * asin (min (1, 0.707106781186548 * sqrt ((1 - (sin ($l2) * $sinl1) - cos ($l1) * cos ($l2) * cos ($o2 - $o1)))));
}

Cela devrait vous donner la distance entre les deux points.

+0

Il semble que cela ait été exactement ce que j'utilisais, mais dans un format différent. Il obtient exactement les mêmes résultats - DT1 => DT1, 2, 3; DT2 => DT1, 2; DT3 => DT1, 3, 4 etc etc – ClarkeyBoy

+0

Pensez-y, sûrement en utilisant la racine de x * x + y * y devrait fonctionner, n'est-ce pas? Je veux dire en prenant lat1 de lat2 et long1 de long2 vous créez deux distances. En utilisant ceux-ci comme deux côtés d'un triangle devrait donner un triangle rectangle que vous pouvez ensuite utiliser théorème pythags pour élaborer l'hypoténuse ... Bien que je suppose qu'il ya la conversion des unités à considérer. Est Lat/Long en mètres, par hasard? Si oui, vous pouvez simplement diviser par 1000 pour obtenir le km ou ~ 1680 pour obtenir des miles. – ClarkeyBoy

+0

Eh bien, je suis venu avec ma propre formule - convertir lat/long en mètres, puis faire théorème pythags, puis en divisant par le nombre de mètres dans un mile. Il arrive toujours avec exactement le même résultat. Je me demande si c'est le code qui a décidé quels résultats sortir ce qui provoque cela .. – ClarkeyBoy

1

Je pense que le bureau de poste maintient un fichier d'adresse de code postal qui répertorie chaque code postal du Royaume-Uni et son adresse associée (pas sûr si elle a lattitude et information de longitude).J'ai vu des copies de cela (peut-être pas totalement à jour) sur les disques de couverture sur divers magazines PC dans le passé . Je suis sûr que vous avez à payer pour la dernière version, mais vous pourriez être en mesure d'obtenir un point de départ en vérifiant les disques de couverture à partir de questions.