2012-05-23 4 views
8

Qualcuno sa come utilizzare l'opzione di ricerca di rango per distanza menzionata qui? https://developers.google.com/maps/documentation/javascript/places#place_search_requestsgoogle maps api v3 come classificare per distanza più vicina

Questo elenco nelle opzioni di richiesta non sembra funzionare. Ecco la mia parte di codice relativa a questo:

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]); 
     } 
    } 
} 

Codice sarà individuare ed i risultati della lista se includo un raggio, ma i risultati non sono elencati in ordine crescente dalla distanza. I documenti di Google dicono che un raggio non è necessario se si utilizza l'opzione rankBy. Mi sto perdendo qualcosa?

+0

Sono nella stessa barca ... alla ricerca di una soluzione. – GuiDoody

risposta

7

Aveva lo stesso problema. Secondo questa fonte: http://www.geocodezip.com/v3_GoogleEx_place-search.html ho potuto formulare la query come tale:

var request = { 
location: gps, 
types: ['food'], //You can substitute "keyword: 'food'," (without double-quotes) here as well. 
rankBy: google.maps.places.RankBy.DISTANCE, //Note there is no quotes here, I made that mistake. 
key: key 
}; 

chiave Var è la chiave API che non è necessaria, ma ha aggiunto per un uso successivo. GPS è:

var gps = new google.maps.LatLng(location.lat,location.lon); 

Infine, ho fatto tutto quello che hai fatto, tranne ho aggiunto limiti ad una mappa che non avevo intenzione di usare. Per quello che ho fatto:

var bounds = new google.maps.LatLngBounds(); 
3

Non è possibile utilizzare insieme le proprietà raggio + classificaBy.

Se sono necessarie le posizioni più vicine, scegliere alcuni tipi e impostare il rango.

places.nearbySearch({ 
         location: LatLng, 
         types: placeTypes, 
         rankBy: google.maps.places.RankBy.DISTANCE 
        }, 
        function (results) { 
         // process the results, r[0] is the closest place 
        } 
       ); 

cui è possibile impostare placeTypes come questo

var placeTypes = [ 
'accounting', 
'airport', 
'amusement_park', 
'aquarium', 
'art_gallery', 
'atm', 
'bakery', 
'bank', 
'bar', 
'beauty_salon', 
'bicycle_store', 
'book_store', 
'bowling_alley', 
'bus_station', 
'cafe', 
'campground', 
'car_dealer', 
'car_rental', 
'car_repair', 
'car_wash', 
'casino', 
'cemetery', 
'church', 
'city_hall', 
'clothing_store', 
'convenience_store', 
'courthouse', 
'dentist', 
'department_store', 
'doctor', 
'electrician', 
'electronics_store', 
'embassy', 
'establishment', 
'finance', 
'fire_station', 
'florist', 
'food', 
'funeral_home', 
'furniture_store', 
'gas_station', 
'general_contractor', 
'grocery_or_supermarket', 
'gym', 
'hair_care', 
'hardware_store', 
'health', 
'hindu_temple', 
'home_goods_store', 
'hospital', 
'insurance_agency', 
'jewelry_store', 
'laundry', 
'lawyer', 
'library', 
'liquor_store', 
'local_government_office', 
'locksmith', 
'lodging', 
'meal_delivery', 
'meal_takeaway', 
'mosque', 
'movie_rental', 
'movie_theater', 
'moving_company', 
'museum', 
'night_club', 
'painter', 
'park', 
'parking', 
'pet_store', 
'pharmacy', 
'physiotherapist', 
'place_of_worship', 
'plumber', 
'police', 
'post_office', 
'real_estate_agency', 
'restaurant', 
'roofing_contractor', 
'rv_park', 
'school', 
'shoe_store', 
'shopping_mall', 
'spa', 
'stadium', 
'storage', 
'store', 
'subway_station', 
'synagogue', 
'taxi_stand', 
'train_station', 
'travel_agency', 
'university', 
'veterinary_care', 
'zoo' 

];

13

Non è possibile utilizzare insieme le proprietà raggio e RankBy.DISTANCE. Quindi hai due opzioni:

1) Cerca per raggio quindi ordina i risultati per distanza nel tuo codice.

Esempio:

var request = { 
       location: coords, 
       radius: 30000, 
       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++) { 
      sortresults(results[i]);//sortresult uses haversine to calcuate distance and then arranges the result in the order of distance 
      createMarker(results[i]); 
      listResults(results[i]); 
     } 
    } 
} 

Opzione 2: Ricerca per RankBy.Distance poi cap il risultato usando il raggio. Ancora una volta avresti bisogno della formula di haversine per calcolare le distanze.

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; 
} 
+0

Questa è stata sicuramente la risposta corretta per me, ho riscontrato lo stesso problema di @JFlo – David

1

Si prega di notare che sulla corrente Api Doc metodo "ricerca" sulla classe PlacesService non è disponibile.

https://developers.google.com/maps/documentation/javascript/reference?hl=it#PlacesService

Devi scegliere betwen:

  • nearbySearch (recuperare 20 risultati per pagina, max 3 pagine)
  • radarSearch (recuperare 200 risultato ma con meno dettagli)
  • TextSearch (simile alla ricerca nelle vicinanze)

Se si sceglie di RankBy.DISTANCE non puoi impostare il raggio

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

placesService.nearbySearch(request, function (data, status, placeSearchPagination) { 
    if (status == google.maps.places.PlacesServiceStatus.OK) { 
    //... 
    // do your stuffs with data results 
    //... 
    if (placeSearchPagination && placeSearchPagination.hasNextPage) { 
    placeSearchPagination.nextPage(); 
    } 
}); 

Se si desidera limitare i dati sulla base di un raggio di distanza è possibile utilizzare questa funzione per controllare se il resut è troppo lontano.

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

Si prega di notare che questo è anche l'unico modo per ottenere la posti all'interno di una determinata distanza allucinante quando si specifica "rankBy: google.maps.places.RankBy.PROMINENCE" e un "raggio = xx "i luoghiService ti danno risultati anche al di fuori dell'area definita.