【问题标题】:Google map Place information by latitude and longitude in iOS Swift谷歌地图在iOS Swift中按纬度和经度放置信息
【发布时间】:2018-10-11 07:54:41
【问题描述】:

我在地图上有一个标记。滚动地图时,标记也会移动。我可以找到标记坐标,但是如何使用该坐标找到地点信息?

当前位置的地点信息

func locate() {
        placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in
            if let error = error {
                print("Pick Place error: \(error.localizedDescription)")
                return
            }
            
            let placeInfo = getCurrentPlaceInformation()
            self.placeNameLbl.text = placeInfo.name
            self.placeAddressLbl.text = placeInfo.address
            
            if let placeLikelihoodList = placeLikelihoodList {
                let place = placeLikelihoodList.likelihoods.first?.place
                if let place = place {
                    print("LOG: place name : \(place.name), place Address : \(place.formattedAddress)")
                    
                    PLACE_NAME = place.name
                    PLACE_ADDRESS = place.formattedAddress ?? ""
                    
                    let placeInfo = getCurrentPlaceInformation()
                    self.placeNameLbl.text = placeInfo.name
                    self.placeAddressLbl.text = placeInfo.address
                }
            }
        })
    }

如何通过自定义坐标查找地点信息?

【问题讨论】:

    标签: ios swift google-maps swift4 google-places-api


    【解决方案1】:

    Apple 反向地理编码 API

    import CoreLocation
    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(<#T##location: CLLocation##CLLocation#>, completionHandler: <#T##CLGeocodeCompletionHandler##CLGeocodeCompletionHandler##([CLPlacemark]?, Error?) -> Void#>)
    

    谷歌反向地理编码 API

    将 GoogleMaps 添加到项目中(可以使用 pod)

    let geocoder = GMSGeocoder()
    geocoder.reverseGeocodeCoordinate(position) { response, error in
      //
    if error != nil {
                    print("reverse geodcode fail: \(error!.localizedDescription)")
                } else {
                    if let places = response?.results() {
                        if let place = places.first {
    
    
                            if let lines = place.lines {
                                print("GEOCODE: Formatted Address: \(lines)")
                            }
    
                        } else {
                            print("GEOCODE: nil first in places")
                        }
                    } else {
                        print("GEOCODE: nil in places")
                    }
                }
    }
    

    【讨论】:

    • 感谢您的支持。
    【解决方案2】:
        func getAddrFrmLtLng(latitude:Any, longitude:Any){
    
            let geoCoder = CLGeocoder()
            let location = CLLocation(latitude: latitude as! CLLocationDegrees, longitude: longitude as! CLLocationDegrees)
    
            geoCoder.reverseGeocodeLocation(location, completionHandler: { (placemarks, error) -> Void in
    
                var placeMark: CLPlacemark!
                placeMark = placemarks?[0]
                self.displayLocationInfo(placemark: placeMark)
    
            })
        }
    
        func displayLocationInfo(placemark: CLPlacemark?) -> String    {
    
            var locality =  ""
            var postalCode =  ""
            var administrativeArea = ""
            var country = ""
            var sublocality = ""
            var throughfare = ""
    
            var name = ""
    
            if let containsPlacemark = placemark {
                //stop updating location to save battery life
                //            locationManager.stopUpdatingLocation()
                locality = (containsPlacemark.locality != nil) ? containsPlacemark.locality! : ""
                postalCode = (containsPlacemark.postalCode != nil) ? containsPlacemark.postalCode! : ""
                administrativeArea = (containsPlacemark.administrativeArea != nil) ? containsPlacemark.administrativeArea! : ""
                country = (containsPlacemark.country != nil) ? containsPlacemark.country! : ""
                sublocality = (containsPlacemark.subLocality != nil) ? containsPlacemark.subLocality! : ""
                throughfare = (containsPlacemark.thoroughfare != nil) ? containsPlacemark.thoroughfare! : ""
    
            }
    
            var adr: String  = ""
    
            if throughfare != "" {
    
                adr = throughfare + ", "
    
            }
            if sublocality != "" {
    
                adr = adr + sublocality + ", "
    
            }
            if locality != "" {
    
                adr = adr + locality + ", "
    
            }
            if administrativeArea != "" {
    
                adr = adr + administrativeArea + ", "
    
            }
            if postalCode != "" {
    
                adr = adr + postalCode + ", "
    
            }
            if country != "" {
    
                adr = adr + country
            }
    
            print(adr)
    
            return adr
        }
    

    【讨论】:

    • 感谢您的回复。但是使用苹果的 CLGeocoder 不能提供准确的信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多