Objective-C - 根据用户输入的查询搜索街道
Objective-C - Search for streets based on user-entered query
我想让用户搜索街道名称并将结果显示在 UITableView 中。
暂时地区不重要,可以是任何地区。
我在搜索中找不到任何相关示例,我不知道是否应该使用 CLLocation 或 MKLocalSearch。
根据文档,我应该使用 MKLocalSearch:
Although local search and geocoding are similar, they support
different use cases. Use geocoding when you want to convert between
map coordinates and a structured address, such as an Address Book
address. Use local search when you want to find a set of locations
that match the user’s input.
但是我已经尝试了这两种方法,它只给了我 1 个结果(即使有一个 NSArray returned.
这是 CLGeocoder 方法:
CLGeocoder *geocoding = [[CLGeocoder alloc] init];
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"%i", [placemarks count]);
for(CLPlacemark *myStr in placemarks) {
NSLog(@"%@", myStr);
}
}
}];
这是我的 MKLocalSearch 尝试:
MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = theTextField.text;
request.region = self.region;
localSearch = [[MKLocalSearch alloc] initWithRequest:request];
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){
if (error != nil) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil)
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
if ([response.mapItems count] == 0) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil)
message:nil
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
self.streets = response;
[self.streetsTableView reloadData];
}];
MKLocalSearch 在某些情况下似乎 return 超过 1 个响应,但这些与地点相关而不是街道名称搜索。
提前致谢。
CLGeocoder 只是 returns 地址格式。
在你的代码中加入这个并使用 mapitems
的内容
MKLocalSearchRequest *request = [MKLocalSearchRequest new];
request.naturalLanguageQuery = @"Pizza";
request.region = MKCoordinateRegionMake(location.coordinate, MKCoordinateSpanMake(.01, .01));
MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
NSArray *mapItems = response.mapItems;
for (MKMapItem *mapItem in mapItems) {
MKPointAnnotation *point = [MKPointAnnotation new];
point.coordinate = mapItem.placemark.coordinate;`
}
}];
这是我能得到的最接近的。这涉及使用 google places API Web Service。
注意:您可能可以使用他们的 Google 地图 API 等。我相信还有其他方法可以从各种 Google 获取此信息API秒。
NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&location=%f,%f&sensor=true&key=API_KEY", formattedSearchText, location.coordinate.latitude,
location.coordinate.longitude]];
响应是一个 JSON 对象。将其转换为字典。
NSDictionary *response = [NSJSONSerialization JSONObjectWithData:_googlePlacesResponse
options:NSJSONReadingMutableContainers error:&error];
if([[response objectForKey:@"status"] isEqualToString:@"OK"])
{
NSArray *predictions = [response objectForKey:@"predictions"];
for(NSDictionary *prediction in predictions)
{
NSArray *addressTypes = [prediction objectForKey:@"types"];
if([addressTypes containsObject:@"route"])
{
//This search result contains a street name.
//Now get the street name.
NSArray *terms = [prediction objectForKey:@"terms"];
NSDictionary *streetNameKeyValuePair = [terms objectAtIndex:0];
NSLog(@"%@",[streetNameKeyValuePair objectForKey@"value"]);
}
}
}
可能的types
似乎是
路线 -> 街道名称
地区 -> City/location 姓名
政治 -> 国家等
地理编码 -> lat/long 可用
您可以使用 ONLY 包含 route
作为地址类型的那些 predictions
填充 table 视图。这可以工作。
返回的数组包含mapItems
,您可以像这样遍历数组以拉出所有mapItems:
myMatchingItems = [[NSMutableArray alloc] init];
for (MKMapItem *item in response.mapItems){
[myMatchingItems addObject:item];
}
每个 mapItem.placemark.thoroughfare
都包含所找到位置的街道。
我想让用户搜索街道名称并将结果显示在 UITableView 中。 暂时地区不重要,可以是任何地区。
我在搜索中找不到任何相关示例,我不知道是否应该使用 CLLocation 或 MKLocalSearch。
根据文档,我应该使用 MKLocalSearch:
Although local search and geocoding are similar, they support different use cases. Use geocoding when you want to convert between map coordinates and a structured address, such as an Address Book address. Use local search when you want to find a set of locations that match the user’s input.
但是我已经尝试了这两种方法,它只给了我 1 个结果(即使有一个 NSArray returned.
这是 CLGeocoder 方法:
CLGeocoder *geocoding = [[CLGeocoder alloc] init];
[geocoding geocodeAddressString:theTextField.text completionHandler:^(NSArray *placemarks, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSLog(@"%i", [placemarks count]);
for(CLPlacemark *myStr in placemarks) {
NSLog(@"%@", myStr);
}
}
}];
这是我的 MKLocalSearch 尝试:
MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = theTextField.text;
request.region = self.region;
localSearch = [[MKLocalSearch alloc] initWithRequest:request];
[localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){
if (error != nil) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Map Error",nil)
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
if ([response.mapItems count] == 0) {
[[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"No Results",nil)
message:nil
delegate:nil
cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil] show];
return;
}
self.streets = response;
[self.streetsTableView reloadData];
}];
MKLocalSearch 在某些情况下似乎 return 超过 1 个响应,但这些与地点相关而不是街道名称搜索。
提前致谢。
CLGeocoder 只是 returns 地址格式。 在你的代码中加入这个并使用 mapitems
的内容MKLocalSearchRequest *request = [MKLocalSearchRequest new];
request.naturalLanguageQuery = @"Pizza";
request.region = MKCoordinateRegionMake(location.coordinate, MKCoordinateSpanMake(.01, .01));
MKLocalSearch *search = [[MKLocalSearch alloc]initWithRequest:request];
[search startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {
NSArray *mapItems = response.mapItems;
for (MKMapItem *mapItem in mapItems) {
MKPointAnnotation *point = [MKPointAnnotation new];
point.coordinate = mapItem.placemark.coordinate;`
}
}];
这是我能得到的最接近的。这涉及使用 google places API Web Service。
注意:您可能可以使用他们的 Google 地图 API 等。我相信还有其他方法可以从各种 Google 获取此信息API秒。
NSURL *googlePlacesURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://maps.googleapis.com/maps/api/place/autocomplete/json?input=%@&location=%f,%f&sensor=true&key=API_KEY", formattedSearchText, location.coordinate.latitude,
location.coordinate.longitude]];
响应是一个 JSON 对象。将其转换为字典。
NSDictionary *response = [NSJSONSerialization JSONObjectWithData:_googlePlacesResponse
options:NSJSONReadingMutableContainers error:&error];
if([[response objectForKey:@"status"] isEqualToString:@"OK"])
{
NSArray *predictions = [response objectForKey:@"predictions"];
for(NSDictionary *prediction in predictions)
{
NSArray *addressTypes = [prediction objectForKey:@"types"];
if([addressTypes containsObject:@"route"])
{
//This search result contains a street name.
//Now get the street name.
NSArray *terms = [prediction objectForKey:@"terms"];
NSDictionary *streetNameKeyValuePair = [terms objectAtIndex:0];
NSLog(@"%@",[streetNameKeyValuePair objectForKey@"value"]);
}
}
}
可能的types
似乎是
您可以使用 ONLY 包含 route
作为地址类型的那些 predictions
填充 table 视图。这可以工作。
返回的数组包含mapItems
,您可以像这样遍历数组以拉出所有mapItems:
myMatchingItems = [[NSMutableArray alloc] init];
for (MKMapItem *item in response.mapItems){
[myMatchingItems addObject:item];
}
每个 mapItem.placemark.thoroughfare
都包含所找到位置的街道。