2012-03-01 6 views
5

Sería extremadamente útil si un parámetro de "ordenar" & "sort" se pudiera pasar en la cadena de búsqueda de API.¿Hay un parámetro api order_by/sort en las obras?

"order_by" debe aceptar las siguientes opciones: distancia | checkins | nombre

"ordenar" debe aceptar las siguientes opciones: asc | desc

El conjunto de resultados coincidentes debe tener los parámetros order_by y sort aplicados antes de limitar el resultado al máximo "50" resultados que se devuelven.

¿Está esto en el radar cuadrangular o es algo que no se ofrecerá?

Estamos construyendo una aplicación que permite a los usuarios ubicar los "restaurantes" más cercanos según la geolocalización del dispositivo.

El problema que estamos teniendo es establecer el radio predeterminado. Comenzamos estableciendo el radio a 3200 metros, con la esperanza de que eso devuelva algunos resultados para ubicaciones dispersas al tiempo que se devuelven los resultados más cercanos para ubicaciones densas.

Esto funciona para ubicaciones que devuelven menos de 50 porque podemos ordenar la respuesta de publicación, pero en un área densa como Washington DC, cuando hay más de 50 resultados, los 50 que la API decide devolver NO son los más cercanos a el ll.

Por lo tanto, tenemos que estructurar nuestra consulta como se muestra a continuación (que apesta porque requiere hasta 7 visitas a la API) para tratar de encontrar ese "punto óptimo" de menos de 50 resultados.

Este es el problema que nos encontramos para las ubicaciones "cercanas a mí" en nuestra aplicación. Tenemos un problema similar cuando intentamos mostrar lugares "populares" en la aplicación, pero lo guardaré para otra publicación.

ob_start(); 
require_once 'includes/EpiCurl.php'; 
require_once 'includes/EpiFoursquare.php'; 
$clientId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 
$clientSecret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 
$fsObjUnAuth = new EpiFoursquare($clientId, $clientSecret); 

$time_start2 = microtime(true); 

$result = $fsObjUnAuth->get('/venues/search', array(
'categoryId' => '4d4b7105d754a06374d81259', 
'limit' => '50', 
'radius' => '100', 
'intent' => 'checkin', 
'll' => $ll, 
'v' => '20120211' 
)); 
$result_count1 = count($result->response->venues); 

if ($result_count1 < 30) { 

    $result = $fsObjUnAuth->get('/venues/search', array(
     'categoryId' => '4d4b7105d754a06374d81259', 
     'limit' => '50', 
     'radius' => '200', 
     'intent' => 'checkin', 
     'll' => $ll, 
     'v' => '20120211' 
     )); 

    $result_count2 = count($result->response->venues); 

    if ($result_count2 < 30) { 

     $result = $fsObjUnAuth->get('/venues/search', array(
      'categoryId' => '4d4b7105d754a06374d81259', 
      'limit' => '50', 
      'radius' => '400', 
      'intent' => 'checkin', 
      'll' => $ll, 
      'v' => '20120211' 
      )); 

     $result_count3 = count($result->response->venues); 

     if ($result_count3 < 30) { 

      $result = $fsObjUnAuth->get('/venues/search', array(
       'categoryId' => '4d4b7105d754a06374d81259', 
       'limit' => '50', 
       'radius' => '800', 
       'intent' => 'checkin', 
       'll' => $ll, 
       'v' => '20120211' 
       )); 
      $result_count4 = count($result->response->venues); 

      if ($result_count4 < 30) { 

       $result = $fsObjUnAuth->get('/venues/search', array(
        'categoryId' => '4d4b7105d754a06374d81259', 
        'limit' => '50', 
        'radius' => '1200', 
        'intent' => 'checkin', 
        'll' => $ll, 
        'v' => '20120211' 
        )); 

       $result_count5 = count($result->response->venues); 

       if ($result_count5 < 30) {     
        $result = $fsObjUnAuth->get('/venues/search', array(
         'categoryId' => '4d4b7105d754a06374d81259', 
         'limit' => '50', 
         'radius' => '1600', 
         'intent' => 'checkin', 
         'll' => $ll, 
         'v' => '20120211' 
         )); 
        $result_count6 = count($result->response->venues); 

        if ($result_count6 < 30) { 

         $result = $fsObjUnAuth->get('/venues/search', array(
          'categoryId' => '4d4b7105d754a06374d81259', 
          'limit' => '50', 
          'radius' => '3200', 
          'intent' => 'checkin', 
          'll' => $ll, 
          'v' => '20120211' 
          )); 
         $result_count7 = count($result->response->venues); 
        } 
       } 
      } 
     } 
    } 
} 
+0

No debería pedirse en un foro en cuadro? – rene

+0

Supongo que te estás refiriendo a los/lugares/punto final de búsqueda en particular? o todos los puntos finales de búsqueda? – akdotcom

+0

Sí, solo me estoy refiriendo a/endpoints/punto final de búsqueda –

Respuesta

1

No hay ningún plan para ofrecer dichos parámetros. En su mayor parte, estos parámetros solo son útiles para desarrolladores que rastrean todos los lugares en una región, lo que infringe la foursquare terms of service

Existen tres "intenciones" diferentes que corresponden a casos de uso válidos que requieren diferentes tipos de clasificación .

  • intención = registro devuelve una lista de lugares donde el usuario es más probable que se encuentra

  • intención = Navegar devuelve una lista de los lugares más relevantes para una región solicitado, no se sesgado por la distancia desde un punto central.

  • intención = partido devuelve un único resultado de que, con alta confianza, es el lugar en cuadro correspondiente para la solicitud basado en consultas

+0

Entiendo la preocupación de foursquare acerca de que alguien robe la base de datos, sin embargo, los 50 resultados máximos eliminan ese problema para el raspador casual. He editado mi pregunta anterior para explicar mejor mi dilema. –

+0

¿Puede dar un ejemplo en el que los resultados principales que se devuelven están particularmente lejos del lat/lng especificado? intent = checkin degrada agresivamente los resultados basados ​​en la distancia, por lo que los resultados deberían estar cerca del lat/lng especificado, mientras que de otra forma se equilibraría la popularidad del lugar (por ejemplo, si el usuario está de pie junto a un puesto de perritos calientes será devuelto primero). La clasificación actual es considerablemente más relevante para los usuarios, especialmente cuando el dispositivo solicitante no tiene un bloqueo preciso en la ubicación exacta del usuario. – akdotcom

+0

Comenzando con 38.897758, -77.055286, que es el número exacto de 600 New Hampshire Ave NW, Washington, DC 20037, y también la dirección exacta de 3 lugares conocidos en su base de datos. Si fijo el radio a 100, la API se encuentra a menos de 50 y me da los resultados esperados:? lugares/búsqueda ll = 38.897758, -77.055286 y radio = 100 y límite = 50 y categoryId = 4d4b7105d754a06374d81259 y la intención = registro & v = 20120211 1. Cup'a Cup'a 2. Ríos en Watergate 3. 600 Restaurante en Watergate –

Cuestiones relacionadas