2009-08-07 14 views
6

J'ai trouvé ce script PHP/MySQL populaire appelé Zip Location par SaniSoft et il fonctionne très bien à part une chose: il ne le fait pas dans certains cas.Trouver des codes postaux dans un rayon spécifique

Il semble que tout rayon inférieur à 20 milles renvoie le même nombre de codes postaux que 20 milles. J'ai cherché partout google, mais en vain et je me demandais si quelqu'un avait un aperçu de cette situation.

Je préférerais trouver ce problème avant de devoir payer pour un programme, et je pourrais aussi utiliser l'expérience d'apprentissage. La base de données est une liste de codes postaux et de longitudes et latitudes de chaque code postal. Le script utilise une méthode qui détermine la distance autour du code postal entré et renvoie les codes postaux dans ce rayon en fonction de leur lon/lat.

Merci! En utilisant la fonction de distance fournie par le script, j'ai découvert que la distance entre les codes postaux que le programme me donne et mon code postal sont de 0 miles.

IMPORTANTE MISE A JOUR

De la recherche, il se trouve que la base de données a des valeurs en double en latitude/longitude. S'il vous plaît soyez conscient de cela lors de l'utilisation Zip Locator. Bien que le PHP fasse son travail, vous devrez trouver une nouvelle base de données de codes postaux. Je posterai mes conclusions à une date ultérieure.

Répondre

1

Deuxième tentative!

En regardant votre déclaration de problème édité, je regarderais comment vous attribuez vos valeurs zip.

De nombreuses erreurs peuvent être introduites si vos codes postaux sont des entiers au lieu de chaînes. Le plus gros problème est que les codes postaux américains peuvent commencer par 0.

Les exemples dans ziptest.php ne sont pas bons, puisque les zips traiter comme des entiers. Lorsque vous essayez de décrire mon propre code postal avec un nombre entier:

$zip1 = 02446; 

Son interprété par PHP comme la valeur octal 2446. phpZipLocator les utilisations qui mettent en valeur comme une chaîne sans conversion explicite. PHP lui donne donc la valeur décimale de l'octal 2446 en tant que chaîne (1318) qui n'est pas du tout un code postal.

Au lieu de notifier qu'il n'a pas trouvé un code postal, phpZipLocator fait une recherche de rayon de tous les codes postaux dans un rayon de quelque chose de donné qui n'existe pas, qu'il décide doit être 1.

Si J'ai mis le code postal en utilisant une chaîne

$zip1 = '02446'; 

J'obtiens le bon résultat.

À mon humble avis, il semble que phpZipLocator pourrait utiliser un peu de travail.

+0

Merci beaucoup otterfan. +1 pour vous mais, malheureusement, cela ne résout pas le problème. Le code postal que j'utilise est 11950, et le rayon que je mets à 5, il arrive avec 73 codes postaux. J'envoie la variable de code postal par l'intermédiaire d'une variable de poste actuellement. Mais j'ai changé la variable en $ zip1 = '11950'; et j'ai toujours le même résultat. –

+0

Je vois comment cela fonctionne avec votre code postal, des choses intéressantes ici. –

+0

Encore plus intéressant, certains des 73 codes postaux qui se présentent sont à environ 20 miles. –

10

Les calculs de distance approximative suivants sont relativement simples, mais peut produire des erreurs de distance de 10% ou plus. Ces calculs approximatifs sont effectués en utilisant les valeurs de latitude et de longitude en degrés. La première approximation ne nécessite que des fonctions mathématiques simples:

Approximate distance in miles = sqrt(x * x + y * y) 

where 
     x = 69.1 * (lat2 - lat1) 
and 
     y = 53 * (lon2 - lon1) 

Vous pouvez améliorer la précision de ce calcul de la distance approximative en ajoutant la fonction mathématique cosinus:

Approximate distance in miles = sqrt(x * x + y * y) 

where 
     x = 69.1 * (lat2 - lat1) 
and 
     y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Si vous avez besoin plus de précision, vous devez utiliser le calcul exact de la distance. Le calcul exact de la distance nécessite l'utilisation de la géométrie sphérique, puisque la Terre est une sphère. Le calcul exact de la distance nécessite également un niveau élevé de précision mathématique en virgule flottante - environ 15 chiffres de précision (parfois appelée «double précision»). De plus, les fonctions de trig trig utilisées dans le calcul exact nécessitent la conversion des valeurs de longitude et de longitude en degrés en radians. Pour convertir la latitude ou longitude de degrés en radians, divisez les valeurs de latitude et de longitude dans cette base de données par 180/pi, ou 57.2958. Le rayon de la Terre est supposé être 6,371 kilomètres, ou 3,958.75 miles. Vous devez inclure la conversion des degrés en radians dans le calcul . Degrés pour radians Le remplacement, le calcul est:

  Exact distance in miles = 3958.75 * arccos[sin(lat1/57.2958) * 
           sin(lat2/57.2958) + 
           cos(lat1/57.2958) * 
           cos(lat2/57.2958) * 
           cos(lon2/57.2958 - lon1/57.2958)] 
0

La valeur par défaut pour le rayon dans le script de démonstration pour phpZipLocator (ziptest.php) utilise 20 miles que son rayon par défaut

$radius = 20; 
$zipArray = $zipLoc->inradius($zipOne,$radius); 

Je dirais que cette valeur pour $radius est encore dans votre code et est le rayon que vous écrasant souhaitez utiliser. Essayez de faire une recherche et de remplacer pour $radius.

Mieux encore, regardez votre code avec un débogueur et voyez si $radius est mis à 20 lorsque vous appelez inradius().

+0

J'ai directement modifié cette valeur la première fois. Merci pour votre aide si. –

+0

J'ai utilisé la fonction de distance, et à ma grande surprise, les codes postaux qui apparaissent sont 0 miles de mon code postal. –

Questions connexes