如何向地图添加多个地标和注释

Posted

技术标签:

【中文标题】如何向地图添加多个地标和注释【英文标题】:How to Add Multiple Placemarks and Annotations to Map 【发布时间】:2012-01-03 05:26:42 【问题描述】:

我有一个类可以加载地图,获取我的当前位置,然后根据邮政编码半径在我的数据库中搜索某个地区的公司。我正在做一个for循环来遍历每个地址,转发地理编码,现在我想为每个位置放置一个地标和注释。我怎样才能做到这一点。这是我的代码:

- (void)locationUpdate:(CLLocation *)location 
locationLabel.text = [location description];
NSNumber *lat = [[NSString alloc] initWithFormat:@"%g", location.coordinate.latitude];
float latValue = [lat floatValue];
NSNumber *lng = [[NSString alloc] initWithFormat:@"%g", location.coordinate.longitude];
float lngValue = [lng floatValue];

mapView=[[MKMapView alloc] initWithFrame:self.view.bounds];
mapView.showsUserLocation=TRUE;
mapView.mapType=MKMapTypeStandard;
mapView.delegate=self;

/*Region and Zoom*/
MKCoordinateRegion region;
MKCoordinateSpan span;
span.latitudeDelta=0.2;
span.longitudeDelta=0.2;

CLLocationCoordinate2D location1=mapView.userLocation.coordinate;

location1.latitude=latValue;
location1.longitude=lngValue;
region.span=span;
region.center=location1;

/*Geocoder Stuff*/

geoCoder=[[MKReverseGeocoder alloc] initWithCoordinate:location1];
geoCoder.delegate=self;
[geoCoder start];

[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
[self.view insertSubview:mapView atIndex:0];

- (void)reverseGeocoder:(MKReverseGeocoder *)geoCoder didFindPlacemark:(MKPlacemark *)placemark

NSDictionary *zipDic = [placemark addressDictionary];
NSString *zipCode = [zipDic objectForKey:@"ZIP"];
NSString *post = [NSString stringWithFormat:@"zip=%@", zipCode];
NSString *hostString = @"https://www.mysite.com/searchzip.php?";

// Append string and add percent escapes
hostString = [[hostString stringByAppendingString:post]    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *hostURL = [NSURL URLWithString:hostString];
NSString *jsonString = [[NSString alloc] initWithContentsOfURL:hostURL];
self.zipArray = [jsonString JSONValue]; 
NSLog(@"%@", zipArray);
for (NSString *sZip in zipArray) 
     NSString *lblAddress = [sZip objectForKey:@"address"];
    NSString *hostStr = [[@"http://maps.google.com/maps/geo?q="   stringByAppendingString:lblAddress]stringByAppendingString:@"&key=ABQIAAAA1KqXKe5yJPkX6ii6Ud    K-0RSIvIZDM4KnjydqrehqKK56hFf_fxQc0uyCKoh-4i77-5B0Qfc8Gs223Q&sensor=false&output=json"];
    hostStr = [hostStr  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *hostURL = [NSURL URLWithString:hostStr];
    NSString *jsonString = [[NSString alloc] initWithContentsOfURL:hostURL];

    SBJSON *parser = [[SBJSON alloc] init];

    // parse the JSON string into an object - assuming json_string is a NSString of JSON data
    NSArray *object = [parser objectWithString:jsonString error:nil];

    NSArray *placemarks = [object objectForKey:@"Placemark"];
    NSDictionary *mark = [placemarks objectAtIndex:0];
    NSDictionary *point = [mark objectForKey:@"Point"];
    NSArray *coordinates = [point objectForKey:@"coordinates"];
    NSNumber *lat = (NSNumber*)[coordinates objectAtIndex:0];
    float latValue = [lat floatValue];
    NSNumber *lon = (NSNumber*)[coordinates objectAtIndex:1];
    float lonValue = [lon floatValue];

          //Here is where I would put placemarks and annotations



- (void)locationError:(NSError *)error 
locationLabel.text = [error description];


@end

我试过了……

CLLocationCoordinate2D location = latitude: latValue, longitude: lonValue;
    return location;

但显然它是错误的。 我尝试创建一个单独的 MapAnnotation 类来处理注释,如下所示:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
#import "AgencyViewController.h"
@interface MapAnnotation : NSObject<MKAnnotation> 
CLLocationCoordinate2D coordinate;
NSString *subtitletext;
NSString *titletext;

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
@property (readwrite, retain) NSString *titletext;
@property (readwrite, retain) NSString *subtitletext;
-(id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
- (NSString *)subtitle;
- (NSString *)title;
-(void)setTitle:(NSString*)strTitle;
-(void)setSubTitle:(NSString*)strSubTitle;

并像这样实现它:

CLLocationCoordinate2D newCoord = latitude: latValue, longitude: lonValue;

    MapAnnotation *addAnnotation = [[MapAnnotation alloc] initWithCoordinate:newCoord];  
    [addAnnotation setTitle:@"The Pin Title"];  
    [addAnnotation setSubTitle:@"The pin subtitle goes here"];  

    [mapView addAnnotation:addAnnotation];  

那也没用……

【问题讨论】:

“没用”是什么意思?怎么了?应用程序崩溃了还是只是没有显示注释?很高兴看到您的代码,但请解释正在发生/未发生的事情等。 【参考方案1】:

想通了,需要补充

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@"Prospects"];
if(pinView == nil) 
    pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Prospects"];
    pinView.pinColor = MKPinAnnotationColorGreen;
    pinView.animatesDrop = NO;
    pinView.canShowCallout = YES;
 else 
    pinView.annotation = annotation;

return pinView;

现在我需要弄清楚如何更改位置图钉的颜色。

【讨论】:

pinView.pinColor = MKPinAnnotationColorGreen;if 语句之外尝试

以上是关于如何向地图添加多个地标和注释的主要内容,如果未能解决你的问题,请参考以下文章

群集注释图钉需要更多时间才能在 Mapview 上添加它们

Yandex 地图 API 2.1。使用 knockoutjs 动态过滤地标

点击集合视图单元以向地图添加注释

百度地图API-标注点添加标签

javascript呼叫百度地图怎么获取所有省会城市的地标资讯?

如何将自定义标记图标添加到 Google 地图?