2013-04-03 14 views
7

this ve this sorusunu yeniden canlandırmak istiyorum çünkü sorun hala benim için devam ediyor, bu yüzden yeni bir soru yazıyorum. Ben çünkü Google'ın bu çözümü kullanmak 5,1CLGeocoder hiç bir yer işareti döndürüyor

iOS < için retrocompatibility ileri coğrafi kodlama için CLGeocoder kullanarak SVGeocoder benim kişisel sürümü (oldukça kaba) 'dir

- (SVGeocoder*)initWithParameters:(NSMutableDictionary*)parameters completion:(SVGeocoderCompletionHandler)block { 
self = [super init]; 

self.operationCompletionBlock = block; 

Class cl = NSClassFromString(@"CLGeocoder"); 
if (cl != nil) 
{ 
    if (self.geocoder_5_1 == nil) { 
     self.geocoder_5_1 = [[cl alloc] init]; 
    } 

    NSString *address = [parameters objectForKey:kGeocoderAddress]; 
    [self.geocoder_5_1 geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) { 
     NSMutableArray *svplacemarks = [NSMutableArray arrayWithCapacity:1]; 
     SVPlacemark *placemark; 
     NSLog(@"placemarks[count] = %i", [placemarks count]); 
     for (CLPlacemark *mark in placemarks) { 
      placemark = [[SVPlacemark alloc] initWithPlacemark:mark]; 
      [svplacemarks addObject:placemark]; 
     } 

     self.operationCompletionBlock([NSArray arrayWithArray:svplacemarks],nil,error); 
    }]; 

} 
else 
{ 
    self.operationRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://maps.googleapis.com/maps/api/geocode/json"]]; 
    [self.operationRequest setTimeoutInterval:kSVGeocoderTimeoutInterval]; 

    [parameters setValue:@"true" forKey:kGeocoderSensor]; 
    [parameters setValue:[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode] forKey:kGeocoderLanguage]; 
    [self addParametersToRequest:parameters]; 

    self.state = SVGeocoderStateReady; 
} 
return self; 
} 

:

Bu

benim kodudur Google Haritası üzerinde sonuç göstermeden haritalar API'sinin kullanımını engelleyen terimler.

sorun daha önce sözü edilen sorulardan aynı biridir: "= 1 işaretlerini [saymak]" CLGeocoder tek işaretini verir ve günlük güzel

yazdırır.

ileri coğrafi kodlama veya başka sihirli şeyi almak için başka bir yol varsa Sorum bilen var olan (Apple harita uygulamasıdır örneğin "via roma" Ben aynı sorgu için birden işaretçileri, gösterir

) ROB'S ÇÖZÜM

Class mkLocalSearch = NSClassFromString(@"MKLocalSearch"); 

if (mkLocalSearch != nil) 
{ 
    NSString *address = [parameters objectForKey:kGeocoderAddress]; 
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; 

    request.region = MKCoordinateRegionForMapRect(MKMapRectWorld); 

    request.naturalLanguageQuery = address; 

    MKLocalSearch *localsearch = [[MKLocalSearch alloc] initWithRequest:request]; 
    [localsearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 

     NSMutableArray *svplacemarks = [NSMutableArray arrayWithCapacity:1]; 
     SVPlacemark *placemark; 
     NSLog(@"response.mapItems[count] = %i", [response.mapItems count]); 

     for (MKMapItem *item in response.mapItems) 
     { 
      placemark = [[SVPlacemark alloc] initWithPlacemark:item.placemark]; 
      [svplacemarks addObject:placemark]; 
     } 

     self.operationCompletionBlock([NSArray arrayWithArray:svplacemarks],nil,error); 
    }]; 
} 

İÇİN


DÜZENLEME Bu bakış başka noktası verir ilginç bir çözümdür. Ne yazık ki, dünya çapında bölgeyi ayarlanmış olsa bile, hala güzel bir günlüğünü

response.mapItems olsun [saymak] = 1

sorgu çok yaygın olan "via roma" idi İtalya'da sokak adı, o kadar ki, sanırım neredeyse herhangi bir İtalyan şehrinde bulabileceğimizi düşünüyorum.

Belki yanlış bir şey yapıyorum?


DÜZENLEME 2 - Yeni Test:

CLRegion Dünya Rect dönüştürmek, here

NSString *address = [parameters objectForKey:kGeocoderAddress]; 

    // make a conversion from MKMapRectWorld to a regular CLRegion 
    MKMapRect mRect = MKMapRectWorld; 
    MKMapPoint neMapPoint = MKMapPointMake(MKMapRectGetMaxX(mRect), mRect.origin.y); 
    MKMapPoint swMapPoint = MKMapPointMake(mRect.origin.x, MKMapRectGetMaxY(mRect)); 

    float ewDelta= neMapPoint.x - swMapPoint.x; 
    float nsDelta= swMapPoint.y - neMapPoint.y; 

    MKMapPoint cMapPoint = MKMapPointMake(ewDelta/2 + swMapPoint.x, nsDelta/2 + neMapPoint.y); 

    CLLocationCoordinate2D neCoord = MKCoordinateForMapPoint(neMapPoint); 
    CLLocationCoordinate2D swCoord = MKCoordinateForMapPoint(swMapPoint); 

    CLLocationCoordinate2D centerCoord = MKCoordinateForMapPoint(cMapPoint); 

    CLLocationDistance diameter = [self getDistanceFrom:neCoord to:swCoord]; 

