Google Maps iOS Reverse Geocoding

后端 未结 3 1836
耶瑟儿~
耶瑟儿~ 2021-02-09 18:40

I am having an issue with Google Maps Reverse Geocoding when it comes to setting a UILabel\'s text to the reverse geocoded address. The UILabel is in an XIB use as a custom info

相关标签:
3条回答
  • 2021-02-09 18:48

    You are using a return out of the braces of the geocoding, for this reason the last code works. You should do something like this:

    func getAddress(currentAdd : ( returnAddress :String)->Void){
    
        let infoWindow = NSBundle.mainBundle().loadNibNamed("InfoWindowCurrent", owner: self, options: nil)[0] as! InfoWindowCurrent
        let geocoder = GMSGeocoder()
        let coordinate = CLLocationCoordinate2DMake(Double(self.locLatitude)!,Double(self.locLongitude)!)
    
    
        var currentAddress = String()
    
        geocoder.reverseGeocodeCoordinate(coordinate) { response , error in
            if let address = response?.firstResult() {
                let lines = address.lines! as [String]
    
                currentAddress = lines.joinWithSeparator("\n")
    
                currentAdd(returnAddress: currentAddress)
            }
        }     
    }
    

    And call that function

      getAddress() { (returnAddress) in      
    
        print("\(returnAddress)")
    
        }
    
    0 讨论(0)
  • 2021-02-09 18:49

    The first response worked for me. As an alternative to

    marker.title = lines.joined(separator: "\n")`
    

    try this, it will give you the street address:

    marker.title = response?.firstResult()?.thoroughfare
    marker.snippet = response?.firstResult()?.locality
    

    For the city, try

    marker.snippet = response?.firstResult()?.locality
    
    0 讨论(0)
  • 2021-02-09 19:00

    So, I ended up going another route. It's not pretty, but it works. Each GMSMarker has a "userData" attribute that can be used to pass data. What I did was moved the marker creation into the reverse geocode completion handler and assigned the address to the "userData" attribute. Then, when the user taps to show the current address, the reverse geocode is kicked off, the marker is created and placed on the map.

    geocoder.reverseGeocodeCoordinate(position) { response, error in
        if let location = response?.firstResult() {
            let marker = GMSMarker(position: position)
            let lines = location.lines! as [String]
    
            marker.userData = lines.joined(separator: "\n")
            marker.title = lines.joined(separator: "\n")
            marker.infoWindowAnchor = CGPoint(x: 0.5, y: -0.25)
            marker.accessibilityLabel = "current"
            marker.map = self.mapView
    
            self.mapView.animate(toLocation: position)
            self.mapView.selectedMarker = marker
        }
    }
    

    And when the marker is selected, the label is set to the address as passed in the "userData" attribute:

    let infoWindow = Bundle.main.loadNibNamed("InfoWindowCurrent", owner: self, options: nil)?[0] as! InfoWindowCurrent
    
    infoWindow.labelAddress.text = marker.userData as? String
    
    return infoWindow
    
    0 讨论(0)
提交回复
热议问题