简体   繁体   中英

How to get the Zipcode in MKMap. (swift3.0)

How to get the zipcode for MKMap view. (swift 3.0) this is my code can you help me?

import UIKit
import MapKit
import GoogleMaps
import Foundation
import CoreLocation
enum PlaceType: CustomStringConvertible {
    case all
    case geocode
    case address
    case establishment
    case regions
    case cities
    var description : String {
        switch self {
        case .all: return ""
        case .geocode: return "geocode"
        case .address: return "address"
        case .establishment: return "establishment"
        case .regions: return "regions"
        case .cities: return "cities"
        }
    }
}

struct Place {
    let id: String
    let description: String
}

class MapViewController: UIViewController,MKMapViewDelegate,UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource,CLLocationManagerDelegate,GMSMapViewDelegate {


    @IBOutlet var topview: UIView!
    @IBOutlet var continuebtn: UIButton!
    @IBOutlet var la3: UILabel!
    @IBOutlet var la2: UILabel!
    @IBOutlet var la1: UILabel!
    @IBOutlet var searchBar: UISearchBar!
    @IBOutlet var tableview: UITableView!
    @IBOutlet var mymap: MKMapView!
    @IBOutlet var backbtn: UIButton!

    var webservice8:NSString = ""
    var locationManager = CLLocationManager()
    let geocorder:CLGeocoder = CLGeocoder()
    var places = [Place]()
    var placeType: PlaceType = .all
    let tapRec = UITapGestureRecognizer()
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    override func viewDidLoad() {

        super.viewDidLoad()
        print("hello map1")
        let str = "\(appDelegate.propertylabel!)"
        let str2 = str.lowercased()
        la3.text = "\(str2) located in?"
        searchBar?.becomeFirstResponder()
        tableview?.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
        self.tableview?.isHidden = true
        self.searchBar?.delegate = self
        self.mymap?.delegate = self
        self.mymap?.mapType = MKMapType.standard
        var currentLocation = CLLocation()

        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()
        locationManager.startUpdatingLocation()



    if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse || CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways ){
            let location = CLLocation(latitude:currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude) //changed!!!
            print("loc\(location)")
            let latDelta = 0.05
            let longDelta = 0.05
            let currentLocationSpan: MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
            let currentLoc: CLLocationCoordinate2D = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude,currentLocation.coordinate.longitude)
            let currentRegion: MKCoordinateRegion = MKCoordinateRegionMake(currentLoc, currentLocationSpan)
            self.mymap.setRegion(currentRegion, animated: true)
            let objectLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(currentLocation.coordinate.latitude, currentLocation.coordinate.longitude)
            let objectAnnotation = MKPointAnnotation()
            objectAnnotation.coordinate = objectLocation
            self.mymap.addAnnotation(objectAnnotation)
            addRadiusCircle(location)
        }
       else
        {
            let alertView:UIAlertView = UIAlertView()
            alertView.delegate=self
            alertView.title="Error"
            alertView.message="Sorry, but we can't determine your current location. You may need to enable Location Services within your device settings."
            alertView.tag=1111
            alertView.addButton(withTitle: "OK")
            alertView.show()
        }
        self.continuebtn
            .isEnabled = false

    }


    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.view.endEditing(true)
    }

    func searchBar(_ searchBar: UISearchBar, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let newLength = (searchBar.text!).characters.count + text.characters.count - range.length
        return newLength <= 30
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        searchBar.resignFirstResponder()
    }

    func isValidName(_ fname:NSString) -> Bool {
        print("Validate Calender: \(fname)")
        let regx="^[a-z,A-Z]{1,10}$"
        let emailTest = NSPredicate(format:"SELF MATCHES %@", regx)
        let result = emailTest.evaluate(with: fname)
        return result
    }

    @IBAction func BackAct(_ sender: Any) {

             self.dismiss(animated: true, completion: nil)

    }


    @IBAction func ContinueAct(_ sender: Any)

    {

        geocorder.geocodeAddressString(self.searchBar.text!, completionHandler: {(placemarks, error) -> Void in
            if let placemark = placemarks?[0] {
                //                var region : MKCoordinateRegion!
                let newLocation : CLLocationCoordinate2D = placemark.location!.coordinate
                let location:CLLocation = CLLocation(latitude: newLocation.latitude, longitude: newLocation.longitude)
                let annotation:MKPointAnnotation = MKPointAnnotation()
                annotation.coordinate = newLocation
                if self.mymap.annotations.count > 0 {
                    self.mymap.removeAnnotations(self.mymap.annotations)
                }
                self.mymap.addAnnotation(annotation)
                var mr:MKMapRect = self.mymap.visibleMapRect
                let pt:MKMapPoint = MKMapPointForCoordinate(annotation.coordinate)
                mr.origin.x = pt.x - mr.size.width * 0.5
                mr.origin.y = pt.y - mr.size.height * 0.5
                self.mymap.setVisibleMapRect(mr, animated: true)
                self.mymap.autoresizingMask = self.view.autoresizingMask


                let latitude: NSNumber = 9.10
                let longitude:NSNumber = 78.10
                self.appDelegate.lat = "\(latitude)" as NSString!
                self.appDelegate.long = "\(longitude)" as NSString!
                print("Latitude value:\(self.appDelegate.lat)")
                print("Longitude value:\(self.appDelegate.long)")
                let overlays = self.mymap.overlays
                self.mymap.removeOverlays(overlays)
                self.addRadiusCircle(location)


                var listadrs:NSString = self.searchBar.text! as NSString
                self.mymap.removeAnnotations(self.mymap.annotations)
                if self.appDelegate.hostproperty == "map"
                {
                    print ("Success")
                    var listadrs:NSString = self.searchBar.text! as NSString
                    if(listadrs == "")
                    {
                        UserDefaults.standard.set(listadrs, forKey:"listadrs")
                        UserDefaults.standard.synchronize()
                        let myOutput2: AnyObject? = UserDefaults.standard.object(forKey: "listadrs") as AnyObject?
                        print("ass\(myOutput2)")
                        listadrs="xxx"

                    }
                    else
                    {
                        listadrs = self.searchBar.text! as NSString
                        UserDefaults.standard.set(listadrs, forKey:"listadrs")
                        UserDefaults.standard.synchronize()
                        let myOutput2: AnyObject? = UserDefaults.standard.object(forKey: "listadrs") as AnyObject?
                        print("sss\(myOutput2!)")

                        let appDelegate = UIApplication.shared.delegate as! AppDelegate
                        appDelegate.searchplace=("\(self.searchBar.text)")
                        let secondViewController1 = self.storyboard!.instantiateViewController(withIdentifier: "hostboat")
                        self.present(secondViewController1, animated: true, completion: nil)
                    }
                    UIGraphicsBeginImageContextWithOptions(self.mymap.bounds.size, false, UIScreen.main.scale)
                    self.mymap.layer.render(in: UIGraphicsGetCurrentContext()!)
                    self.appDelegate.mapimg = UIGraphicsGetImageFromCurrentImageContext()
                    UIGraphicsEndImageContext()
                }
                else if(listadrs == "")
                {
                    print("Dual")
                    UserDefaults.standard.set(listadrs, forKey:"listadrs")
                    UserDefaults.standard.synchronize()
                    let myOutput2: AnyObject? = UserDefaults.standard.object(forKey: "listadrs") as AnyObject?
                    print("ad\(myOutput2)")
                    listadrs="xxx"
                    let secondViewController1 = self.storyboard!.instantiateViewController(withIdentifier: "hostboat")
                    self.present(secondViewController1, animated: true, completion: nil)
                }
                else
                {
                    listadrs = self.searchBar.text! as NSString
                    UserDefaults.standard.set(listadrs, forKey:"listadrs")
                    UserDefaults.standard.synchronize()
                    let myOutput2: AnyObject? = UserDefaults.standard.object(forKey: "listadrs") as AnyObject?
                    print("adddd\(myOutput2)")
                    let appDelegate = UIApplication.shared.delegate as! AppDelegate
                    appDelegate.searchplace=("\(self.searchBar.text)")
                    let secondViewController1 = self.storyboard!.instantiateViewController(withIdentifier: "hostboat")
                    self.present(secondViewController1, animated: true, completion: nil)
                }
                UIGraphicsBeginImageContextWithOptions(self.mymap.bounds.size, false, UIScreen.main.scale)
                self.mymap.layer.render(in: UIGraphicsGetCurrentContext()!)
                self.appDelegate.mapimg = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
            }
        })
    }





    func addRadiusCircle(_ location: CLLocation){

        self.mymap.delegate = self
        let circle = MKCircle(center: location.coordinate, radius: 700 as CLLocationDistance)
        self.mymap.add(circle)
        self.continuebtn.isEnabled = true
    }



    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
    {
        let circle = MKCircleRenderer(overlay: overlay)
        circle.strokeColor = UIColor.white
        circle.fillColor = UIColor(red: 0/255, green: 204/255, blue: 204/255, alpha: 0.4)
        circle.lineWidth = 5
        return circle

    }

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        if annotation is MKPointAnnotation {
            let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin")
            pinAnnotationView.pinColor = .red
            pinAnnotationView.isDraggable = true
            pinAnnotationView.canShowCallout = true
            pinAnnotationView.animatesDrop = true
            return pinAnnotationView
        }

        return nil
    }



    func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, didChange newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState)
    {
        switch (newState)
        {
        case .starting:
            view.dragState = .dragging
        case .ending, .canceling:
            view.dragState = .none
        default: break
        }
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        geocorder.geocodeAddressString(self.searchBar.text!, completionHandler: {(placemarks , error) -> Void in
            if let placemark = placemarks?[0]{

                let newLocation : CLLocationCoordinate2D = placemark.location!.coordinate
                let location:CLLocation = CLLocation(latitude: newLocation.latitude, longitude: newLocation.longitude)
                let annotation:MKPointAnnotation = MKPointAnnotation()
                annotation.coordinate = newLocation



                self.mymap?.addAnnotation(annotation)
                var mr:MKMapRect = self.mymap.visibleMapRect
                let pt:MKMapPoint = MKMapPointForCoordinate(annotation.coordinate)
                mr.origin.x = pt.x - mr.size.width * 0.5
                mr.origin.y = pt.y - mr.size.height * 0.5
                self.mymap.setVisibleMapRect(mr, animated: true)
                self.mymap.autoresizingMask = self.view.autoresizingMask
                self.addRadiusCircle(location)
            }
        })
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return places.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        let place = self.places[(indexPath as NSIndexPath).row]
        cell.textLabel!.text = place.description
        cell.accessoryType = UITableViewCellAccessoryType.disclosureIndicator
        return cell
    }
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        self.searchBar.resignFirstResponder()
        self.searchBar.text = self.places[(indexPath as NSIndexPath).row].description
        tableView.isHidden = true
        self.mymap.isHidden = false

        geocorder.geocodeAddressString(self.searchBar.text!, completionHandler: {(placemarks, error) -> Void in
            if let placemark = placemarks?[0] {

                let newLocation : CLLocationCoordinate2D = placemark.location!.coordinate
                let location:CLLocation = CLLocation(latitude: newLocation.latitude, longitude: newLocation.longitude)
                let annotation:MKPointAnnotation = MKPointAnnotation()
                annotation.coordinate = newLocation
                if self.mymap.annotations.count > 0 {
                    self.mymap.removeAnnotations(self.mymap.annotations)
                }
                self.mymap.addAnnotation(annotation)
                var mr:MKMapRect = self.mymap.visibleMapRect
                let pt:MKMapPoint = MKMapPointForCoordinate(annotation.coordinate)
                mr.origin.x = pt.x - mr.size.width * 0.5
                mr.origin.y = pt.y - mr.size.height * 0.5
                self.mymap.setVisibleMapRect(mr, animated: true)
                self.mymap.autoresizingMask = self.view.autoresizingMask


                let latitude: NSNumber = 9.10
                let longitude:NSNumber = 78.10
                self.appDelegate.lat = "\(latitude)" as NSString!
                self.appDelegate.long = "\(longitude)" as NSString!
                print("Latitude value:\(self.appDelegate.lat)")
                print("Longitude value:\(self.appDelegate.long)")
                let overlays = self.mymap.overlays
                self.mymap.removeOverlays(overlays)
                self.addRadiusCircle(location)
            }
        })
    }
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if (searchText == "") {
            self.places = []
            self.tableview.isHidden = true
        } else {
            self.tableview.isHidden = false
            self.mymap.isHidden = true
            getPlaces(searchString: searchText)
        }
    }

    func getPlaces(searchString: String) {
        var request = requestForSearch(searchString)

        var session = URLSession.shared
        var task = session.dataTask(with: request) { data, response, error in
            self.handleResponse(data, response: response as? HTTPURLResponse, error: error as NSError!)

        }

        task.resume()
    }

    func handleResponse(_ data: Data!, response: HTTPURLResponse!, error: NSError!) {
        if let error = error {
            print("GooglePlacesAutocomplete Error: \(error.localizedDescription)")
            return
        }
        if response == nil {
            print("GooglePlacesAutocomplete Error: No response from API")
            return
        }
        if response.statusCode != 200 {
            print("GooglePlacesAutocomplete Error: Invalid status code \(response.statusCode) from API")
            return
        }
        let serializationError: NSError? = error
        let json: NSDictionary = (try! JSONSerialization.jsonObject(
            with: data,
            options: JSONSerialization.ReadingOptions.mutableContainers)) as! NSDictionary
        if let error = serializationError {
            print("GooglePlacesAutocomplete Error: \(error.localizedDescription)")
            return
        }
        DispatchQueue.main.async(execute: {
            UIApplication.shared.isNetworkActivityIndicatorVisible = false
            if let predictions = json["predictions"] as? Array<AnyObject> {
                self.places = predictions.map { (prediction: AnyObject) -> Place in
                    return Place(
                        id: prediction["id"] as! String,
                        description: prediction["description"] as! String
                    )
                }
                self.tableview.reloadData()
                self.tableview.isHidden = false
            }
        })
    }

    func requestForSearch(_ searchString: String) -> URLRequest {

        let searchString = searchString.replacingOccurrences(of: "Optional", with: "")
        let place_type = placeType.description.replacingOccurrences(of: "Optional", with: "")
        let key_google = google_place_key.replacingOccurrences(of: "Optional", with: "")

        print("print1\(searchString)")
        print("print2\(place_type)")
        print("print3\(key_google)")

        let params = [
            "input": searchString,

            "key": google_place_key
        ]

        print("Place url ->  https://maps.googleapis.com/maps/api/place/autocomplete/json?\(query(params as [String : Any] as [String : AnyObject]))")

        var url1 = "https://maps.googleapis.com/maps/api/place/autocomplete/json?\(query(params as [String : Any] as [String : AnyObject]))"
        print("Place->\(url1)")

        let url2 = url1.replacingOccurrences(of: "Optional", with: "")
        let url3 = url2.replacingOccurrences(of: "%28", with: "")
        let url4 = url3.replacingOccurrences(of: "%29", with: "")

        return NSMutableURLRequest(
            url: URL(string: url4)!
            ) as URLRequest


    }
    func query(_ parameters: [String: AnyObject]) -> String {
        var components: [(String, String)] = []
        for key in Array(parameters.keys).sorted(by: <) {
            let value: AnyObject! = parameters[key]
            components += [(escape(key), escape("\(value!)"))]
        }
        return (components.map{"\($0)=\($1)"} as [String]).joined(separator: "&")
    }
    func escape(_ string: String) -> String {
        let legalURLCharactersToBeEscaped: CFString = ":/?&=;+!@#$()',*" as CFString
        return CFURLCreateStringByAddingPercentEscapes(nil, string as CFString!, nil, legalURLCharactersToBeEscaped, CFStringBuiltInEncodings.UTF8.rawValue) as String
    }

    override func viewWillAppear (_ animated: Bool){
        super.viewWillAppear(animated);



    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()


    }



}

Just follow the Guides at Google Places API

They explain step by step how to use the Google Places API in order to get detailed information about your current, or any other location on the map. The object returned by their API includes a property for postcode etc.

Hope that helps

Your code already uses geocodeAddressString to get an array of placemarks from your address string. You just need to look at the CLPlacemark structure. It has a property addressDictionary that contains key/value pairs that should include a zip code. print the contents of the addressDictionary and find the key that contains the zip code.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM