对于以下问题系统方法有实现:

过滤不合理点CLLocationCoordinate2DIsValid 就可以搞定。。。。0.0

====================分割线啊分割线===以下活脱重新造了把轮子============================

/**

*  过滤不合理点

*

*  @param locations locations description

*

*  @return return value description

*/

-(NSMutableArray*)getShowAnnotationArr:(NSArray*)locations{

CGFloatminLon = -90;

CGFloatmaxLon = 90;

//解决跨国际日期变更线时跨度计算错误

NSMutableArray*nArr = [NSMutableArrayarrayWithCapacity:0];//东经正

NSMutableArray*wArr = [NSMutableArrayarrayWithCapacity:0];//西经负

//把坐标点按东经和西经分组

[locations enumerateObjectsUsingBlock:^(idobj, NSUIntegeridx, BOOL*stop) {

CLLocation* annotation = locations[idx];

if(fmin(0.0, annotation.coordinate.longitude) == 0) {

[nArr addObject:annotation];

}else{

[wArr addObject:annotation];

}

}];

//最终转换后,可以显示在地图上得点

NSMutableArray*showArr = nil;

//判断按(东、西)经度的两个分组,最少的转成最多的(比如东经少于西经,那么将东经转成西经表示)

if([nArr count] != [wArr count] && [wArr count]>0&& [nArr count]>0) {

NSMutableArray*rangInArr = [NSMutableArrayarrayWithCapacity:0];// 在-90 <=lon<=90 范围内的点

NSMutableArray*rangOutArr = [NSMutableArrayarrayWithCapacity:0];// 在lon <=-90 && lon >=90 范围内的点

//将所有坐标点按上面范围分组

[locations enumerateObjectsUsingBlock:^(idobj, NSUIntegeridx, BOOL*stop) {

CLLocation* annotation = locations[idx];

if(annotation.coordinate.longitude>=minLon && annotation.coordinate.longitude<=maxLon) {

[rangInArr addObject:annotation];

}else{

[rangOutArr addObject:annotation];

}

}];

// 将最少的一组剔除,保留最多的一组。即可以正常显示的点

if([rangOutArr count]

showArr = [rangInArr mutableCopy];

}else{

showArr = [rangOutArr mutableCopy];

}

//清空第一次分组后东西经分组。

[wArr removeAllObjects];

[nArr removeAllObjects];

//重新装入数据(这时是已经过滤了的数据,再次分组按东、西经)

[showArr enumerateObjectsUsingBlock:^(idobj, NSUIntegeridx, BOOL*stop) {

CLLocation* annotation = showArr[idx];

if(fmin(0.0, annotation.coordinate.longitude) == 0) {

[nArr addObject:annotation];

}else{

[wArr addObject:annotation];

}

}];

[showArr removeAllObjects];

if([wArr count] > [nArr count]) {

//将东经转换为西经

[nArr enumerateObjectsUsingBlock:^(idobj, NSUIntegeridx, BOOL*stop) {

CLLocation* annotation = nArr[idx];

CGFloattunrnNLon = 0.0;

if(annotation.coordinate.longitude >=90&& annotation.coordinate.longitude<= 180) {

tunrnNLon =  -180+(annotation.coordinate.longitude - 180);

}else{

tunrnNLon = annotation.coordinate.longitude;

}

CLLocation *newLoctaion = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:tunrnNLon];

[wArr addObject:newLoctaion];

}];

showArr = wArr;

}else{

//将西经转换为东经

[wArr enumerateObjectsUsingBlock:^(idobj, NSUInteger idx, BOOL*stop) {

CLLocation * annotation = wArr[idx];

CGFloat tunrnWLon = 0.0;

/**

*  转换规则

*  如果西经在w<=0 && w>=-90 则东经一定在0<= n <=90 则不需要处理。

*  相反-90<= w <=-180  时,则东经一定在90<= n <= 180 需要处理,把西经转换为东经。

*  因为如果不转换在算经度跨度(maxW - minW)*系数会>= 180。则地图显示不出,会崩掉。

*/

if(annotation.coordinate.longitude <=0&& annotation.coordinate.longitude>=-90) {//

tunrnWLon = annotation.coordinate.longitude;

}else{

tunrnWLon = 180+(180+annotation.coordinate.longitude);

}

CLLocation *newLoctaion = [[CLLocation alloc] initWithLatitude:annotation.coordinate.latitude longitude:tunrnWLon];

[nArr addObject:newLoctaion];

}];

//转换后的点(都是以东经表示的电,即都是正数)

showArr = nArr;

}

}else{

showArr = [NSMutableArray arrayWithArray:locations] ;

}

