iOS根据坐标数据点所在的坐标区域来动态显示到可视范围

在地图上标注很多点之后,地图的中心点可以设置,但是缩放级别用起来就有点囧了,

所以,就需要根据坐标数据点所在的坐标区域来动态计算,把所有点都刚好显示到地图的可视范围内。

直接上代码:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//清理坐标数据的视图和数据
[_bMapView removeAnnotations:_mapAnnotations];
[_mapAnnotations removeAllObjects];
[_carPointArray removeAllObjects];
//声明解析时对坐标数据的位置区域的筛选,包括经度和纬度的最小值和最大值
CLLocationDegrees minLat;
CLLocationDegrees maxLat;
CLLocationDegrees minLon;
CLLocationDegrees maxLon;
//解析数据
for  ( int  i=0; i<rows.count; i++) {
     NSDictionary  *row = [rows objectAtIndex:i];
     坐标模型类 *item = [[坐标模型类 alloc] initWithJson:row];
     if  (item.vehicleNo && [item.vehicleNo length]>0) {
         标注模型类 *annotation = [[标注模型类 alloc] init];
         annotation.coordinate = item.baiduCoordinate;
         annotation.item = item;
         [_mapAnnotations addObject:annotation];
         [_bMapView addAnnotation:annotation];
         [annotation release];
         
         if  (i==0) {
             //以第一个坐标点做初始值
             minLat = item.baiduCoordinate.latitude;
             maxLat = item.baiduCoordinate.latitude;
             minLon = item.baiduCoordinate.longitude;
             maxLon = item.baiduCoordinate.longitude;
         } else {
             //对比筛选出最小纬度,最大纬度;最小经度,最大经度
             minLat = MIN(minLat, item.baiduCoordinate.latitude);
             maxLat = MAX(maxLat, item.baiduCoordinate.latitude);
             minLon = MIN(minLon, item.baiduCoordinate.longitude);
             maxLon = MAX(maxLon, item.baiduCoordinate.longitude);
         }
         
         [_carPointArray addObject:item];
     }
     [item release];
}
//动态的根据坐标数据的区域,来确定地图的显示中心点和缩放级别
if  (_carPointArray.count > 0) {
     //计算中心点
     CLLocationCoordinate2D centCoor;
     centCoor.latitude = (CLLocationDegrees)((maxLat+minLat) * 0.5f);
     centCoor.longitude = (CLLocationDegrees)((maxLon+minLon) * 0.5f);
     BMKCoordinateSpan span;
     //计算地理位置的跨度
     span.latitudeDelta = maxLat - minLat;
     span.longitudeDelta = maxLon - minLon;
     //得出数据的坐标区域
     BMKCoordinateRegion region = BMKCoordinateRegionMake(centCoor, span);
     //百度地图的坐标范围转换成相对视图的位置
     CGRect fitRect = [_bMapView convertRegion:region toRectToView:_bMapView];
     //将地图视图的位置转换成地图的位置
     BMKMapRect fitMapRect = [_bMapView convertRect:fitRect toMapRectFromView:_bMapView];
     //设置地图可视范围为数据所在的地图位置
     [_bMapView setVisibleMapRect:fitMapRect animated: YES ];
     
}

  

补充:

1
2
3
4
5
6
7
8
9
10
11
MKMapRect zoomRect = MKMapRectNull;
for  ( id  <MKAnnotation> annotation in mapView.annotations) {
     MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
     MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0, 0);
     if  (MKMapRectIsNull(zoomRect)) {
         zoomRect = pointRect;
     else  {
         zoomRect = MKMapRectUnion(zoomRect, pointRect);
     }
}
[mapView setVisibleMapRect:zoomRect animated: YES ];

  

 

 

最后来张效果图:


原文:http://www.cnblogs.com/changbiao/p/3804284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取百度地图可视区域范围数据,你可以使用以下方法: 1. 获取当前地图的中心坐标: ``` CLLocationCoordinate2D centerCoordinate = mapView.centerCoordinate; ``` 2. 获取当前地图的缩放级别: ``` float zoomLevel = mapView.zoomLevel; ``` 3. 计算出当前地图可视区域的四个顶坐标: ``` BMKCoordinateRegion region = BMKCoordinateRegionMakeWithDistance(centerCoordinate, 1000 * pow(2, (21 - zoomLevel)), 1000 * pow(2, (21 - zoomLevel))); CLLocationCoordinate2D topLeftCoordinate = CLLocationCoordinate2DMake(centerCoordinate.latitude + region.span.latitudeDelta / 2.0, centerCoordinate.longitude - region.span.longitudeDelta / 2.0); CLLocationCoordinate2D bottomLeftCoordinate = CLLocationCoordinate2DMake(centerCoordinate.latitude - region.span.latitudeDelta / 2.0, centerCoordinate.longitude - region.span.longitudeDelta / 2.0); CLLocationCoordinate2D topRightCoordinate = CLLocationCoordinate2DMake(centerCoordinate.latitude + region.span.latitudeDelta / 2.0, centerCoordinate.longitude + region.span.longitudeDelta / 2.0); CLLocationCoordinate2D bottomRightCoordinate = CLLocationCoordinate2DMake(centerCoordinate.latitude - region.span.latitudeDelta / 2.0, centerCoordinate.longitude + region.span.longitudeDelta / 2.0); ``` 4. 将四个顶坐标转换成百度地图的墨卡托坐标: ``` BMKMapPoint topLeftPoint = BMKMapPointForCoordinate(topLeftCoordinate); BMKMapPoint bottomLeftPoint = BMKMapPointForCoordinate(bottomLeftCoordinate); BMKMapPoint topRightPoint = BMKMapPointForCoordinate(topRightCoordinate); BMKMapPoint bottomRightPoint = BMKMapPointForCoordinate(bottomRightCoordinate); ``` 5. 计算出当前地图可视区域在百度地图中的矩形区域: ``` BMKMapRect visibleRect = BMKMapRectMake(fmin(topLeftPoint.x, bottomLeftPoint.x), fmin(topLeftPoint.y, topRightPoint.y), fabs(topLeftPoint.x - topRightPoint.x), fabs(topLeftPoint.y - bottomLeftPoint.y)); ``` 6. 将矩形区域转换成经纬度坐标范围: ``` BMKCoordinateRegion visibleRegion = BMKCoordinateRegionForMapRect(visibleRect); CLLocationCoordinate2D visibleTopLeftCoordinate = visibleRegion.center; visibleTopLeftCoordinate.latitude += visibleRegion.span.latitudeDelta / 2.0; visibleTopLeftCoordinate.longitude -= visibleRegion.span.longitudeDelta / 2.0; CLLocationCoordinate2D visibleBottomRightCoordinate = visibleRegion.center; visibleBottomRightCoordinate.latitude -= visibleRegion.span.latitudeDelta / 2.0; visibleBottomRightCoordinate.longitude += visibleRegion.span.longitudeDelta / 2.0; ``` 最终,`visibleTopLeftCoordinate` 和 `visibleBottomRightCoordinate` 就是当前地图可视区域的经纬度坐标范围

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值