Отображение изображений с помощью запроса Google Place Photos в Swift

Я пытаюсь отображать фотографии определенных мест, используя photo_reference, предоставляемый Google Places API.

В настоящее время я использую запросы Сведения о месте в Google Places API для получения информации. о конкретных местах, но у меня возникают проблемы с отображением фотографий этих мест. Google предоставляет 'photo_reference' в ответе 'Place Details', который должен использоваться для получения определенных изображений, но документация здесь не очень помогает показать, как это сделать.

В настоящее время я делаю такие запросы Google Place Details: (у меня есть функция для создания URL-адреса, а затем функция для выполнения запроса)

    func googlePlacesDetailsURL(forKey apiKey: String, place_ID: String) -> URL {
        print("passed  place_ID  before url creation ", place_ID)

        let baseURL = "https://maps.googleapis.com/maps/api/place/details/json?"
        let place_idString = "place_id=" + place_ID
        let fields = "fields=geometry,name,rating,price_level,types,opening_hours,formatted_address,formatted_phone_number,website,photos"
        let key = "key=" + apiKey

        print("Details request URL:", URL(string: baseURL + place_idString + "&" + fields + "&" + key)!)
        return URL(string: baseURL + place_idString + "&" + fields + "&" + key)!
    }


    func getGooglePlacesDetailsData(place_id: String, using completionHandler: @escaping (GooglePlacesDetailsResponse) -> ())  {

        let url = googlePlacesDetailsURL(forKey: googlePlacesKey, place_ID: place_id)

        let task = session.dataTask(with: url) { (responseData, _, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }

            guard let data = responseData, let detailsResponse = try? JSONDecoder().decode(GooglePlacesDetailsResponse.self, from: data) else {
                print("Could not decode JSON response. responseData was: ", responseData)
                return
            }
            print("GPD response - detailsResponse.result: ", detailsResponse.result)

                completionHandler(detailsResponse)

        }
        task.resume()

    }

Кто-нибудь знает, как сделать запрос фотографии в Google Place с помощью photo_reference в Swift и отобразить возвращенную фотографию?


person zlyt    schedule 08.12.2019    source источник


Ответы (2)


Насколько я понял, похоже, что вам нужно создать новый URL-адрес с помощью Photo_reference, который возвращается из запроса поиска места или запроса сведений о месте.

Поскольку вы думаете, что photo_reference не является изображением, вместо этого это ссылка Http, которую вы можете использовать для доступа к изображению. Используя эту ссылку, вам нужно будет заменить приведенную ниже строку и получить доступ к этой ссылке, чтобы вернуть изображение.

https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=CnRtAAAATLZNl354RwP_9UKbQ_5Psy40texXePv4oAlgP4qNEkdIrkyse7rPXYGd9D_Uj1rVsQdWT4oRz4QrYAJNpFX7rzqqMlZw2h2E2y5IKMUZ7ouD_SlcHxYq1yL4KbKUv3qtWgTK0A6QbGh87GB3sscrHRIQiG2RrmU_jF4tENr9wGS_YxoUSSDrYjWmrNfeEHSGSc3FyhNLlBU&key=YOUR_API_KEY

"Your_Api_Key", очевидно, означает то, что он означает, вы должны получить доступ к возвращенной ссылке на фотографию и использовать replaceCharactersInRange и заменить "фотореференс" в приведенной ниже ссылке.

maxwidth может быть определен вами в зависимости от того, какой размер изображения вам нужен.

