腾讯位置服务地图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 系列教程-在地图上展示指定区域(转载)的更多相关文章

  1. Web攻防系列教程之文件上传攻防解析(转载)

    Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...

  2. Android百度地图SDK 导航初始化和地图初始化引起的冲突

    如题,相同是百度地图SDK开发过程中遇到的一个问题.交代下背景: 开发了一款内嵌百度地图的应用,因此里面差点儿相同将眼下百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示.POI搜索,行 ...

  3. 百度地图Api进阶教程-基础地图示例1.html

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  4. SpringMVC 系列教程1-文件上传-配置

    SpringMVC默认没有配置上传解析器 使用SpringMVC来处理上传必须添加对MultipartResolver上传解析器的声明配置. 配置之后,客户端每次进行请求的时候,SpringMVC都会 ...

  5. 将Imagelist里的图像复制到TCanvas上的指定区域

    function Tdmd.Draw_Image_In_Rect(C:TCanvas;R:TRect;i:integer):boolean;var  tr:TRect;begin    if i< ...

  6. Android集成百度地图SDK

    本Demo中所含功能 1:定位,显示当前位置 2:地图多覆盖物(地图描点.弹出该点的具体信息) 3:坐标地址互相换算 4:POI兴趣点检索 5:线路查询(步行,驾车,公交) 6:绘制线路(OpenGL ...

  7. 使用百度地图SDK 这是之前版本 现在的sdk v2-1-2使用方法完全改变

    1.添加BMapApiDemoApp.java 2.AndroidManifest文件  application里添加  android:name=".ui.BMapApiDemoApp&q ...

  8. 百度地图开发-引入地图SDK并配置 02

    百度地图开发-引入地图SDK并配置 02 通过上一篇文章的介绍,基本了解百度地图的基本信息,接下来就让我们一起来实际在项目中操作,显示出地图. 01 引入地图SDK 首先需要新建一个空白的Androi ...

  9. ASP.NET MVC3 系列教程 - 目录

    ASP.NET MVC3 系列教程 - 目录   I:ASP.NET MVC3 新增的功能 ASP.NET MVC3 系列教程 - Razor视图引擎基础语法ASP.NET MVC3 系列教程 - V ...

随机推荐

  1. luogu P1566 加等式

    题目描述 对于一个整数集合,我们定义"加等式"如下:集合中的某一个元素可以表示成集合内其他元素之和.如集合{1,2,3}中就有一个加等式:3=1+2,而且3=1+2 和3=2+1是 ...

  2. 记一次Elasticsearch OOM的优化过程——基于segments force merge 和 store type 转为 niofs

    首选,说明笔者的机器环境(不结合环境谈解决方案都是耍流氓): cpu 32核,内存128G,非固态硬盘: RAID0 (4T * 6),单节点,数据量在700G到1800G,索引15亿~21亿.敖丙大 ...

  3. Xcode 10 Error: Multiple commands produce

    目录 Xcode 9.4.1运行react-native 可以,但是在Xcode 10运行报错,报错信息如下: 解决方法 1. 选择 File > Project Settings (或者 Fi ...

  4. [TimLinux] CPU 常见架构介绍

    1. 简介 系统性能依赖硬件架构,CPU架构决定了硬件的布局.常见的CPU架构:SMP, NUMA, MPP. 2. SMP(对称多处理器) SMP:Symmetric Multiprocessing ...

  5. 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 ...

  6. Django开发登录功能实战

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:凡夫俗子66 Django 如果是定义函数写登录路由,需要判断请求方法 ...

  7. 一遍文章搞清楚VO、DTO、DO、PO的概念、区别

    作者:Cat Qi 概念: VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来. DTO(Data Transfer Object):数据传输对 ...

  8. cygwin报错 /bin/bash: Operation not permitted

    如题,使用Cygwin过程中本来好好的,突然就不能登录了,每个用户登录都报错 /bin/bash: Operation not permitted.开始也以为是没有权限之类的,重装弄了很久也不行.后面 ...

  9. SpringBoot微服务电商项目开发实战 --- Kafka集成接入

    kafka作为消息中间件的一款产品,她比较轻量级,在吞吐量方面很优秀,默认消息持久化到硬盘当中 168小时=7天,log.retention.hours=168,比较适合来做运营的统计.其他的不多讲, ...

  10. Another git process seems to be running in this repository

    今天在推送项目的时候git突然报如题的错误.查了一下是由于git被另外一个程序占用,产生原 原因在于Git在使用过程中遭遇了崩溃,部分被上锁资源没有被释放. 解决方案也很简单,在git中找到对应的in ...