returnshowArr;

}

说明:

原算法在大部分情况下效果不错。但有个bug .

region.span.latitudeDelta = fabs(topLeftCoord.latitude - bottomRightCoord.latitude) * 1.1;

// Add a little extra space on the sides

region.span.longitudeDelta = fabs(bottomRightCoord.longitude - topLeftCoord.longitude) * 1.1;

这段代码如果在计算的数组里包含  西经-175 东经175的情况下就会奔溃。原因是地图只能显示 经度跨度小于或等于180的区域。参与计算后结果会大于180.

region =[mapView regionThatFits:region];

执行后也依然如此。

纬度则不会出现这种情况。北纬90 到 南纬-90 怎么也不会出现大于180 的纬度跨度出现。

即如果数组里有跨国际日期变更线 的坐标点存在时。就会出现这种情况。如新西兰 就是个跨国际日期变更线的国家

国际日期变更线(西经-180 和 东经180 重合的那条线 ),可以理解地球被 经度0 和国际日期变更线所绕的”圆“ 切成东西半球。

我得解决办法是 将数组安 东经(+)和 西经(-)分组。比较count 。如果东经 的坐标点 大于西经。则转换 西经为 ”东经“(一个正数)。

如: 西经 -176  转东经 为 180+(180+(-176))。是的,按照东经的增长顺序  将西经转换成一个大于180的 正数。然后参与计算。并平均出来。

东经转西经也是同样道理。

改进后对于大多数 情况下新算法 显示正常。即使是跨国际日期变更线。但是 依然有些情况下会超出 180在最后计算出得经度跨度值。

例如:

一个 西经-40 的点  和  东经176 的点。

计算出来 经度跨度依然会大于 180.

郁闷了一段时间,发现了个规律。

就是显示的区域要么在

-90 ~0~90

-180 ~0

0~180

想象一个球,你均匀的切两刀(竖着切没有切开)变成4瓣。旋转这个球每次旋转90度。就会出现上面的假设。

在遵循上面假设的前提下,如果你要看 东经 90到180这个跨度里的任一点,和 西经 -90到0这个跨度里的任一点。即 连个不是相邻的连个瓣你需要”透视眼“。没办法在平面上显现在。

所有根据这个原理,我把不属于-90 ~0~90的点和 属于这个区域的点分开。

剔除不属于这个区域的点,就是最后可以正常显示在地图上且经度跨度不会超过180 。

....貌似有点稀里糊涂。希望有地理帝 给指点一二,说说其中原理。和这个算法的正确与否。

目前项目中这个算法运行良好,有不同建议欢迎讨论。

