地图 SDK 系列教程-在地图上展示指定区域(转载)
腾讯位置服务地图SDK是一套提供多种地理位置服务的应用程序接口。通过调用该接口,开发者可以在自己的应用中加入地图相关的功能(如地图展示、标注、绘制图形等),轻松访问腾讯地图服务和数据,构建功能丰富、交互性强、符合各种行业场景的地图类应用程序。以下内容转载自iOS 工程师Genosage的文章《地图 SDK 系列教程-在地图上展示指定区域》
作者:Genosage链接:https://juejin.im/post/5d721a29f265da03970bdc8d来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
地图SDK系列教程-在地图上展示指定区域
在使用腾讯 iOS 地图 SDK 的过程中,经常会遇到需要地图展示指定区域的场景,相信大家也会遇到类似的情况,地图 SDK 提供了许多与之相关的接口,本篇文章将对这些接口进行整合,并提供示例代码来实现多个场景下展示指定区域的需求。
需要注意,本篇文章适用于地图未发生旋转与俯仰角的场景。
下载腾讯 iOS 地图 SDK 请前往:iOS 地图 SDK
指定区域包含单个坐标点
在地图上显示某个固定的坐标点是地图 SDK 最为基础的功能之一。
举例来说,我们根据 SDK 的检索功能得到了天坛公园的坐标 (39.881190,116.410490),接下来,我们可以通过设置地图的中心点 centerCoordinate 来让地图显示这个坐标,同时我们还可以设置 zoomLevel 来指定缩放级别:
// 设置中心点
self.mapView.centerCoordinate = CLLocationCoordinate2DMake(39.881190,116.410490); // 设置缩放级别
self.mapView.zoomLevel = ;
显示效果如下:
如果想展示墨卡托坐标点 QMapPoint 则需要先通过方法 QCoordinateForMapPoint(QMapPoint mapPoint) 将墨卡托坐标转换为经纬度再进行设置。
指定区域包含多个坐标点
现在,假如我们想把天坛公园的搜索结果都显示在地图上,应该如何实现呢?
首先,我们通过检索功能搜索天坛公园,取搜索结果的前九个坐标点,接下来,应该使我们的地图视野包含这九个坐标点,地图 SDK 提供了方法 QBoundingCoordinateRegionWithCoordinates(CLLocationCoordinate2D *coordinates, NSUInteger count) 来计算多个经纬度坐标点的最小外接矩形 QCoordinateRegion 在得到了外接矩形之后,我们可以直接设置地图的 region 来使其显示我们想要的区域,完整代码如下:
CLLocationCoordinate2D coordinates[]; // 天坛公园检索结果坐标
coordinates[] = CLLocationCoordinate2DMake(39.881190,116.410490);
coordinates[] = CLLocationCoordinate2DMake(39.883247,116.400063);
coordinates[] = CLLocationCoordinate2DMake(39.883710,116.412900);
coordinates[] = CLLocationCoordinate2DMake(39.883654,116.412863);
coordinates[] = CLLocationCoordinate2DMake(39.883320,116.400040);
coordinates[] = CLLocationCoordinate2DMake(39.876980,116.413190);
coordinates[] = CLLocationCoordinate2DMake(39.878160,116.413140);
coordinates[] = CLLocationCoordinate2DMake(39.878980,116.407080);
coordinates[] = CLLocationCoordinate2DMake(39.878560,116.413160); // 计算区域外接矩形
QCoordinateRegion region = QBoundingCoordinateRegionWithCoordinates(coordinates, ); // 设置区域
self.mapView.region = region;
显示效果如下:
指定中心点
如果我们想显示这九个坐标点的同时指定某个坐标点为地图中心点,可以使用方法 QBoundingCoordinateRegionWithCoordinatesAndCenter(CLLocationCoordinate2D *coordinates, NSUInteger count, CLLocationCoordinate2D centerCoordinate) 来计算最小外接矩形,以天坛公园为中心点举例,相关代码如下:
// 中心点坐标
CLLocationCoordinate2D centerCoordinate = CLLocationCoordinate2DMake(39.881190,116.410490); // 计算以中心点为中心的区域外接矩形
QCoordinateRegion region = QBoundingCoordinateRegionWithCoordinatesAndCenter(coordinates, , centerCoordinate); // 设置区域
self.mapView.region = region;
显示效果如下:
嵌入四周边界
如果需要在地图视野四周嵌入一些边界,可以使用方法 - (void)setRegion:(QCoordinateRegion)region edgePadding:(UIEdgeInsets)insets animated:(BOOL)animated 对地图的 region 进行设置,代码如下:
// 计算区域外接矩形
QCoordinateRegion region = QBoundingCoordinateRegionWithCoordinates(coordinates, ); // 设置区域与边界
[self.mapView setRegion:region edgePadding:UIEdgeInsetsMake(, , , ) animated:NO];
显示效果如下:
墨卡托坐标点
如果需要展示多个墨卡托坐标点,可以使用地图 SDK 提供的与上述方法对应的 QBoundingMapRectWithPoints(QMapPoint *points, NSUInteger count) 和 - (void)setVisibleMapRect:(QMapRect)mapRect edgePadding:(UIEdgeInsets)insets animated:(BOOL)animated 等方法。
折线与覆盖物
当我们想在地图中展示路线或者覆盖物时,即地图 SDK 中的 QPolyline QPolygon 和 QCircle,我们可以直接获得他们的属性 boundingMapRect 再进行设置即可。
指定区域包含多个标注
在很多场景下,我们需要在地图上添加标注点 (Annotation) 并且自定义这些标注的 Image,如下所示:
我们可以通过下面的代码来使这些标注刚好显示在地图视野内:
// 计算包含 Annotation 与 MapRect 的外接矩形
QMapRect rect = [self.mapView mapRectThatFits:QMapRectNull containsCalloutView:NO annotations:self.annotations edgePadding:UIEdgeInsetsZero]; // 设置区域
self.mapView.visibleMapRect = rect;
显示效果如下:
当标注显示 Callout View 时,我们可以通过传入参数 bContainsCalloutView 为 YES 来将 Callout View 包含在地图视野内,显示效果如下:
有时我们需要指定区域同时包含当前的屏幕视野以及所有的标注,我们可以通过传入第一个参数 mapRect 为 self.mapView.visibleMapRect 来达到我们想要的效果。
限制展示指定的区域
当我们需要限制地图视野,使其只显示我们指定的区域时,以故宫举例,可以通过如下的代码进行设置:
CLLocationCoordinate2D coordinates[]; // 故宫范围矩形的四个顶点的经纬度坐标
coordinates[] = CLLocationCoordinate2DMake(39.922878,116.391547);
coordinates[] = CLLocationCoordinate2DMake(39.912917,116.392100);
coordinates[] = CLLocationCoordinate2DMake(39.913312,116.402507);
coordinates[] = CLLocationCoordinate2DMake(39.923277,116.402024); // 计算区域外接矩形
QCoordinateRegion region = QBoundingCoordinateRegionWithCoordinates(coordinates, ); // 计算平面投影矩形
QMapRect rect = QMapRectForCoordinateRegion(region); // 限制展示区域
[self.mapView setLimitMapRect:rect mode:QMapLimitRectFitWidth];
显示效果如下:
地图 SDK 系列教程-在地图上展示指定区域(转载)的更多相关文章
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- Android百度地图SDK 导航初始化和地图初始化引起的冲突
如题,相同是百度地图SDK开发过程中遇到的一个问题.交代下背景: 开发了一款内嵌百度地图的应用,因此里面差点儿相同将眼下百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示.POI搜索,行 ...
- 百度地图Api进阶教程-基础地图示例1.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- SpringMVC 系列教程1-文件上传-配置
SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...
- 将Imagelist里的图像复制到TCanvas上的指定区域
function Tdmd.Draw_Image_In_Rect(C:TCanvas;R:TRect;i:integer):boolean;var tr:TRect;begin if i< ...
- Android集成百度地图SDK
本Demo中所含功能 1:定位,显示当前位置 2:地图多覆盖物(地图描点.弹出该点的具体信息) 3:坐标地址互相换算 4:POI兴趣点检索 5:线路查询(步行,驾车,公交) 6:绘制线路(OpenGL ...
- 使用百度地图SDK 这是之前版本 现在的sdk v2-1-2使用方法完全改变
1.添加BMapApiDemoApp.java 2.AndroidManifest文件 application里添加 android:name=".ui.BMapApiDemoApp&q ...
- 百度地图开发-引入地图SDK并配置 02
百度地图开发-引入地图SDK并配置 02 通过上一篇文章的介绍,基本了解百度地图的基本信息,接下来就让我们一起来实际在项目中操作,显示出地图. 01 引入地图SDK 首先需要新建一个空白的Androi ...
- ASP.NET MVC3 系列教程 - 目录
ASP.NET MVC3 系列教程 - 目录 I:ASP.NET MVC3 新增的功能 ASP.NET MVC3 系列教程 - Razor视图引擎基础语法ASP.NET MVC3 系列教程 - V ...
随机推荐
- 5G,仅仅是更快的网速吗?
前不久参加了华为的Dev Summit 2020开发者大会,听到了关于5G的一些分享,刚好最近对5G有一些自己的思考,在此分享给大家. 什么是5G 在这里我不想列举各种晦涩难懂的术语,简单说来,5G就 ...
- Evevt Loop 事件循环
目录 JavaScript 是一门单线程的语言 一.什么是event Loop的执行机制 练习 异步任务-setTimeout 练习1: 练习2: 练习3: 练习4: 二 事件队列作用 同步任务 例1 ...
- 记录我的 python 学习历程-Day06 is id == / 代码块 / 集合 / 深浅拷贝
一.is == id 用法 在Python中,id是内存地址, 你只要创建一个数据(对象)那么就会在内存中开辟一个空间,将这个数据临时加载到内存中,这个空间有一个唯一标识,就好比是身份证号,标识这个空 ...
- Linux---centos7.0安装、配置
参考:https://blog.csdn.net/qq_37057095/article/details/81240450
- wxxcx_learn独立验证与REST
模块,控制器,方法 validate 接口参数校验 独立验证(验证器对独立验证做了更好的封装) $date = [ 'name' => '111', 'email' => '123@qq ...
- 【Spring MVC】Properties文件的加载
[Spring MVC]Properties文件的加载 转载:https://www.cnblogs.com/yangchongxing/p/10726885.html 参考:https://java ...
- Java并发线程池到底设置多大?
前言 在我们日常业务开发过程中,或多或少都会用到并发的功能.那么在用到并发功能的过程中,就肯定会碰到下面这个问题 并发线程池到底设置多大呢? 通常有点年纪的程序员或许都听说这样一个说法 (其中 N 代 ...
- Linux 怎么清理缓存
linux清理缓存的命令 查看缓存的命令 free -m 清理缓存的命令 echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/v ...
- django基础之day08,分页器从无到有,动态思路解析全过程
*********分页器从无到有的全过程,动态思路解析如下:******** 1.通过book_queryset = models.Book.objects.all()[start_num:end_n ...
- QQ音乐接口api,包括付费音乐、无损音乐、高品质音乐地址解析接口api
QQ音乐网站所有音乐(包括付费.无损等版权音乐解析接口地址url). mp3 普通高品 http://dl.stream.qqmusic.qq.com/M5000012gqVh4fFvVK.mp3?v ...