2017-03-03 5 views
0

Ich habe eine Mapview und ich habe eine Methode hinzugefügt, um einen Pin an der Stelle zu hinterlassen, wo der Benutzer gedrückt hat. Das Callout zeigt die Adresse des Ortes, wie auf dem Bild gezeigt.Kann ich einen Ladennamen/Restaurantnamen mit mapkit bekommen? (Swift)

screenshot of my mapview with annotation pin and callout view.

Und mein Code ist wie folgt:

func onTapGestureRecognized(sender: UILongPressGestureRecognizer) { 

    self.mapView.removeAnnotations(mapView.annotations) 

    let location = tapRecognizer.location(in: mapView) 
    let coordinate = mapView.convert(location,toCoordinateFrom: mapView) 

    let getLat: CLLocationDegrees = coordinate.latitude 
    let getLon: CLLocationDegrees = coordinate.longitude 
    let theLocation: CLLocation = CLLocation(latitude: getLat, longitude: getLon) 

    let geoCoder = CLGeocoder() 

    geoCoder.reverseGeocodeLocation(theLocation, completionHandler: { (placemarks, error) -> Void in 

     // Place details 
     var placeMark: CLPlacemark! 
     placeMark = placemarks?[0] 
     var theLocationName = "" 
     var theStreetNumber = "" 
     var theStreet = "" 
     var theCity = "" 
     var theZip = "" 
     var theCountry = "" 

     // Address dictionary 
     print(placeMark.addressDictionary as Any) 

     // Location name 
     if let locationName = placeMark.name{ 
      theLocationName = locationName 
     } 

     if let streetNumber = placeMark.subThoroughfare{ 
      theStreetNumber = streetNumber 
     } 
     // Street address 
     if let street = placeMark.thoroughfare { 
      theStreet = street 
     } 

     // City 
     if let city = placeMark.locality { 
      theCity = city 
     } 

     // Zip code 
     if let zip = placeMark.postalCode{ 
      theZip = zip 
     } 

     // Country 
     if let country = placeMark.isoCountryCode{ 
      theCountry = country 
     } 

     let annotation = MKPointAnnotation() 
     annotation.title = theLocationName 
     annotation.subtitle = theStreetNumber + " " + theStreet + ", " + theCity + ", " + theCountry + ", " + theZip 
     if let location = placeMark.location { 
      annotation.coordinate = location.coordinate 
      // Display the annotation 
      self.mapView.showAnnotations([annotation], animated: true) 
     } 
    }) 

} 

Wie Sie sehen können, wenn ich versuche, durch den Aufruf der Linie, die die Ortsnamen zu erhalten ((((wenn location = Ortsmarkierungs lassen. Name)))), kann ich nur die Adresse: "5197 Yonge St", anstelle des Restaurantnamens: "Pho 88 Restaurant".

Kann mir jemand sagen, wo ich falsch gemacht habe? oder ist es einfach nicht zu erreichen? Vielen Dank!

+0

Vielleicht, weil ein ** map ** Standort genau das ist? Kein ** Business ** Standort? – dfd

+0

Ihr Code funktioniert perfekt mit einem anderen Ort, versuchen Sie es für einen anderen Ort. –

+0

@ArpitDongre Ja, ich habe es mit anderen Orten versucht, es zeigt manchmal den Namen eines Ortes oder einer Plaza (zB City Centre North York, Mel Eastman Square), aber nie einen Restaurantnamen oder einen Geschäftsnamen (Firmennamen) –

Antwort

0

Ich kann Ihnen keine vollständige Antwort geben, aber ich kann Ihnen vielleicht in die richtige Richtung zeigen. Soweit ich sehen kann, erhalten Sie immer nur einen einzigen Eintrag für placemarks, aber Sie können erhalten eine vollständige Liste mit MKLocalSearchRequest. Die Herausforderung wird sein, wie Sie die zurückgegebenen Werte genau an die von Ihnen gewünschte anpassen - vielleicht müssen Sie den Benutzer bitten, aus einer kurzen Liste auszuwählen? Außerdem denke ich, dass Sie angeben müssen, nach welcher Art von Einrichtung Sie suchen. Hier ist etwas, das Sie in Ihrem Abschluss-Handler über

let request = MKLocalSearchRequest() 
request.naturalLanguageQuery = "restaurant" // or whatever you're searching for 
request.region = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: getLat, longitude: getLon), span: self.mapView.region.span) 

let search = MKLocalSearch(request: request) 
search.start { response, error in 
    guard let response = response else { 
     print("There was an error searching for: \(request.naturalLanguageQuery) error: \(error)") 
       return 
    } 
    print("There are \(response.mapItems.count)") 
    for item in response.mapItems { 
     // You may be able to match the address to what the geoCode gives you 
     // or present the user with a list of options 
     print("\(item.name), \(item.placemark)") 
    } 
} 

enthalten könnte, wenn ich dies testen, haben die Adressen nicht immer übereinstimmen, auch wenn in gezoomt - so dass geoCoder geben könnte mir 1-3 Some Street während die MKLocalSearchRequest ein Restaurant zurück 3 Some Street

Verwandte Themen