实现效果:
实现思路:
一:后台获取每个区的数据
-(void)addAnnotationWithArray:(NSMutableArray *)arr{
for (DistirctCountModel * model in arr) {
CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([model.latitude doubleValue],[model.longitude doubleValue]);
[self addAnnotationWithCooordinate:coordinate withModel:model];
}
}
-(void)addAnnotationWithCooordinate:(CLLocationCoordinate2D)coordinate withModel:(DistirctCountModel *)model
{
MAPointAnnotation *annotation = [[MAPointAnnotation alloc] init];
annotation.coordinate = coordinate;
annotation.title = model.name;
annotation.subtitle = model.school_count;
[self.mapView addAnnotation:annotation];
}
二:自定义MarkView展示各区数据,并且支持点击放大
- (MAAnnotationView *)mapView:(MAMapView *)mapView viewForAnnotation:(id)annotation {
if ([annotation isKindOfClass:[MAPointAnnotation class]])
{
static NSString *customReuseIndetifier = @"customReuseIndetifier";
CustomAnnotationView *annotationView = (CustomAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:customReuseIndetifier];
if (annotationView == nil)
{
annotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:customReuseIndetifier];
// must set to NO, so we can show the custom callout view.
annotationView.canShowCallout = NO;
annotationView.draggable = YES;
annotationView.delegate = self;
// annotationView.calloutOffset = CGPointMake(0, -5);
}
NSLog(@" annotation.title %@",annotation.title);
annotationView.portrait = annotation.subtitle;
annotationView.name = annotation.title;
return annotationView;
}
return nil;
}
三:放大到显示具体房源位置,自定义MarkView显示名称
-(void)didSelectCustomAnnotationView:(MAAnnotationView *)annotationView withCoorinate:(CLLocationCoordinate2D)coorinate andCityName:(NSString *)cityName{
[self.mapView setZoomLevel:14 animated:YES];
[self.mapView setCenterCoordinate:coorinate];
/* MAMapRect visibleRect = self.mapView.visibleMapRect;
double zoomScale = self.mapView.bounds.size.width / visibleRect.size.width;
double zoomLevel = self.mapView.zoomLevel;
用户滑动时,保留仍然可用的标注,去除屏幕外标注,添加新增区域的标注
[self.mapView addAnnotations:[toAdd allObjects]];
[self.mapView removeAnnotations:[toRemove allObjects]];
CGPoint theCenter = self.mapView.center;
theCenter = CGPointMake(theCenter.x - offset.width, theCenter.y - offset.height);
CLLocationCoordinate2D coordinate = [self.mapView convertPoint:theCenter toCoordinateFromView:self.mapView];
1334、2 = 667 - 554 = 113
*/
[self.mapView removeAnnotations:self.mapView.annotations];
MAMapRect visibleRect = self.mapView.visibleMapRect;
NSLog(@" visibleRect %.1f,%.1f,%.1f,%.1f",visibleRect.origin.x,visibleRect.origin.y,visibleRect.size.height,visibleRect.size.width);
CGRect rect = self.mapView.bounds;
NSLog(@" self.mapView.bounds %.1f,%.1f,%.1f,%.1f",rect.origin.x,rect.origin.y,rect.size.height,rect.size.width);
[self cloudPlacePolygonSearch];
}
- (void)cloudPlacePolygonSearch
{
CLLocationCoordinate2D coordinate = [self.mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:self.mapView];
NSLog(@" 原点的经纬度 coordinate %.1f,%.1f",coordinate.latitude,coordinate.longitude);
CLLocationCoordinate2D coordinate1 = [self.mapView convertPoint:CGPointMake(self.mapView.bounds.size.width, 0) toCoordinateFromView:self.mapView];
CLLocationCoordinate2D coordinate3 = [self.mapView convertPoint:CGPointMake(0, self.mapView.bounds.size.height) toCoordinateFromView:self.mapView];
CLLocationCoordinate2D coordinate2 = [self.mapView convertPoint:CGPointMake(self.mapView.bounds.size.width, self.mapView.bounds.size.height) toCoordinateFromView:self.mapView];
NSLog(@" 四个角的经纬度 coordinate %.1f,%.1f coordinate1 %.1f,%.1f coordinate2 %.1f,%.1f coordinate3 %.1f,%.1f",coordinate.latitude,coordinate.longitude,coordinate1.latitude,coordinate1.longitude,coordinate2.latitude,coordinate2.longitude,coordinate3.latitude,coordinate3.longitude);
AMapCloudPOIPolygonSearchRequest *placePolygon = [[AMapCloudPOIPolygonSearchRequest alloc] init];
[placePolygon setTableID:KSchoolTableID];
NSMutableArray *points = [[NSMutableArray alloc] initWithCapacity:0];
AMapGeoPoint *point1 = [AMapGeoPoint locationWithLatitude:coordinate.latitude longitude:coordinate.longitude];
AMapGeoPoint *point2 = [AMapGeoPoint locationWithLatitude:coordinate1.latitude longitude:coordinate1.longitude];
AMapGeoPoint *point3 = [AMapGeoPoint locationWithLatitude:coordinate2.latitude longitude:coordinate2.longitude];
AMapGeoPoint *point4 = [AMapGeoPoint locationWithLatitude:coordinate3.latitude longitude:coordinate3.longitude];
[points addObject:point1];
[points addObject:point2];
[points addObject:point3];
[points addObject:point4];
[points addObject:point1];
[placePolygon setPolygon:[AMapGeoPolygon polygonWithPoints:points]];
[placePolygon setOffset:70];
[self.search AMapCloudPOIPolygonSearch:placePolygon];
//[self addMAPolygonWithPoints:points];
}
#pragma mark - AMapSearchDelegate
- (void)AMapSearchRequest:(id)request didFailWithError:(NSError *)error {
[self.view makeToast:@"加载失败,请重试!"];
}
- (void)onCloudSearchDone:(AMapCloudSearchBaseRequest *)request response:(AMapCloudPOISearchResponse *)response {
NSLog(@"找学校response.POIs:%@ 学校个数:%ld",response.POIs,response.POIs.count);
[HTXProgressHUD dismiss];
if (response.POIs.count == 0)
{
NSMutableSet *before = [NSMutableSet setWithArray:self.mapView.annotations];
[before removeObject:[self.mapView userLocation]];
/* 删除位于屏幕外的annotation. */
NSMutableSet *toRemove = [NSMutableSet setWithSet:before];
[self.mapView removeAnnotations:[toRemove allObjects]];
[self.view makeToast:@"未搜索到数据"];
return;
}
@synchronized(self)
{
self.shouldRegionChangeReCalculate = NO;
// 清理
[self.selectedPoiArray removeAllObjects];
[self.mapView removeAnnotations:self.mapView.annotations];
[self addAnnotionsWithPOIs:response.POIs];
}
}
- (void)addAnnotionsWithPOIs:(NSArray *)pois {
[self.mapView removeAnnotations:self.mapView.annotations];
for (AMapCloudPOI *aPOI in pois) {
CloudPOIAnnotation *ann = [[CloudPOIAnnotation alloc] initWithCloudPOI:aPOI];
[self.mapView addAnnotation:ann];
}
//[self.mapView showAnnotations:self.mapView.annotations animated:NO];
}
四:根据缩放比例和移动,从云图获取可显示区域的房源数据,并且边移动边重新获取
#pragma mark - MAMapViewDelegate
/**
* 地图移动结束后调用此接口
*
* @param mapView 地图view
* @param wasUserAction 标识是否是用户动作
*/
- (void)mapView:(MAMapView *)mapView mapDidMoveByUser:(BOOL)wasUserAction {
// [self.view makeToast:[NSString stringWithFormat:@"did moved, newCenter = {%f, %f}", self.mapView.centerCoordinate.latitude,
// self.mapView.centerCoordinate.longitude]];
//[self.mapView removeAnnotations:self.mapView.annotations];
if (mapView.zoomLevel > 14 || mapView.zoomLevel == 14) {
NSLog(@"移动的时候获取数据");
[self cloudPlacePolygonSearch];
}
}
/**
* 地图缩放结束后调用此接口
*
* @param mapView 地图view
* @param wasUserAction 标识是否是用户动作
*/
- (void)mapView:(MAMapView *)mapView mapDidZoomByUser:(BOOL)wasUserAction {
// [self.view makeToast:[NSString stringWithFormat:@"new zoomLevel = %.2f", self.mapView.zoomLevel]];
// [self.mapView removeAnnotations:self.mapView.annotations];
if (mapView.zoomLevel < 14) {
[self addAnnotationWithArray:self.districtCountArray];
}else{
// [self cloudLocalSearchWithCity:[UserModel sharedInstance].cityName keyWord:@"全国" page:1 offset:30];
[self cloudPlacePolygonSearch];
}
}
/**
* 单击地图底图调用此接口
*
* @param mapView 地图View
* @param coordinate 点击位置经纬度
*/
- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate {
// [self.view makeToast:[NSString stringWithFormat:@"coordinate = {%f, %f}", coordinate.latitude, coordinate.longitude]];
}
/**
* 长按地图底图调用此接口
*
* @param mapView 地图View
* @param coordinate 长按位置经纬度
*/
- (void)mapView:(MAMapView *)mapView didLongPressedAtCoordinate:(CLLocationCoordinate2D)coordinate {
NSString *msg = [NSString stringWithFormat:@"coordinate = {%f, %f}", coordinate.latitude, coordinate.longitude];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:nil
message:msg
delegate:nil
cancelButtonTitle:@"Ok"
otherButtonTitles:nil];
[alert show];
}