2017-02-14 3 views
0

Я новичок в изучении API Google Адресов и искал ответ на эту проблему без большой удачи.Как получить String PlaceTypes из значения Integer?

Итак, в первой части моего приложения я хочу получить placeTypes моего текущего местоположения. Я успешно это сделал, но он возвращает список значений Integer, которые затем соотносятся с разными Place.TYPE_ * s.

Моя общая цель, однако, состоит в том, чтобы получить текущее место типов моего местоположения, а затем сделать PlaceSearch по URL. Для этого мне нужно преобразовать целые числа в свой список местоположений, в типы строк, чтобы я мог вставлять их в свой URL.

Примечание: Я попытался вставить целое значение для «ресторана» вместо слова «ресторан» в URL-адрес, но он вернул неверные результаты, такие как гостиницы, офисные здания, которые не были возвращены, когда я использовал слово вместо ,

Например, мой URL будет выглядеть следующим образом:

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=" + lat + "," + lng+"&radius=2000&type=restaurant&key=my_key 

Обратите внимание на слово "ресторан" в URL. Вот где я заменил его значением Integer и не вернул правильные результаты.

ответ

1

[Изменено]

Вы можете попробовать это.

private String getPlaceTypeForValue(int value) throws Exception { 
    Field[] fields = Place.class.getDeclaredFields(); 
    String name; 
    for (Field field : fields) { 
     name = field.getName().toLowerCase(); 
     if (name.startsWith("type_") && field.getInt(null) == value) { 
      return name.replace("type_", ""); 
     } 
    } 
    throw new IllegalArgumentException("place value " + value + " not found."); 
} 

я создал тест, чтобы проверить это, должно работать, просто не хватает некоторых типов: administrative_area_level_4, administrative_area_level_5, postal_code_suffix и street_number.

public class ConvertingPlaceTypesUnitTest { 

    private enum 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, 
     administrative_area_level_3, 
     // administrative_area_level_4, Not in Place.class 
     // administrative_area_level_5, Not in Place.class 
     colloquial_area, 
     floor, 
     geocode, 
     intersection, 
     natural_feature, 
     neighborhood, 
     political, 
     point_of_interest, 
     post_box, 
     postal_code_prefix, 
     // postal_code_suffix, Not in Place.class 
     postal_town, 
     premise, 
     room, 
     route, 
     street_address, 
     // street_number, Not in Place.class 
     sublocality_level_4, 
     sublocality_level_5, 
     sublocality_level_3, 
     sublocality_level_2, 
     sublocality_level_1, 
     subpremise, 
     transit_station, 
     locality, 
     sublocality, 
     postal_code, 
     country, 
     administrative_area_level_1, 
     administrative_area_level_2 
    }; 

    @Test 
    public void extracPlaces() throws Exception { 
     assertEquals("accounting", getPlaceTypeForValue(Place.TYPE_ACCOUNTING)); 
     assertEquals("local_government_office", getPlaceTypeForValue(Place.TYPE_LOCAL_GOVERNMENT_OFFICE)); 
    } 

    @Test 
    public void testAllTypes() throws Exception { 
     for (Types type : Types.values()) { 
      final String name = type.toString(); 
      int value = getPlaceTypeValue("TYPE_" + name.toUpperCase()); 
      assertEquals(name, getPlaceTypeForValue(value)); 
     } 
    } 

    private int getPlaceTypeValue(String fieldName) throws Exception { 
     Field field = Place.class.getDeclaredField(fieldName); 
     return field.getInt(null); 
    } 

    private String getPlaceTypeForValue(int value) throws IllegalAccessException { 
     Field[] fields = Place.class.getDeclaredFields(); 
     String name; 
     for (Field field : fields) { 
      name = field.getName().toLowerCase(); 
      if (name.startsWith("type_") && field.getInt(null) == value) { 
       return name.replace("type_", ""); 
      } 
     } 
     throw new IllegalArgumentException("place value " + value + " not found."); 
    } 
} 

[OLD]

Я не понимаю, где целочисленный тип исходит из, в документации она всегда упоминается как строка.

тип - ограничивает результаты до мест, соответствующих указанному типу. Можно указать только один тип (если указано более одного типа, все типы, следующие за первой записью, игнорируются). См. list of supported types.

