在我的课程中实施Google详细信息以检索有关附近地点的信息

时间:2017-11-21 16:50:11

标签: ios swift swift3 google-places-api

我创建了这两个类来下载附近的地方并获取有关它们的详细信息(如姓名,距离,类型等)。

import Foundation
import UIKit
import CoreLocation
import Alamofire

class NearbyPlaces {
    static func getCategories() -> [QCategoryy] {
        let list:[QCategoryy] = [QCategoryy(name: "bar", image: UIImage(named: "bar_button.png")!), QCategoryy(name :"night_club", image: UIImage(named: "nightclub_button.png")!), QCategoryy(name: "restaurant", image: UIImage(named: "restaurant_button.png")!), QCategoryy(name: "gym", image: UIImage(named: "gym_button.png")!), QCategoryy(name: "spa", image: UIImage(named: "spa_button.png")!), QCategoryy(name: "museum", image: UIImage(named: "museum_button.png")!)]
        return list
    }

    static let searchApiHost = "https://maps.googleapis.com/maps/api/place/nearbysearch/json"
    static let googlePhotosHost = "https://maps.googleapis.com/maps/api/place/photo"
    static let detailsApiHost = "https://maps.googleapis.com/maps/api/place/details/json"

    static func getNearbyPlaces(by category:String, coordinates:CLLocationCoordinate2D, radius:Int, token: String?, completion: @escaping (QNearbyPlacesResponse?, Error?) -> Void) {

        var params : [String : Any]

        if let t = token {
            params = [
                "key" : AppDelegate.googlePlacesAPIKey,
                "pagetoken" : t,
            ]
        } else {
            params = [
                "key" : AppDelegate.googlePlacesAPIKey,      
                "radius" : radius,
                "location" : "\(coordinates.latitude),\(coordinates.longitude)",
                "type" : category.lowercased()
            ]
        }

        Alamofire.request(searchApiHost, parameters: params, encoding: URLEncoding(destination: .queryString)).responseJSON { response in

            if let error = response.error {
                completion(nil, error)
            }
            if let response = QNearbyPlacesResponse(dic : response.result.value as? [String : Any]) {
                completion(response, nil)
            }
            else {
                completion(nil, QNearbyPlacesResponseError.noParsingDone)
            }
        }
    }



    static func googlePhotoURL(photoReference:String, maxWidth:Int) -> URL? {
        return URL.init(string: "\(googlePhotosHost)?maxwidth=\(maxWidth)&key=\(AppDelegate.googlePlacesAPIKey)&photoreference=\(photoReference)")
    }
}

enum QNearbyPlacesResponseError : Error {
    case noParsingDone
}


struct QNearbyPlacesResponse {
    var nextPageToken: String?
    var status: String  = "NOK"
    var places: [QPlace]?

    init?(dic:[String : Any]?) {
        nextPageToken = dic?["next_page_token"] as? String

        if let status = dic?["status"] as? String {
            self.status = status
        }

        if let results = dic?["results"] as? [[String : Any]]{
            var places = [QPlace]()
            for place in results {
                places.append(QPlace.init(placeInfo: place))
            }
            self.places = places
        }
    }

    func canLoadMore() -> Bool {
        if status == "OK" && nextPageToken != nil && nextPageToken?.characters.count ?? 0 > 0 {
            return true
        }
        return false
   }



}

还有这个班级

import UIKit
import CoreLocation
import GooglePlaces

private let geometryKey = "geometry"
private let locationKey = "location"
private let latitudeKey = "lat"
private let longitudeKey = "lng"
private let nameKey = "name"
private let openingHoursKey = "opening_hours"
private let openNowKey = "open_now"
private let vicinityKey = "vicinity"
private let typesKey = "types"
private let photosKey = "photos"
private let ratingKey = "rating"
private let urlKey = "url"
private let priceLevelKey = "price_level"
private let websiteKey = "website"
private let place_idKey = "place_id"

class QPlace: NSObject  {

    var location: CLLocationCoordinate2D?
    var name: String?
    var photos: [QPhoto]?
    var vicinity: String?
    var isOpen: Bool?
    var types: [String]?
    var rating: Float?
    var url: String?
    var price_level: Int?
    var website: String?
    var place_id: String?

    init(placeInfo:[String: Any]) {
        // coordinates
        if let g = placeInfo[geometryKey] as? [String:Any] {
            if let l = g[locationKey] as? [String:Double] {
                if let lat = l[latitudeKey], let lng = l[longitudeKey] {
                    location = CLLocationCoordinate2D.init(latitude: lat, longitude: lng)
                }
            }
        }


        // name
        name = placeInfo[nameKey] as? String

        // opening hours
        if let oh = placeInfo[openingHoursKey] as? [String:Any] {
            if let on = oh[openNowKey] as? Bool {
                isOpen = on
            }
        }

        // vicinity
        vicinity = placeInfo[vicinityKey] as? String

        // types
        types = placeInfo[typesKey] as? [String]

        // rating
        rating = placeInfo[ratingKey] as? Float

        url = placeInfo[urlKey] as? String

        //priceLevel
        price_level = placeInfo[priceLevelKey] as? Int

        //website
        website = placeInfo[websiteKey] as? String

        place_id = placeInfo[place_idKey] as? String

        // photos
        photos = [QPhoto]()
        if let ps = placeInfo[photosKey] as? [[String:Any]] {
            for p in ps {
                photos?.append(QPhoto.init(photoInfo: p))
            }
        }
    }

    func getDescription() -> String {

        var s : [String] = []

        if let types = types {
            s.append("\(types.joined(separator: ", "))")
        }

        if let rating = rating {
            s.append("Rating: \(rating)")
        }

        if let price_level = price_level {
            s.append("Price level: \(price_level)")
        }

        if let isOpen = isOpen {
            s.append(isOpen ? "OPEN NOW" : "CLOSED NOW")
        }


        if let url = url {
           s.append("\(url)")
        }



        if let website = website {
            s.append("\(website)")
        }


        if let vicinity = vicinity {
            s.append("\(vicinity)")
        }
        return s.joined(separator: "\n")
    }


     func getDescriptionMaps() -> String {

        var m : [String] = []

        if let vicinity = vicinity {
            m.append("\(vicinity)")
        }



        return m.joined(separator: "\n")
    }





    func heightForComment(_ font: UIFont, width: CGFloat) -> CGFloat {
        let desc = getDescription()
        let rect = NSString(string: desc).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
        return ceil(rect.height)
    }


}

我唯一的问题是我无法下载网站和价格水平的地方,所以查看谷歌地方的文档,我发现我的问题是由于searhAPI(https://developers.google.com/places/web-service/search)不会检索这些信息关于地方,所以我必须使用https://developers.google.com/places/web-service/details获取地方的网站和价格水平,但我需要帮助,因为我不知道该怎么做或我如何修改我的课程,以使所有这些工作和能够我的Class QPlace也获得了地方的网站和价格水平。

0 个答案:

没有答案