2014-03-29 42 views
6

当前正在开发一个Android应用程序,该应用程序返回距离用户当前位置最近的20个位置。Google Places Api根据距离排序

Google Places API正在返回〜20个靠近用户位置的位置,但不是最靠近 20按距离排序。

望着Google Places API Documentation不显示任何东西,我可以看到是不正确的。

GetPlaces.java

String types = "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"; 
resourceURI = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="+myLocation.latitude+","+myLocation.longitude+"&radius=500&rankBy=distance&types="+ URLEncoder.encode(types, "UTF-8")+"&sensor=true&key=GOOGLE_MAPS_KEY"; 
try { 
      String url =resourceURI; //getURL(myLocation.latitude,myLocation.longitude); 

      HttpParams httpParams = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(httpParams, 30000); 
      HttpConnectionParams.setSoTimeout(httpParams, 30000); 
      DefaultHttpClient httpClient = new DefaultHttpClient(httpParams); 
      HttpGet httpGet = new HttpGet(url); 
      httpGet.setHeader("Content-type", "application/json"); 
      ResponseHandler responseHandler = new BasicResponseHandler(); 
      String response = (String) httpClient.execute(httpGet, responseHandler); 

      if (response != null) { 
       mResult = new JSONObject(response); 
       results = mResult.getJSONArray("results"); 
      } 
     } 
     catch (ClientProtocolException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     catch (JSONException e) { 
      e.printStackTrace(); 
      return null; 
     } 

     return results; 
    } 

这将返回有效的JSON,但不是最近的地方,在距离传递。我知道有一个事实,那就是请求返回的位置比较近。

例如,我在做一个已知的谷歌的地方的请求,但它没有显示我目前AT-的地方,但是别人认为是更远。

+0

我看到这是一个旧的线程,但API选择的问题,并按距离顺序检索的地方仍然相关。 @Raul指出了将结果排序所需的唯一更改,但我很好奇你在Android应用程序中用于Web服务的API密钥。使用IP地址保护的服务器密钥不适用于移动应用程序,因为每部手机都有唯一的IP。 Android密钥无法工作,因为该应用正在模拟浏览器请求。你最终做了什么? –

回答

6

也许你已经解决你的问题,但我希望这可以帮助(重点是什么粗体)

半径 - 定义的距离(以米为单位)在返回商家结果。最大允许范围是5万米半径。 注意:如果指定了rankby = distance(下面在可选参数下描述),则不应包含半径。

rankby - 指定列出结果的顺序。可能的值是:

突出(默认)。此选项根据其重要性对结果进行排序。排名将有利于指定地区的突出位置。突出地位可能会受到地方在Google索引中的排名,应用程序签到次数,全球流行度以及其他因素的影响。

距离。此选项按照距离指定位置的距离升序排列结果。当指定距离时,需要一个或多个关键字,名称或类型。

根据:https://developers.google.com/places/documentation/search?hl=en

我已按照谷歌的文档,你不能同时发送参数“rankby”和“半径”的理解,你只能使用其中的一个在同一时间,这样你就得到按距离排序的结果。

测试要求这样做:

resourceURI = "https://maps.googleapis.com/maps/api/place/nearbysearch/json? 
location="+myLocation.latitude+","+myLocation.longitude+"&rankBy=distance 
&types="+ URLEncoder.encode (types, "UTF-8") + "&sensor = true& 
key = GOOGLE_MAPS_KEY"; 

,看你怎么做的,祝你好运!

+0

就像一个暗示(可能对我来说):通过自己创建intent并使用'intent.putExtra(“rankBy”,“distance”)',它将无法工作。 – zed

0

很可能您所想的地方比正在返回的地方更近不是true Google地点。

看看这个常见问题让你的谷歌地图业务:https://support.google.com/places/answer/145585?hl=en

针对此测试可能是尝试注册你认为是与谷歌的地方https://www.google.com/local/business/add?hl=en&migratedId=04614545856067425787更紧密的业务,看看它是否让你。如果可以的话,这意味着它们不是真正的Google地方,并且不会显示在此结果集中。

+0

嘿@Karios,我确实确认了我期待的地方位于Google地方信息中。你有什么其他想法? – AndyGable