Question

En PHP, je le code suivant pour calculer la distance entre deux emplacements:

<?php
function distance($lat1, $long1, $lat2, $long2) {
    // DEGREE TO RADIAN
    $latitude1 = $lat1/180*pi();
    $longitude1 = $long1/180*pi();
    $latitude2 = $lat2/180*pi();
    $longitude2 = $long2/180*pi();
    // FORMULA: e = ARCCOS ( SIN(Latitude1) * SIN(Latitude2) + COS(Latitude1) * COS(Latitude2) * COS(Longitude2-Longitude1) ) * EARTH_RADIUS
    $distance = acos(sin($latitude1)*sin($latitude2)+cos($latitude1)*cos($latitude2)*cos($longitude2-$longitude1))*6371;
    return $distance;
}
echo distance(9.9921962, 53.5534074, 9.1807688, 48.7771056); // Hamburg, DE - Stuttgart, DE
?>

Mais maintenant, je veux choisir des endroits à proximité d'un endroit donné via PHP à partir de ma base de données MySQL:

  • L'utilisateur entre dans sa ville natale
  • Mon script obtient la latitude / longitude valeurs via l'API Google
  • Dans ma base de données, j'ai environ 200 emplacements avec un champ pour la valeur de latitude et un champ pour la valeur de longitude
  • je besoin d'un code pour PHP et MySQL pour sélectionner les 10 sites les plus proches de la ville natale de l'utilisateur

J'espère que vous pouvez me aider. Merci d'avance!

Était-ce utile?

La solution

MySQL distance orthodromique (Formule Haversine) fait exactement ce dont vous avez besoin .

Avec seulement 200 dossiers mais vous pouvez tout aussi bien les charger et de les vérifier avec le code. L'ensemble des données est vraiment trop petit pour être trop se soucier de la base de données vs code ou tout autre telles optimisations.

Calcul de la distance entre les codes postaux en PHP a un couple de implémentations PHP de cet algorithme.

Geo Proximité est à peu près exactement le même problème que vous avez.

Autres conseils

Peut-être quelque chose comme

SELECT field1, field2, ...,
    ACOS(SIN(latitude / 180 * PI()) * SIN(:1) + COS(latitude / 180 * PI()) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

ou

SELECT field1, field2, ...,
    ACOS(SIN(RADIANS(latitude)) * SIN(:1) + COS(RADIANS(latitude)) * COS(:2) * COS(:2 - longtidude)) * 6371 AS distance
    ORDER BY distance ASC;

(traduit directement à partir du code PHP)

:1 et :2 est respectivement $lat2/180*pi() et $long2/180*pi().

C'est la formule Haversine. Vous pouvez traduire le PHP directement dans SQL afin que vous pouvez interroger la base de données dans l'espace (l'alternative étant de tirer tous les enregistrements de la base de données et exécuter les données via PHP). MySQL fournit toutes les fonctions mathématiques que vous avez besoin.

Je l'ai fait pour un site commercial qui a fourni à distance sur la base des recherches post / zipcode, il est donc certainement possible sans fonctions SIG spécifiques.

Il y a des fonctions MySQL disponibles pour faire exactement cela.

http://dev.mysql.com/doc /refman/5.0/en/gis-introduction.html

MySQL a la capacité de lignes d'index géospatial. Vous pourriez ne pas avoir besoin de faire ce calcul par vous-même (vous pouvez simplement demander MySQL pour calculer la distance entre deux objets géo et trier par cette ..).

Voir: http://forums.mysql.com/read.php ? 23,159205,159205

Tout juste une croix ce sujet. Peut-être que quelqu'un sera intéressé par cette fonction, testé dans MySql 5.7:

    create function GetDistance(lat1 real, lng1 real, lat2 real, lng2 real) returns real no sql
    return ATAN2(SQRT(POW(COS(RADIANS(lat2)) * SIN(RADIANS(lng1 - lng2)), 2) + 
                POW(COS(RADIANS(lat1)) * SIN(RADIANS(lat2)) - SIN(RADIANS(lat1)) *
                COS(RADIANS(lat2)) *  COS(RADIANS(lng1 - lng2)), 2)), 
                (SIN(RADIANS(lat1)) * SIN(RADIANS(lat2)) + COS(RADIANS(lat1)) *
                COS(RADIANS(lat2)) * COS(RADIANS(lng1 - lng2)))) * 6372.795;

Vocation:

select GetDistance(your_latitude, your_longitude, table_field_lat,
                   table_field_lng) as dist from [your_table] limit 5;

Pourquoi ne pas utiliser les fonctionnalités géospatiales de MySQL ...? Non, je plaisante.

Si les 200 dossiers sont des lieux réels comme des villes, etc alors comme une alternative pourrait vous utiliser l'API de GeoNames?

Le webservice suivant fournira les 10 endroits les plus proches du lat et lng fourni:

http://ws.geonames.org/findNearby?lat=47.3&lng = 9

Source: http://www.geonames.org/export/web -services.html # findNearbyPlaceName

Liste complète: http://www.geonames.org/export/ws- overview.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top