8
votes

Google Maps API V3 Comment classer par la distance la plus proche

Est-ce que quelqu'un sait utiliser l'option de recherche de rang par distance mentionnée ici? https://developers.google.com/maps/documentation/javaScript/places#places3pplace_search_requests

Liste Ceci dans les options de la demande ne semble pas fonctionner. Voici ma partie de code par rapport à ceci: p>

var request = {
  location: coords,
  //radius: 30000,
  keyword: ['puma, retail'],
  types: ['store'],
  rankBy: google.maps.places.RankBy.DISTANCE
};

service = new google.maps.places.PlacesService(map);
service.search(request, callback);

function callback(results, status) {
    if (status == google.maps.places.PlacesServiceStatus.OK) {
        for (var i = 0; i < results.length; i++) {
            createMarker(results[i]);
                            listResults(results[i]);
        }
    } 
}


1 commentaires

Je suis dans le même bateau ... Chasser une solution.


4 Réponses :


9
votes

1 commentaires

Les «types» doivent être «Type» si vous souhaitez remplacer la valeur par une variable. Sinon, cela ne fonctionnera pas.



4
votes

Vous ne pouvez pas utiliser les propriétés Radius + RankBy ensemble.

Si vous avez besoin des emplacements les plus proches, choisissez certains types et définissez la property de classeBy. xxx

où vous pouvez définir des placetypes comme celui-ci xxx

];


0 commentaires

13
votes

Vous ne pouvez pas utiliser les propriétés RADIUS et RIANBY.DISTANCE. Par conséquent, vous avez deux options:

1) Recherche par rayon puis triez les résultats par distance dans votre propre code. P>

Exemple: P>

var request = {
               location: coords,
               rankBy: google.maps.places.RankBy.DISTANCE,
               keyword: ['puma, retail'],
               types: ['store']
               };
service = new google.maps.places.PlacesService(map);
service.search(request, callback);

function callback(results, status) {
         if (status == google.maps.places.PlacesServiceStatus.OK) {

           for (var i = 0; i < results.length; i++) {
           d= distance(coords,results[i].latlng)
           if(d<rd)
            {createMarker(results[i]);
             listResults(results[i]);
            }
           }
   } 
}

//Returns Distance between two latlng objects using haversine formula
distance(p1, p2) {
 if (!p1 || !p2) 
  return 0;
 var R = 6371000; // Radius of the Earth in m
 var dLat = (p2.lat() - p1.lat()) * Math.PI / 180;
 var dLon = (p2.lng() - p1.lng()) * Math.PI / 180;
 var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
 Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) *
 Math.sin(dLon / 2) * Math.sin(dLon / 2);
 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
 var d = R * c;
 return d;
 }


1 commentaires

C'était définitivement la bonne réponse pour moi, j'ai vécu le même problème que @jflo



1
votes

Veuillez noter que sur l'API actuel, la méthode "Recherche" sur la classe Placageservice n'est pas disponible forte>.

https://developers.google.com/maps/documentation/javascript/reference?hl=ity#plaService p>

Vous devez choisir entre: p>

  • NearBySearch (Récupération 20 Résultat par page, Max 3 pages) LI>
  • RADARSEARCH (récupérer 200 résultat mais avec moins de détails) LI>
  • Textsearch (Similaire à la FermebySearch) Li> ul>

    Si vous choisissez de regry.distance, vous ne pouvez pas définir le rayon strand> p>

    function checkRadiusDistance(place,centerLatLng,radius) {
      return google.maps.geometry.spherical.computeDistanceBetween(place.geometry.location, centerLatLng) < radius;
    });
    


0 commentaires