iOS 利用高德地图WMS服务
Demo: https://github.com/xushiyou23/AMapTesting
转:
自定义类 WMSTileOverlayUtil,继承自高德地图接口 MATileOverlay,主要重载函数: - (NSURL *)URLForTilePath:(MATileOverlayPath)path;
- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result;
,见代码注释。
#import <Foundation/Foundation.h>
#import <MAMapKit/MATileOverlay.h>
@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 <MAMapKit/MAMapKit.h>
#import <AMapFoundationKit/AMapFoundationKit.h>
#import <math.h>
#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 利用高德地图WMS服务的更多相关文章
- 高德地图-搜索服务-POI搜索
高德地图-搜索服务-POI搜索 之前公司项目收货地址仿饿了么的收货地址,结果发现自己实现的关键字搜索和周边搜索,搜索到的poi列表跟饿了么的并不完全一样,后来考虑了下,应该是搜索的范围.类型之类的设置 ...
- 利用高德地图javascriptAPI做一个自己的地图
最近由于项目中需要制作一个地图,用来选择活动地点,我就花了两天利用高德地图的javascriptAPI自制了一个地图的demo.在这了记录一下我学习的过程. 一.进入高德地图官网,再找到高德地图的开放 ...
- 【视频教学】如何利用高德地图IOS SDK进行开发?
Step1:使用IOS SDK可以做什么高德地图 iOS SDK 是一套基于 iOS 5.1.1 及以上版本的地图应用程序开发接口.通过该接口,用户可使用高德地图数据和服务轻松构建功能丰富.交互性强的 ...
- iOS导入高德地图出现缺失armv7--"Undefined symbols for architecture armv7"
在已有项目中使用pod导入高德地图,报了以下错误: ld: warning: directory not found for option '-L/Users/paul/iOS/yun-hui-yi/ ...
- iOS的高德地图标注特定位置
在开发时有时候遇到项目里面需要展示公司的位置,这时如果导入百度地图什么的就太浪费资源,而且还占内存 这时只要调用自动高德地图的就行了 自己写一个控制器,导入框架 现在导入系统框架只要多打次就能出来了, ...
- iOS 去除高德地图下方的 logo 图标
[self.mapView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, ...
- 安卓开发笔记①:利用高德地图API进行定位、开发电子围栏、天气预报、轨迹记录、搜索周边(位置)
高德地图开发时需要导入的包在下面的网盘链接中:(由于高德地图api更新得太快,官网上最新的包使用起来没有之前的方便,所以以下提供最全面的原始包) 链接:http://pan.baidu.com/s/1 ...
- android开发对应高德地图定位服务进度一
进行android的高德地图开发首先需要进入高德地图的控制台进行注册登录.之后创建新的应用并且绑定软件得到相应的key. 这里面需要找到自己软件对应的多个SHA1.这里有发布版和调试版,以及对应的软件 ...
- ios开发--高德地图SDK使用简介
高德LBS开放平台将高德最专业的定位.地图.搜索.导航等能力,以API.SDK等形式向广大开发者免费开放.本章节我们来简单学习一下如何使用它的定位及地图SDK. 一.相关框架及环境配置 地图SDK 对 ...
随机推荐
- 使用newtonsoft序列化
如果将字符串序列化为datatable 时,字符串中包含null,序列化会报错,此时将datatabel 添加到dataset 中,在序列化成字符串,然后在将字符串反序列化成dataset
- JavaScript 包装对象
万物皆对象 在JavaScript里,万物皆对象.但是某些对象有别于其它对象,我们可以用 typeof 来获取一个对象的类型,它总是返回一个字符串. typeof 123; // 'number' t ...
- jquery中点击切换的实现
项目中经常会遇到一种情况,就是点击切换,比如点击按钮,div样式为1,再点击一下按钮,div样式为2,再点击一下按钮,div样式为1.需要自定义jQuery方法toggle. // toggle方法 ...
- SAP MM盘点流程里如何处理事务代码MI11 Recount过的盘点凭证?
SAP MM盘点流程里如何处理事务代码MI11 Recount过的盘点凭证? 1, MI01 create a physical inventory document, 2, MI04 to inpu ...
- Mac 终端 显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder //显示隐藏文件 defaults wr ...
- java.lang.NoSuchFieldError异常
原因就是主项目的xml文件和库项目中的xml文件 命名一样,导致库项目中的xml文件被主项目覆盖,所以库项目就找不到xml中的相关id,就报异常了. 解决方法:修改主项目中的xml文件命名,不要和 ...
- join的简单总结
BAT面试题:现在有T1.T2.T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行? 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉.这个多 ...
- vue(2)—— vue简单语法运用,常用指令集
按照前面的文章:vue(1)——node.js安装使用,利用npm安装vue 安装完vue之后,就可以使用vue了 vue vue简介 前面安装好vue之后,确实还没有对vue进行介绍,首先,官网: ...
- sql server 临时表(上) Tempdb概述
一.概述 在sql server里临时表存储在TempDB库中,TempDB是一个系统数据库,它只有Simple恢复模式,也是最小日志记录操作.主要用于存放局部临时表,全局临时表,表变量,都是基于临时 ...
- eclipse中跳转到其它函数方法后如何快速返回原处
快捷键 ctrl + 鼠标左键:跳转到引用的方法 alt + left :从所跳转到引用的方法返回原方法 alt + right:从原处返回到引用的方法