ios 高德地图加载瓦片地图_IOS 高德地图 API 加载 WMS 服务

IOS 高德地图 API 加载 WMS 服务

本文主要介绍通过自定义高德地图 MATileOverlay 接口,添加 WMS 服务到地图上。废话少说,先贴代码。

代码

自定义类 WMSTileOverlayUtil,继承自高德地图接口 MATileOverlay,主要重载函数:

- (NSURL *)URLForTilePath:(MATileOverlayPath)path;

- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result;,见代码注释。

#import

#import

@interface WMSTileOverlayUtil : MATileOverlay

- (id)initWithRootURL:(NSString *)rootRUL;

/**

* @brief 以tile path生成URL。用于加载tile,此方法默认填充URLTemplate

* @param path tile path

* @return 以tile path生成tileOverlay

*/

- (NSURL *)URLForTilePath:(MATileOverlayPath)path;

@end

#import "WMSTileOverlayUtil.h"

#import

#import

#import

#import "Api.h"

@implementation WMSTileOverlayUtil

{

NSString * rootURL;

NSInteger titleSize; // = 256

double initialResolution; // = 156543.03392804062;//2*Math.PI*6378137/titleSize;

double originShift; // = 20037508.342789244;//2*Math.PI*6378137/2.0; 周长的一半

double HALF_PI; // = Math.PI / 2.0;

double RAD_PER_DEGREE; // = Math.PI / 180.0;

double METER_PER_DEGREE; // = originShift / 180.0;//一度多少米

double DEGREE_PER_METER; // = 180.0 / originShift;//一米多少度

}

- (id)initWithRootURL:(NSString *)rootRUL {

self = [super init];

if (self) {

rootURL = rootRUL;

titleSize = 256;

initialResolution = 156543.03392804062;

originShift = 20037508.342789244;

HALF_PI = M_PI_2;

RAD_PER_DEGREE = M_PI / 180.0;

METER_PER_DEGREE = originShift / 180.0;

DEGREE_PER_METER = 180.0 / originShift;

}

return self;

}

/**

* @brief 以tile path生成URL。用于加载tile,此方法默认填充URLTemplate

* @param path tile path

* @return 以tile path生成tileOverlay

*/

- (NSURL *)URLForTilePath:(MATileOverlayPath)path {

NSString * strURL = [[NSString alloc] initWithFormat:@"%@%@", rootURL, [self titleBoundsByX:path.x

Y:path.y

Z:path.z]];

NSURL * url = [NSURL URLWithString:strURL];

return url;

}

/**

* @brief 加载被请求的tile,并以tile数据或加载tile失败error访问回调block;默认实现为首先用URLForTilePath去获取URL,然后用异步NSURLConnection加载tile

* @param path tile path

* @param result 用来传入tile数据或加载tile失败的error访问的回调block

*/

- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result {

if (path.z < 8) return;

NSURL * url = [self URLForTilePath:path];

NSString * strURL = url.absoluteString;

SuccessCallback successCallback = ^(id responseObject) {

UIImage * image = [UIImage imageWithData:responseObject];

NSData * data = UIImagePNGRepresentation(image);

result(data, nil);

};

FailureCallBack failureCallBack = ^(NSError *error) {

result(nil, error);

};

[Api GETWMSWith:strURL successCallback:successCallback failureCallBack:failureCallBack];

}

/**

* @brief 取消请求瓦片,当地图显示区域发生变化时,会取消显示区域外的瓦片的下载, 当disableOffScreenTileLoading=YES时会被调用。since 5.3.0

* @param path tile path

*/

- (void)cancelLoadOfTileAtPath:(MATileOverlayPath)path {

[super cancelLoadOfTileAtPath:path];

}

/**

* 根据瓦片的x/y等级返回瓦片范围

*

* @param tx x

* @param ty y

* @param zoom z

* @return url

*/

- (NSString *)titleBoundsByX:(NSInteger)tx Y:(NSInteger)ty Z:(NSInteger)zoom {

double minX = [self pixels2Meters:(tx * titleSize) zoom:zoom];

double maxY = -[self pixels2Meters:(ty * titleSize) zoom:zoom];

double maxX = [self pixels2Meters:((tx + 1) * titleSize) zoom:zoom];

double minY = -[self pixels2Meters:((ty + 1) * titleSize) zoom:zoom];

// 转换成经纬度 高德坐标系经纬度

minX = [self meters2Lon:minX];

minY = [self meters2Lat:minY];

maxX = [self meters2Lon:maxX];

maxY = [self meters2Lat:maxY];

// 转换成 gps 坐标系经纬度

CLLocationCoordinate2D gps_min = [LocationUtil GCJ02ToWGS84:CLLocationCoordinate2DMake(minY, minX)];

CLLocationCoordinate2D gps_max = [LocationUtil GCJ02ToWGS84:CLLocationCoordinate2DMake(maxY, maxX)];

minY = gps_min.latitude;

minX = gps_min.longitude;

maxY = gps_max.latitude;

maxX = gps_max.longitude;

NSString * result = [[NSString alloc] initWithFormat:@"%f,%f,%f,%f&width=256&height=256", minX, minY, maxX, maxY];

return result;

}

