實現(xiàn)效果:
實現(xiàn)思路:
一:后臺獲取每個區(qū)的數(shù)據(jù)
-(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展示各區(qū)數(shù)據(jù)尔当,并且支持點擊放大
- (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;
用戶滑動時田盈,保留仍然可用的標(biāo)注缴阎,去除屏幕外標(biāo)注蛮拔,添加新增區(qū)域的標(biāo)注
[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(@" 原點的經(jīng)緯度 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(@" 四個角的經(jīng)緯度 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(@"找學(xué)校response.POIs:%@ 學(xué)校個數(shù):%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:@"未搜索到數(shù)據(jù)"];
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];
}
四:根據(jù)縮放比例和移動妒挎,從云圖獲取可顯示區(qū)域的房源數(shù)據(jù)西饵,并且邊移動邊重新獲取
#pragma mark - MAMapViewDelegate
/**
*? 地圖移動結(jié)束后調(diào)用此接口
*
*? @param mapView? ? ? 地圖view
*? @param wasUserAction 標(biāo)識是否是用戶動作
*/
- (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(@"移動的時候獲取數(shù)據(jù)");
[self cloudPlacePolygonSearch];
?}
}
/**
*? 地圖縮放結(jié)束后調(diào)用此接口
*
*? @param mapView? ? ? 地圖view
*? @param wasUserAction 標(biāo)識是否是用戶動作
*/
- (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];
?}
}
/**
*? 單擊地圖底圖調(diào)用此接口
*
*? @param mapView? ? 地圖View
*? @param coordinate 點擊位置經(jīng)緯度
*/
- (void)mapView:(MAMapView *)mapView didSingleTappedAtCoordinate:(CLLocationCoordinate2D)coordinate {
//? ? [self.view makeToast:[NSString stringWithFormat:@"coordinate =? {%f, %f}", coordinate.latitude, coordinate.longitude]];
}
/**
*? 長按地圖底圖調(diào)用此接口
*
*? @param mapView? ? 地圖View
*? @param coordinate 長按位置經(jīng)緯度
*/
- (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];
}