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
ios 高德地图加载瓦片地图_IOS 高德地图 API 加载 WMS 服务相关推荐
- ArcGIS Javascript API 加载高德在线地图扩展
利用ArcGIS JavaScript API加载高德在线地图的扩展 /*** Created by WanderGIS on 2015/7/15.*/ define(["dojo/_bas ...
- OpenLayers教程十一:多源数据加载之用最简单的方式加载瓦片地图
目录 一.加载OpenStreetMap 二.加载Stamen Map 三.加载Bing Map OpenLayers封装了一些瓦片地图源类用于加载瓦片地图,这些类包括: ol.source.OSM ...
- 百度离线使用百度地图离线JavaScript API加载本地瓦片地图 -java教程
最近笔者几篇文章介绍了改百度离线的文章. 关联文章的地址 1.首先取获百度 JavaScript API 首先用浏览器开打 http://api.map.baidu.com/api?v=1.3 如下图 ...
- 如何采用离线的 Google Map API 加载离线谷歌地图的方法
原文转自:http://www.arceyes.com/bbs/thread-18476-1-1.html 如何采用离线的 Google Map API 加载离线谷歌地图的方法 一.下载示例数据 这里 ...
- iOS进阶之底层原理-应用程序加载(dyld加载流程、类与分类的加载)
iOS应用程序的入口是main函数,那么main函数之前系统做了什么呢? 我们定义一个类方法load,打断点,查看栈进程,我们发现dyld做了很多事,接下来就来探究到底dyld做了什么. 什么是dyl ...
- app启动页数秒加载 代码_iOS 底层探索 - 应用加载
一.前导知识 以下参考自 WWDC 2016 Optimizing App Startup Time : 1.1 Mach-O Mach-O is a bunch of file types for ...
- 【百度地图】——利用三级联动加载百度地图
[百度地图]--利用三级联动加载百度地图 HTML+CSS代码如下: <!DOCTYPE html> <html lang="en"><head> ...
- html加载百度地图,百度地图API详解之地图API加载方式
本文将向大家介绍百度地图API的两种不同加载方式:同步加载和异步加载. 同步加载 这是最常见的加载方式,开发者需要在页面的head标签内添加一个script标签,标签的src属性填写为地图API的地址 ...
- 百度地图Javascript使用海量点加载数据并自定义图标
** 百度地图Javascript使用海量点加载数据并自定义图标 由于数据量较大时使用Marker点在地图上标点会造成浏览器卡死,点聚合的形式可以解决数据量大浏览器卡死问题,但是移除点时点聚合不太好用 ...
最新文章
- CSCNN:新一代京东电商广告排序模型
- Connecting the Dots: 应用于主动单目深度估计的深度学习模型(CVPR2019)
- Linux route
- 信息系统项目管理师论文评分标准
- 【AWSL】之Linux管理(RPM)程序
- ldap odbc mysql_Mysql+ODBC+OpenLDAP
- php函数的初步使用
- X-Mas Musings –在Grails集成测试中不要使用随机服务器端口
- Discuz素材资源下载官网门户+自带论坛 整站源码+带后台+带数据库
- MySQL内核调试_内核调试技巧
- HTML5有哪些表单新特性
- linux shadow文件如何拷贝,Linux如何查找shadow文件进入?这样几步轻松搞定!
- 明汯投资掌门人裘慧明:今年特别难,未来两三年也难
- JAVA,OpenCV简单实现“全能扫描王”的功能
- 外贸常用术语_外贸跟单常用术语
- ElementUI ===> 表单 rules 规则
- win7浏览器主页修改不过来_IE浏览器主页无法修改的两种解决办法
- 大数据去重解决方案总结
- 山石防火墙命令查看配置_hillstone 防火墙基本配置
- 个人网站接入live2d详细教程
热门文章
- es 调整gc_实际中进行GC调整
- 数据库 ogm_带有Hibernate OGM的NoSQL –第二部分:查询数据
- java私有属性和私有方法_Java私有,受保护,公共和默认
- Java命令行界面(第28部分):getopt4j
- OpenHub框架进行的异步通信
- hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程
- 设计模式 工厂方法_使用工厂方法模式设计最佳实践
- 注意Java 8的[Pri​​mitive] Stream.iterate()中的递归
- antlr idea 入门_ANTLR:入门
- mongodb 性能测试_MongoDB性能测试