{ 
    "html_attributions" : [], 
    "result" : { 
     "address_components" : [ 
     { 
      "long_name" : "48", 
      "short_name" : "48", 
      "types" : [ "street_number" ] 
     }, 
     { 
      "long_name" : "Pirrama Road", 
      "short_name" : "Pirrama Road", 
      "types" : [ "route" ] 
     }, 
     { 
      "long_name" : "Pyrmont", 
      "short_name" : "Pyrmont", 
      "types" : [ "locality", "political" ] 
     }, 
     { 
      "long_name" : "NSW", 
      "short_name" : "NSW", 
      "types" : [ "administrative_area_level_1", "political" ] 
     }, 
     { 
      "long_name" : "AU", 
      "short_name" : "AU", 
      "types" : [ "country", "political" ] 
     }, 
     { 
      "long_name" : "2009", 
      "short_name" : "2009", 
      "types" : [ "postal_code" ] 
     } 
     ], 
     "adr_address" : "5, 
     \u003cspan class=\"street-address\"\u003e48 Pirrama Rd\u003c/span\u003e, 
     \u003cspan class=\"locality\"\u003ePyrmont\u003c/span\u003e 
     \u003cspan class=\"region\"\u003eNSW\u003c/span\u003e 
     \u003cspan class=\"postal-code\"\u003e2009\u003c/span\u003e, 
     \u003cspan class=\"country-name\"\u003eAustralia\u003c/span\u003e", 
     "formatted_address" : "48 Pirrama Road, Pyrmont NSW, Australia", 
     "formatted_phone_number" : "(02) 9374 4000", 
     "geometry" : { 
     "location" : { 
      "lat" : -33.8669710, 
      "lng" : 151.1958750 
     }, 
     "viewport" : { 
      "northeast" : { 
       "lat" : -33.8665053, 
       "lng" : 151.1960371 
      }, 
      "southwest" : { 
       "lat" : -33.8669293, 
       "lng" : 151.1952183 
      } 
     } 
     }, 
     "icon" : "http://maps.gstatic.com/mapfiles/place_api/icons/generic_business-71.png", 
     "id" : "4f89212bf76dde31f092cfc14d7506555d85b5c7", 
     "international_phone_number" : "+61 2 9374 4000", 
     "name" : "Google Sydney", 
     "place_id" : "ChIJN1t_tDeuEmsRUsoyG83frY4", 
     "scope" : "GOOGLE", 
     "alt_ids" : [ 
     { 
      "place_id" : "D9iJyWEHuEmuEmsRm9hTkapTCrk", 
      "scope" : "APP" 
     } 
     ], 
     "rating" : 4.70, 
     "reference" : "CnRsAAAA98C4wD-VFvzGq-KHVEFhlHuy1TD1W6UYZw7KjuvfVsKMRZkbCVBVDxXFOOCM108n9PuJMJxeAxix3WB6B16c1p2bY1ZQyOrcu1d9247xQhUmPgYjN37JMo5QBsWipTsnoIZA9yAzA-0pnxFM6yAcDhIQbU0z05f3xD3m9NQnhEDjvBoUw-BdcocVpXzKFcnMXUpf-nkyF1w", 
     "reviews" : [ 
     { 
      "aspects" : [ 
       { 
        "rating" : 3, 
        "type" : "quality" 
       } 
      ], 
      "author_name" : "Simon Bengtsson", 
      "author_url" : "https://plus.google.com/104675092887960962573", 
      "language" : "en", 
      "rating" : 5, 
      "text" : "Just went inside to have a look at Google. Amazing.", 
      "time" : 1338440552869 
     }, 
     { 
      "aspects" : [ 
       { 
       "rating" : 3, 
       "type" : "quality" 
       } 
      ], 
      "author_name" : "Felix Rauch Valenti", 
      "author_url" : "https://plus.google.com/103291556674373289857", 
      "language" : "en", 
      "rating" : 5, 
      "text" : "Best place to work :-)", 
      "time" : 1338411244325 
     }, 
     { 
      "aspects" : [ 
       { 
       "rating" : 3, 
       "type" : "quality" 
       } 
      ], 
      "author_name" : "Chris", 
      "language" : "en", 
      "rating" : 5, 
      "text" : "Great place to work, always lots of free food!", 
      "time" : 1330467089039 
     } 
     ], 
     "types" : [ "establishment" ], 
     "url" : "http://maps.google.com/maps/place?cid=10281119596374313554", 
     "vicinity" : "48 Pirrama Road, Pyrmont", 
     "website" : "http://www.google.com.au/" 
    }, 
    "status" : "OK" 
} 
+0

PlaceLikelihoodBuffer получает «место», которые являются различными type.Through, что вы можете вызвать метод getPlaceTypes который возвращает список . См. [This] (https://developers.google.com/android/reference/com/google/android/gms/location/places/Place) –

+0

Я изучу этот код. Я уже думал о том, чтобы сделать длинный обходной путь и перечислить каждый тип, я просто надеялся, что есть простой способ конвертировать их, которые Google будет поставлять с API .. но, возможно, нет. Спасибо. –