// i don't have the map like showed in the example so i'm trying to center the search area to the hypothetical center of the world 
    CLRegion *clRegion = [[CLRegion alloc] initCircularRegionWithCenter:centerCoord radius:(diameter/2) identifier:@"worldwide"]; 
    [self.geocoder_5_1 geocodeAddressString:address inRegion: clRegion completionHandler:^(NSArray *placemarks, NSError *error) { 
     NSMutableArray *svplacemarks = [NSMutableArray arrayWithCapacity:1]; 
     SVPlacemark *placemark; 
     NSLog(@"placemarks[count] = %i", [placemarks count]); 
     for (CLPlacemark *mark in placemarks) { 
      placemark = [[SVPlacemark alloc] initWithPlacemark:mark]; 
      [svplacemarks addObject:placemark]; 
     } 

     self.operationCompletionBlock([NSArray arrayWithArray:svplacemarks],nil,error); 
    }]; 

kod ... ve her zamanki olsun "işaretini [saymak] = 1"

cevap

5

Açıkça belirtmek gerekirse, adres birden çok isabet alıyorsa (yani bölge, basit sokak adresinin belirsiz olduğu kadar genişse), CLGeocoder birden fazla yer işaretini döndürecektir. Bölgenin yeterince küçük olması ya da sağlanan adresin yeterince benzersiz olması durumunda, sadece bir eşleşme bulacaksınız.

iOS 6.1 efektif bir genel amaçlı çözüm olmasa da, siz (işletmelerin adları dahil, vs.) daha genel bir arama yapar, hangi MKLocalSearch var:

MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init]; 
request.region = self.mapView.region; 
request.naturalLanguageQuery = textField.text; 

MKLocalSearch *localsearch = [[MKLocalSearch alloc] initWithRequest:request]; 
[localsearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) { 
    for (MKMapItem *item in response.mapItems) 
    { 
     Annotation *annotation = [[Annotation alloc] initWithPlacemark:item.placemark]; 
     annotation.title = item.name; 
     annotation.phone = item.phoneNumber; 
     annotation.subtitle = item.placemark.addressDictionary[(NSString *)kABPersonAddressStreetKey]; 
     [self.mapView addAnnotation:annotation]; 
    } 
}]; 

sanırım hepsi ne bağlıdır Almayı beklediğiniz birden çok isabet türü.

+0

Cevabınız için teşekkürler Rob. Uygulamanın amacı, uydu navigatörü ile benzer. Çözümünüzün uygulanmasını göstermek için yayınımı düzenlerim. – Alex75

+0

Kullanmakta olduğum çözümü ne olursa olsun (CLGeoCoder' veya 'MKLocalSearch' olsun) her zaman sadece bir sonuç alıyorum. Ben, Berlin, Almanya ve "San" için arama yaparken "San Diego, CA" alıyorum ve "San Francisco, CA" değil. İkisini de beklerdim (Yeryüzünde bolca San ... var) –

+0

@Julian - Katılıyorum. Bunların hiçbiri kapsamlı listeleri geri getirmez. CLGeocoder ile 1 veya 2'den fazla giriş görmeyeceğim. İki veya üç girişi geri döndüren "en iyi tahmin" yaklaşımı gibi geliyor. 'MKLocalSearch' ile çok daha fazla isabet elde edersiniz (örneğin, belirli bir şehirde" restoran "aramayı deneyin ve restoranların bir listesini alırsınız), ancak hiçbir şekilde kapsamlı bir liste değildir (bölgeyi bir kesiri değiştirin) küçük ve sonuçların çok farklı bir listesi ile sonuçlanabilir). – Rob

0

CLGeocoder'ın birden çok yer işareti döndürdüğü bazı adresler vardır. Bulduğum bir örnek "Herzel 13, Haifa, İsrail" dir. geocodeAddressDictionary:completionHandler: yöntemini kullanıyorum ve adres için aynı 2 sonucu (cadde/şehir/ülke olarak ya da yalnızca cadde olarak belirlenebilir - sonuçlar aynıdır).

Bu tür örnekleri bulmak oldukça zor ve elbette gelecekte değişebilir. Bazı nedenlerle, Apple haritaları uygulaması, daha birçok adres için "Bunu mu demek istediniz?" Iletişim kutusunu gösterir.

+1

evet ... soru şu: "Elma bunu nasıl yaptı?" Bugüne kadar hiçbir cevap bulamadım – Alex75

İlgili konular