android 高德地图范围圆圈公里_根据坐标点显示地图显示范围(高德地图)相关推荐

  1. 后端根据百度地图真实路径距离_导航软件哪家强?实测百度地图and高德地图哪个更靠谱...

    随着社会的不断发展,人们的生活越来越离不开地图导航,无论是开车出行还是到去到陌生的地方,我们都会用到手机地图.然而在众多导航软件中,使用最为广泛的就要属百度地图和高德地图了.但别看都是导航软件,其中差 ...

  2. 百度地图多点路线规划_通勤出行该选谁?高德、百度地图对比,看看谁是上班最优选...

    现在导航已经成为我们生活中不可分割的一部分,无论是走路,骑行还是自驾游,我们都会开启导航.特别是在驾车时,有急转弯,测速拍照,超速等,当我们的驾驶方式出现危险行为的时候,导航都能够提醒我们.极大提升了 ...

  3. python在地图上画路线_使用Python和Perl绘制北京跑步地图

    当你在一个城市,穿越大街小巷,跑步跑了几千公里之后,一个显而易见的想法是,如果能把在这个城市的所有路线全部画出来,会是怎样的景象呢? 文章代码比较多,为了不吊人胃口,先看看最终效果,上到北七家,下到南 ...

  4. 接入高德开放平台实现地址转换为经纬度坐标

    高德地图API 1 地址转为经纬度 后台人员填写完房源详情地址后,由此地址转为,电子地图中的经纬度.从而方便日后前台在电子地 图中的标识显示. 高德地图开放平台:https://lbs.amap.co ...

  5. 百度地图之根据显示范围获取地图图片

    根据地图可视经纬度查询区域范围 示例如下: //根据显示范围获得地图图片function getMapImg(succfun){//var m=Math.pow(10, 8); //根据地图可视经纬度 ...

  6. android 高德地图移动卡顿_高德、百度和腾讯三家比拼,哪个 Android 车机地图 App 更好用?...

    写在前面 不管是自己开车.还是平时打车,相信你一定留意过驾驶座旁边位于车辆中间的那块大屏幕,不管是平时开车导航.放音乐,还是通过倒车影像辅助倒车,都离不开这块屏幕,这就是中控车机. 中控车机往往搭载的 ...

  7. android 高德地图移动卡顿_高德地图4.8和百度地图3.1的抉择,如何发送地址到车机(下载失效本帖奉上百度云盘)...

    9月已经过去半个月了,升级一直围绕着领克车友,8月的兴奋,总想知道车机有什么改变,很多车友提前去预约,总想尝第一口鲜,这个第一口可不好喝,头啖汤随好,但会烫口,于是我带着观望的态度,因为我始终觉得,安 ...

  8. 高德地图各种摄像头图标_高德地图Overlay的应用以及照相功能的实现

    暑假第二十一天,今天天气有点小热,长时间对着电脑眼睛还真有点不适应,下午刚刚出地下室吃饭的时候,两眼眺望了一下远方,就感觉小有压力,眼睛和头都有点不舒服,哎!程序员真苦逼啊!!!伤不起的还是我们这群程 ...

  9. 高德地图去掉定位按钮_高德地图自定义定位按钮及点击事件

    最近使用了一下高德地图,使用期间将出现的问题记录一下.文中出现不对的地方,悉听各路大神指正.2018年11月23日15:59:46 1.首先我们初始化map控制对象aMap .if (aMap ==n ...

最新文章

  1. 原生、无依赖的web弹层组件——HLayer.js
  2. 关于Android中的乱码
  3. Spark配置高可用(HA)
  4. LeetCode10.正则表达式匹配 JavaScript
  5. emulator: ERROR: x86 emulation currently requires hardware acceleration!
  6. java 链表 实现
  7. 谁需要这件礼物?每一个爱学习的人!
  8. Sublime Text3搭建go运行环境
  9. 用Hough投票做物体检测的3篇文献
  10. java属性和普通方法
  11. 基于STM32的小说阅读器
  12. 夏普利模型在衡量团队成员价值中的思考
  13. python累乘累加_Python3 实现列表元素求累和,求累乘
  14. 采访了“996背后的那些人”:孤立无援,进退两难
  15. Android 短信数据库详细总结分析
  16. 打印乘法口诀表(两种方法)
  17. 微信小程序实现跑马灯效果(完整代码)
  18. 好的APP用户体验需要满足这5点要求,你做到了吗?
  19. 敏捷(Agile)是什么?--参加优普丰CSM认证培训有感
  20. 软件工程导论第3章习题答案

热门文章

  1. 计算机打印途中卡住,联想打印机经典故障处理方法
  2. 仿射密码加密解密代码(java)
  3. 《计算机网络技术》第三章课后习题答案(全)
  4. 云堡垒机和传统堡垒机对比
  5. 回归分析regression analysis
  6. Mysql 中的各种“删除”。删除数据库、删除表、删除字段
  7. 【导数术】9.指对互化和指对同构
  8. 亚像素(Pixel)
  9. Python斐波那契数列算法
  10. 多重假设检验:Bonferroni 和 FDR