自定义类 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( WGS-84) 转 为高德地图需要的坐标

CLLocationCoordinate2D amapcoord = AMapCoordinateConvert(CLLocationCoordinate2DMake(minY, minX), AMapCoordinateTypeGPS);

minY = amapcoord.latitude;

minX = amapcoord.longitude;

CLLocationCoordinate2D maxAmapcoord = AMapCoordinateConvert(CLLocationCoordinate2DMake(maxY, maxX), AMapCoordinateTypeGPS);

maxY = maxAmapcoord.latitude;

maxX = maxAmapcoord.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 函数贴到地图上。你也可以 改写成自己的网络访问层。

问题

为啥要重载 - (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;

ios 高德地图加载瓦片地图_iOS 利用高德地图WMS服务相关推荐

  1. android高德地图瓦片,高德地图加载瓦片分析

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? ##了解瓦片地图 瓦片地图:瓦片地图金字塔模型是一种多分辨率层次模型,从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的 ...

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

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

  3. 转载:高德地图加载不出来,有高德的logo,但地图一片空白

    按照高德官网的文档配置地图加载,在地图上有高德的logo,但是始终加载不到地图,那么你可能遇到这个问题了,请看下面解决办法. 第一步查看:项目的build.gradle中配置的编译版本.运行版本.是不 ...

  4. ios 高德地图加载瓦片地图_iOS高德地图添加自定义瓦片地图

    瓦片地图 首先解释一下什么是瓦片地图,我们使用的地图(例如百度,高德)都有一个底图,在每一级的缩放比例下,都有一张很大的底图,这张底图按固定的大小切割成若干份,在地图显示时根据显示范围和缩放比例,请求 ...

  5. ios 高德地图加载瓦片地图_OpenLayers加载高德地图离线瓦片地图

    谷歌地球离线瓦片下载使用"迈高图-地图数据下载器"(以下简称:迈高图),演示数据以湖南省长沙市7~16级瓦片数据为例. 下载演示数据 迈高图选择谷歌地球为当前地图源,地图图层选择为 ...

  6. ios 高德地图加载瓦片地图_OpenLayers加载谷歌地球离线瓦片地图

    本文使用OpenLayers最新版本V5.3.0演示:如何使用OpenLayer加载谷歌地球离线瓦片地图.OpenLayers 5.3.0下载地址为:https://github.com/openla ...

  7. ios 高德地图加载瓦片地图_集成iOS高德地图

    一.前奏 这里只是个人集成过程中的遇到的点,现做下标记. 1,如果你需要集成涉及国外版地图,基于HTTPS的最新版本需要设置,需要注意基于国外定位,高德的不太精确(个人测试) [self.mapVie ...

  8. 解决在IE中高德地图加载不出来/只有Logo没有地图的解决方案

    在created中调用下面函数 clearMapstore() {localStorage.removeItem("_AMap_vectorlayer");localStorage ...

  9. 高德地图加载谷歌地图瓦片

    简介 苦逼外业实验需要用到无人机采集数据,遂利用高德地图SDK和DJI Mobile SDK开发了一款无人机航线规划软件.当地也不算偏僻,然而高德卫星地图缩放等级约为16,无法满足作业需求.调查了其他 ...

  10. Android基于高德地图加载自定义网络瓦片(使用geoserver)

    公司开发项目使用自己的地图瓦片,由于前端前期使用geoserver,调研后发现高德地图有加载自定义网络瓦片的功能. public class MyTileProvider extends UrlTil ...

最新文章

  1. 网络瓶颈、线程死锁、内存泄露溢出、栈堆、ajax
  2. c#利用WebClient和WebRequest获取网页源代码的比较
  3. WinForm中给DataGridView添加 自动编号
  4. winxp批处理重启计算机,WinXP使用关机命令shutdown的方法
  5. 安装zookeeper集群及出现的问题
  6. layui option 动态添加_layui中select的change事件、动态追加option
  7. P1282-多米诺骨牌【dp,背包】
  8. jsp 或 php 等view之中使用javascript简单处理的使用技巧
  9. CentOS6.8 下MySQL5.6.29主从复制架构配置
  10. mmap文件映射与缺页异常 | 图
  11. nodejs es6 中的单例模式
  12. Subsequence Count (线段树)
  13. Linux 初始化系统 systemd - journald 日志
  14. Google App Engine CMS系统的搭建
  15. python 拆分excel 随机分组
  16. MATLBA官方给出的2D Allen-Cahn Matlab代码分析
  17. 全国省市json文件
  18. java泛型返回值 <T>T 和T的区别
  19. 时间管理 android app推荐,干货星球 篇十三:【强烈安利】分享10个时间管理APP,每一个都堪称精品!...
  20. ubuntu18安装N卡驱动

热门文章

  1. 计算机录音机应用程序在哪,Windows录音机在哪 电脑录音机怎么用
  2. js正则表达式 读取html代码中的 json 值,js读取json文件片段中的数据实例
  3. ios开发防止App被抓包(可正常请求)
  4. 硬盘的老化测试软件,固态硬盘不耐用?教你检测固态硬盘还能用多久
  5. md5和sha256算法的区别,哪个比较安全
  6. imx8mm yocto_bsp 编译
  7. C语言有限域的构造,有限域(3)——多项式环的商环构造有限域
  8. hitool java_Hitool打开出现failed to create the java virtual machine
  9. 读《About Face 4 交互设计精髓》7
  10. vue2.0_前端跨域解决方案之proxy代理