person Anjula S.    schedule 09.12.2019
comment
Но нужно ли мне использовать photo_reference, чтобы запросить фактическую фотографию? Или мне просто передать URL-адрес в качестве местоположения изображения, когда я хочу его отобразить? - person zlyt; 09.12.2019
comment
Насколько я понял, вы должны использовать photo_reference для создания URL-адреса (в приведенной выше ссылке между photoreferennce и = YOUR_API_KEY это ссылка на фотографию. Это просто набор длинного синтаксиса, который завершает URL-адрес. Таким образом, вам нужно инициировать String и удерживайте эту ссылку, и создайте URL-адрес, добавив эту ссылочную строку, когда вы запрашиваете отображение изображения. Вы понимаете?. Если это помогло дать мне обратную связь, я также пытаюсь реализовать это, чтобы помочь вам в дальнейшем - person Anjula S.; 09.12.2019
comment
Да, это очень помогает, спасибо! У меня есть функция для динамического создания соответствующего URL-адреса, но я думаю, что у меня проблемы с тем, как отображать конкретное изображение, используя его URL-адрес. Из моих исследований похоже, что мне нужно создать метод для загрузки изображения с использованием URL-адреса, а затем отобразить его, но я подумал, что могу просто передать URL-адрес изображения в качестве «пути», чтобы отобразить его, как вы сказали. если бы я мог увидеть вашу версию реализации, которая поможет тоннам! - person zlyt; 09.12.2019
comment
Привет, если вы все еще ищете решение, я почти закончил с реализацией, если бы вы могли прикрепить свой ответ JSON, чтобы я мог редактировать запросы в соответствии с этим - person Anjula S.; 10.12.2019
comment
Также, как вы упомянули, UIImageView позволяет загружать только локально сохраненные изображения, вам нужно будет включить расширение, чтобы загружать их удаленно, hackingwithswift.com/example-code/uikit/ - person Anjula S.; 10.12.2019
comment
Привет. Ниже приведен пример ответа JSON, который я использовал. Обычно он вложен в какой-то другой JSON, но это то, что я получаю, который содержит photo_reference каждый раз ... "photos" : [ { "html_attributions" : [], "height" : 853, "width" : 1280, "photo_reference" : "CnRvAAAAwMpdHeWlXl-lH0vp7lez4znKPIWSWvgvZFISdKx45AwJVP1Qp37YOrH7sqHMJ8C-vBDC546decipPHchJhHZL94RcTUfPa1jWzo-rSHaTlbNtjh-N68RkcToUCuY9v2HNpo5mziqkir37WU8FJEqVBIQ4k938TI3e7bf8xq-uwDZcxoUbO_ZJzPxremiQurAYzCTwRhE_V0" } ... Взято из: developers.google.com/places/web-service/photos - person zlyt; 10.12.2019

Я знаю, что очень опаздываю, чтобы дать ответ на этот вопрос, извините, я был очень занят, но мне удалось сделать это за вас. Это всего лишь мой взгляд на это, и я все еще новичок в IOS, поэтому, хотя мой дизайн может не быть идеальным, уверяю вас, что это работает. Следует иметь в виду, что не в каждом месте есть photo_reference, поэтому вам придется обрабатывать ошибку, чтобы в случае, если изображение получает нулевое значение или когда создается URl, он будет генерировать Исключение, взгляните на приведенный ниже код, я поместил все это в один метод, но хорошо, если вы можете разбить его на несколько методов для установки изображения и получения данных. Вернись ко мне с обратной связью, так как мне тоже понравилось это изучать, спасибо и удачи.

PS: это в объекте C, поэтому вам нужно немного поработать, извините, я не очень хорош, достаточно быстро, чтобы произвести это в нем

-(void)fetchedData:(NSData *)responseData {
    //parse out the json data
    NSError* error;
    NSDictionary* json = [NSJSONSerialization
                          JSONObjectWithData:responseData

                          options:kNilOptions
                          error:&error];

    //Hardcoded placeId for testing purposes
    NSString *placeId = @"ChIJoS8a5GWM4kcRKOs9fcRijdk";

    //Filtered the json to access all the location Ids/place Ids
    NSArray *locations = [json valueForKeyPath:@"results.place_id"];

    //Iterator to iterate through the locations to see if the required place id is present in the Dictionary

    for (NSString *locationId in locations) {

        if ([placeId isEqualToString:locationId]){

            NSLog(@"Found The Matching LocationID");

            //predicate to iterate through all the places ids that match in order to access the entire object that has the location id so you can use it later onwards to access any part of the object (ratings, prices.... )
            NSPredicate *objectWithPlacesId = [NSPredicate predicateWithFormat:@"place_id == %@",locationId];

            //This array holds the entire object that contains the required place id
            NSArray *filteredArrayWithPlacesDetails = [[json objectForKey:@"results"] filteredArrayUsingPredicate:objectWithPlacesId];

            //Small question here if this is actually needed but i found it a problem to access the array as it returns a single object array
            NSDictionary *dictionaryWithDetails = [filteredArrayWithPlacesDetails firstObject];

            NSArray *photosArray = [dictionaryWithDetails valueForKeyPath:@"photos.photo_reference"];
            //NSString photo refence is accessed here , single object array so the first index always contain the photoReference
            NSString *photo_Reference = [photosArray objectAtIndex:0];

            //Create the Image Url , you can even format the max width and height the same way using %f
            NSString *imageUrl = [NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/photo?maxwidth=400&photoreference=%@&key=%@",photo_Reference,kGOOGLE_API_KEY];

            //Assing the image request for the sd_setImageWithURL to access the remote image
            [self.imageView sd_setImageWithURL:[NSURL URLWithString:imageUrl]
                              placeholderImage:[UIImage imageNamed:@"placeholder.png"]];

            break;
        }

        else{
            NSLog(@"Not Matching");
        }



    }

}
person Anjula S.    schedule 03.01.2020