/**

* 根据像素、等级算出坐标

*

* @param p p

* @param zoom z

* @return double

*/

- (double)pixels2Meters:(NSInteger)p zoom:(NSInteger)zoom {

return p * [self resolution:zoom] - originShift;

}

/**

* 计算分辨率

*

* @param zoom z

* @return double

*/

- (double)resolution:(NSInteger)zoom {

return initialResolution / (pow(2, zoom));

}

/**

* X米转经纬度

*/

- (double)meters2Lon:(double)mx {

double lon = mx * DEGREE_PER_METER;

return lon;

}

/**

* Y米转经纬度

*/

- (double)meters2Lat:(double)my {

double lat = my * DEGREE_PER_METER;

lat = 180.0 / M_PI * (2 * atan(exp(lat * RAD_PER_DEGREE)) - HALF_PI);

return lat;

}

@end

其中,- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result; 函数中,使用自己写的 网络访问层去请求 wms 服务,并通过 result 函数贴到地图上。你也可以 改写成自己的网络访问层。

有关 gcj02 转 gps 请查看 请随手点赞

问题

为啥要重载 - (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result; 函数,因为只是从载 - (NSURL *)URLForTilePath:(MATileOverlayPath)path; 生成 NSURL 后,loadTileAtPath 函数会去通过网络请求加载 wms 服务,然而,这一步网络请求会报错:NSURLConnection -errorcode -1004,且一个星期没有解决为啥报错,所以只得重写,如果有熟悉高德地图 api 的小伙伴能够给予解答,不胜感激。

注意

如果使用 AFNetworking 要注意修改支持的类型:

AFHTTPSessionManager * manager = [[AFHTTPSessionManager alloc] init];

AFHTTPResponseSerializer *serializer=[AFHTTPResponseSerializer serializer];

serializer.acceptableContentTypes = [NSSet setWithObject:@"image/png"];

manager.responseSerializer = serializer;

转载自:https://blog.csdn.net/Bear_861110453/article/details/81564605

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 命令之 iwlist 命令-从无线网卡获取更详细的无线信息

文章目录介绍常用选项命令示例介绍 iwlist 命令用于对 /proc/net/wireless 文件进行分析&#xff0c;得出无线网卡相关信息。 常用选项 选项说明scanning搜索当前无线网络frequen显示频道信息rate显示连接速度power显示电源模式txpower显示功耗retry显示重试连接次数(网络不…

drools dmn_DMN 1.1 XML:从建模到使用Drools 7.0的自动化

drools dmn我是一名自由顾问&#xff0c;但今天我是一名博士生。 本文的全球背景是企业架构&#xff08;EA&#xff09;&#xff0c;它需要对企业进行建模。 由于EA的一个方面是业务流程建模&#xff0c;所以我使用BPMN已有数年之久&#xff0c;但是这种表示法并不十分适合表示…

矩阵期望 matlab,matlab中矩阵元素求和、求期望和均方差

在matlab中求一个矩阵中元素的和可以自己编写for循环来完成&#xff0c;这样比较方便&#xff0c;想求那些数据的和都可以做到&#xff0c;然而效率比较低&#xff0c;如果数据量大程序会跑好长时间。所以我们可以转而用matlab提供的sum函数。设M为一个矩阵&#xff0c;那么&am…

python默认字体大小_python – 如何设置PIL加载的默认字体的大小,使其适合我的8×8矩阵?...

我正在努力在88矩阵显示器上显示文本,而且我没有在我的BeagleBone上知道的.ttf文件.根据示例here,我应该能够说font ImageFont.load_default()而不是加载.ttf,但是,这显然不是指定字体的尺寸&#xff01;有什么办法吗&#xff1f;或者,是否有一个地方你知道我可以在我的BBB版本…

Linux 命令之 tcpdump -- 监听网络流量

文章目录命令介绍参考文档命令介绍 tcpdump 命令是一款 sniffer 工具&#xff0c;是 Linux 上的抓包工具&#xff0c;嗅探器&#xff1b;它可以打印出所有经过网络接口的数据包的头信息。 tcpdump 命令工作时先要把网卡的工作模式切换到混杂模式。所以 tcpdump 命令需要以 ro…

java args_Java命令行界面(第2部分):args4j

java args在上一篇文章中 &#xff0c;我研究了使用Apache Commons CLI在Java应用程序中解析命令行参数。 在本文中&#xff0c;我将使用另一个库args4j进行相同的操作。 args4j采用了一种不同于Commons CLI的方式来指定Java应用程序应期望的命令行参数。 尽管Commons CLI期望…

php点击后增加html元素,如何动态生成html元素以及为元素追加属性的方法介绍(附代码)...

本篇文章给大家分享的是关于如何动态生成html元素以及为元素追加属性的方法介绍(附代码)&#xff0c;内容很不错&#xff0c;有需要的朋友可以参考一下&#xff0c;希望可以帮助到大家。动态生成HTML元素的方法有三种&#xff1a;第一种&#xff1a;document.createElement()创…

excel npoi 连接_Net操作Excel_NPOI(示例代码)

Npoi 简介1.整个Excel表格叫做工作表&#xff1a;WorkBook(工作薄)&#xff0c;包含的叫页(工作表)&#xff1a;Sheet&#xff1b;行&#xff1a;Row&#xff1b;单元格Cell。4.忘了告诉大家npoi是做什么的了&#xff0c;npoi 能够读写几乎所有的Office 97-2003文件格式&#x…

apache camel_Apache Camel中的短重试与长重试

apache camel《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每种模式都基于真实的用例&#xff0c;并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉&#xff0c;以下是该书的重试模式摘录&#xff0c…

Linux 命令之 netstat -- 查看网络状态信息/显示网络状态

文章目录命令介绍常用选项参考示例&#xff08;一&#xff09;列出所有端口&#xff08;二&#xff09;列出所有 TCP 端口&#xff08;三&#xff09;列出所有 UDP 端口&#xff08;四&#xff09;只显示监听端口&#xff08;五&#xff09;只列出所有监听 tcp 端口&#xff08…

pyqt5 窗口设置圆角_Qt 的一些心得(背景设置,圆角,半透明)

一. 背景刷成黑色,前景色设为白色。 方法一、paltette方式&#xff0c;经测试&#xff0c;该方法不会影响到其他控件,推荐使用 QPalette bgpal palette();bgpal.setColor (QPalette::Background, QColor (0, 0 , 0, 255));//bgpal.setColor (QPalette::Background, Qt::transp…

java语言发展历史_Java编程语言的历史和未来

java语言发展历史通过AppDynamics解决应用程序问题的速度提高了10倍–以最小的开销在代码级深度监视生产应用程序。 开始免费试用&#xff01; 作为互联网上著名的编程语言 &#xff0c;Java对人们如何浏览数字世界产生了深远的影响。 Java功能设置了用户对他们访问互联网的设…

Linux 命令之 Bang(!) 命令

命令说明!!执行上一条命令^foo^ bar把上一条命令里的foo替换为bar&#xff0c;并执行!wget重复执行最近的以wget开头的命令!wget:p仅打印最近的以wget开头的命令&#xff0c;不执行!n执行历史命令列表第n条命令&#xff0c;例如执行第三条命令&#xff1a;!3!-n执行历史命令列表…

matlab resample上采样,resample matlab实现

使用线性插值实现sample rate转换。function output simpleResample(input, inputfs, outputfs)inputLen length(input(:, 1));outputLen floor(inputLen * outputfs / inputfs);output zeros(outputLen, 1);timeStep inputfs / outputfs;curTime 1;integer 0;frac 0;f…

c matlab 精度,svm去优化参数C和g,输出正确率accuracy老是0

下面这个是测试的M文件%% Matlab神经网络43个案例分析%% 清空环境变量function chapter_GridSearchclose all;clear;clc;format compact;%% 数据提取% 载入测试数据wine,其中包含的数据为classnumber 3,wine:178*13的矩阵,wine_labes:178*1的列向量load wine.mat;% 画出测试数…

微服务pact测试框架_消费者驱动的Pact和Spring Boot测试

微服务pact测试框架最近&#xff0c;我的一位同事偶然发现了Pact.io &#xff0c;我们目前的应用程序已扩展到 50多种服务&#xff0c;并且我们开始出现一些集成测试失败和脆弱的开发/验收测试环境。 因此&#xff0c;我们决定研究尝试与此相关的方法。 我从阅读开始&#xff…

用access建立一个试题库_Access考试题库(含答案).doc

所有单选题1、用Access创建的数据库文件&#xff0c;其扩展名是______。A&#xff1a;.adpB&#xff1a;.dbfC&#xff1a;.frmD&#xff1a;.mdb答案&#xff1a;D2、数据库系统的核心是______。A&#xff1a;数据模型B&#xff1a;数据库管理系统C&#xff1a;数据库D&#x…

Linux 命令之 arch --显示主机的硬件结构类型

文章目录介绍命令示例介绍 arch命令主要用于显示当前主机的硬件结构类型&#xff0c;arch命令输出的结果有&#xff1a;i386、i486、mips、alpha等。 此命令的适用范围&#xff1a;RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。 命令示例 显示当前主机硬件架构类…

mega5安装包_[MEGA DEAL] 2017年完全Java捆绑包(95%折扣)

mega5安装包深入了解编程奥德赛&#xff08;58小时&#xff01;&#xff09;&#xff0c;进入最常用的编程语言 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的2017 Complete Java Bundle 仅…

det曲线_平面曲线的曲率的复数表示

开学已经是第二周了&#xff0c;我的《微分几何》也上课两周了&#xff0c;进度比较慢&#xff0c;现在才讲到平面曲线的曲率。在平面曲线$\boldsymbol{t}(t)(x(t),y(t))$某点上可以找出单位切向量。$$\boldsymbol{t}\left(\frac{dx}{ds},\frac{dy}{ds}\right)$$其中$ds^2 dx^2…