地图 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 ...
随机推荐
- luogu P1566 加等式
题目描述 对于一个整数集合,我们定义"加等式"如下:集合中的某一个元素可以表示成集合内其他元素之和.如集合{1,2,3}中就有一个加等式:3=1+2,而且3=1+2 和3=2+1是 ...
- 记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs
首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大 ...
- Xcode 10 Error: Multiple commands produce
目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...
- [TimLinux] CPU 常见架构介绍
1. 简介 系统性能依赖硬件架构,CPU架构决定了硬件的布局.常见的CPU架构:SMP, NUMA, MPP. 2. SMP(对称多处理器) SMP:Symmetric Multiprocessing ...
- LightOJ 1253 Misere NIM(反NIM博弈)
Alice and Bob are playing game of Misère Nim. Misère Nim is a game playing on k piles of stones, eac ...
- Django开发登录功能实战
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...
- 一遍文章搞清楚VO、DTO、DO、PO的概念、区别
作者:Cat Qi 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对 ...
- cygwin报错 /bin/bash: Operation not permitted
如题,使用Cygwin过程中本来好好的,突然就不能登录了,每个用户登录都报错 /bin/bash: Operation not permitted.开始也以为是没有权限之类的,重装弄了很久也不行.后面 ...
- SpringBoot微服务电商项目开发实战 --- Kafka集成接入
kafka作为消息中间件的一款产品,她比较轻量级,在吞吐量方面很优秀,默认消息持久化到硬盘当中 168小时=7天,log.retention.hours=168,比较适合来做运营的统计.其他的不多讲, ...
- Another git process seems to be running in this repository
今天在推送项目的时候git突然报如题的错误.查了一下是由于git被另外一个程序占用,产生原 原因在于Git在使用过程中遭遇了崩溃,部分被上锁资源没有被释放. 解决方案也很简单,在git中找到对应的in ...