日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 高德地图加载瓦片地图_iOS 利用高德地图WMS服务

發(fā)布時(shí)間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 高德地图加载瓦片地图_iOS 利用高德地图WMS服务 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

自定義類 WMSTileOverlayUtil,繼承自高德地圖接口 MATileOverlay,主要重載函數(shù):

- (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,此方法默認(rèn)填充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,此方法默認(rèn)填充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數(shù)據(jù)或加載tile失敗error訪問回調(diào)block;默認(rèn)實(shí)現(xiàn)為首先用URLForTilePath去獲取URL,然后用異步NSURLConnection加載tile

*@param path tile path

*@param result 用來傳入tile數(shù)據(jù)或加載tile失敗的error訪問的回調(diào)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 取消請求瓦片,當(dāng)?shù)貓D顯示區(qū)域發(fā)生變化時(shí),會(huì)取消顯示區(qū)域外的瓦片的下載, 當(dāng)disableOffScreenTileLoading=YES時(shí)會(huì)被調(diào)用。since 5.3.0

*@param path tile path

*/

- (void)cancelLoadOfTileAtPath:(MATileOverlayPath)path {

[super cancelLoadOfTileAtPath:path];

}

/**

* 根據(jù)瓦片的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];

//轉(zhuǎn)換成經(jīng)緯度

minX = [self meters2Lon:minX];

minY = [self meters2Lat:minY];

maxX = [self meters2Lon:maxX];

maxY = [self meters2Lat:maxY];

//坐標(biāo)轉(zhuǎn)換工具類構(gòu)造方法 Gps( WGS-84) 轉(zhuǎn) 為高德地圖需要的坐標(biāo)

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;

}

/**

* 根據(jù)像素、等級算出坐標(biāo)

*

*@param p p

*@param zoom z

*@return double

*/

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

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

}

/**

* 計(jì)算分辨率

*

*@param zoom z

*@return double

*/

- (double)resolution:(NSInteger)zoom {

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

}

/**

* X米轉(zhuǎn)經(jīng)緯度

*/

- (double)meters2Lon:(double)mx {

double lon = mx * DEGREE_PER_METER;

return lon;

}

/**

* Y米轉(zhuǎn)經(jīng)緯度

*/

- (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;?函數(shù)中,使用自己寫的 網(wǎng)絡(luò)訪問層去請求 wms 服務(wù),并通過 result 函數(shù)貼到地圖上。你也可以 改寫成自己的網(wǎng)絡(luò)訪問層。

問題

為啥要重載?- (void)loadTileAtPath:(MATileOverlayPath)path result:(void (^)(NSData *tileData, NSError *error))result;?函數(shù),因?yàn)橹皇菑妮d?- (NSURL *)URLForTilePath:(MATileOverlayPath)path;?生成 NSURL 后,loadTileAtPath 函數(shù)會(huì)去通過網(wǎng)絡(luò)請求加載 wms 服務(wù),然而,這一步網(wǎng)絡(luò)請求會(huì)報(bào)錯(cuò):NSURLConnection -errorcode -1004,且一個(gè)星期沒有解決為啥報(bào)錯(cuò),所以只得重寫,如果有熟悉高德地圖 api 的小伙伴能夠給予解答,不勝感激。

注意

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

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

AFHTTPResponseSerializer *serializer=[AFHTTPResponseSerializer serializer];

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

manager.responseSerializer = serializer;

總結(jié)

以上是生活随笔為你收集整理的ios 高德地图加载瓦片地图_iOS 利用高德地图WMS服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。