AGSDynamicLayer(ForSubclassEyesOnly) Category Reference Description This category organizes the methods that are relevant to subclassing a dynamic layer. Developer can create custom dynamic layers by paying special attention to the methods in this category when subclassing AGSDynamicLayer. Sub-classes must provide valid values for AGSLayer::spatialReference, AGSLayer::fullEnvelope, and AGSLayer::initialEnvelope properties. Other properties on AGSLayer are optional. Since 10.1.1 See also AGSLayer(ForSubclassEyesOnly) Instance Methods (void) - requestImageWithWidth:height:envelope:timeExtent: (void) - setImageData:forEnvelope: Properties NSOperationQueue * queue BOOL wrapAroundSupported
1、根据新版API(Since10.1.1)看到实例方法已改变,所以需要重写对应的方法requestImageWithWidth:height:envelope:timeExtent:和setImageData:forEnvelope:;
2、不啰嗦,新版扩展代码参考贴上:
#import "CustomDynamicLayer.h" @interface CustomDynamicLayer () @property (nonatomic, strong, readwrite) AGSEnvelope *fullEnvelope; @property (nonatomic, strong, readwrite) AGSSpatialReference *spatialReference; @end @implementation CustomDynamicLayer @synthesize fullEnvelope = _fullEnvelope; @synthesize spatialReference = _spatialReference; #pragma mark - Init Methods - (id)initWithFullEnvelope:(AGSEnvelope*)fullEnvelope { self = [super init]; if (self) { _spatialReference = fullEnvelope.spatialReference; _fullEnvelope = fullEnvelope; [self layerDidLoad]; } return self; } #pragma mark - Request Image -(void)requestImageWithWidth:(NSInteger)width height:(NSInteger)height envelope:(AGSEnvelope*)env timeExtent:(AGSTimeExtent*)timeExtent { // get an image,实际项目中有NameID,URL等形式来表达UIImage, // 如UIImage* img = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:imgUrl]]]; UIImage *img = [UIImage imageNamed:@"esri_campus"]; // if request envelope instersect with full envelope // of layer then only set image data if ([env intersectsWithEnvelope:self.fullEnvelope]) { [self setImageData:UIImagePNGRepresentation(img) forEnvelope:self.fullEnvelope]; } else { [self setImageData:nil forEnvelope:self.fullEnvelope]; } } @end
3、旧版API方法有差异,通过《AGSDynamicLayerDrawingOperation》类扩展,源码:
#import "CustomDynamicLayer.h" @class AGSLayers; @implementation CustomDynamicLayer @synthesize URL=_URL,imageId=_imageId,envelope=_envelope; #pragma mark - Init - (id)initWithURL:(NSURL*)url imageId:(NSString*)imageId envelope:(AGSEnvelope*)envelope { if (self = [self init]) { self.URL = url; self.imageId = imageId; self.envelope = _envelope; _loaded = YES; } return self; } #pragma mark - - (AGSUnits)units { return AGSUnitsUnknown; } - (AGSSpatialReference*) spatialReference { return self.envelope.spatialReference; } - (AGSEnvelope*)fullEnvelope { return self.envelope; } - (AGSEnvelope*)initialEnvelope { return self.envelope; } #pragma mark AGSDynamicLayer - (void)imageRequestOperation:(NSOperation<AGSDynamicLayerDrawingOperation>*)op didGetImage:(UIImage *)image { NSLog(@"image: %@",image); [self.exportDelegate dynamicLayer:self exportMapImageOperation:op didFinishWithImage:image]; } - (void)imageRequestOperation:(NSOperation<AGSDynamicLayerDrawingOperation>*)op didFailWithError:(NSError *)error { NSLog(@"Error: %@",error); if ([self.exportDelegate respondsToSelector:@selector(dynamicLayer:exportMapImageOperation:didFailWithError:)]) { [self.exportDelegate dynamicLayer:self exportMapImageOperation:op didFailWithError:error]; } } -(NSOperation<AGSDynamicLayerDrawingOperation>*)exportMapImage:(AGSExportImageParams*)exportImageParams { if (exportImageParams.envelope == nil || CGSizeEqualToSize(CGSizeZero, exportImageParams.size)) { return nil; } NSMutableDictionary *exportParams = [NSMutableDictionary dictionaryWithObjectsAndKeys: @"png", @"type", self.imageId, @"id", nil]; AGSDynamicLayerImageRequestOperation *operation = [[AGSDynamicLayerImageRequestOperation alloc] initWithURL:self.URL resource:@"" queryParameters:exportParams]; operation.target = self; operation.action = @selector(imageRequestOperation:didGetImage:); operation.errorAction = @selector(imageRequestOperation:didFailWithError:); operation.exportImageParams = exportImageParams; [[AGSRequestOperation sharedOperationQueue] addOperation:operation]; return [operation autorelease]; } #pragma mark - dealloc -(void)dealloc{ self.URL = nil; self.imageId = nil; self.envelope = nil; [super dealloc]; } @end
内容供参考。
目前针对JS\FLEX\Android\IOS都有调用在线地图、天地图等情况,需要根据对应的API版本进行相关方法重载。
时间: 2024-10-31 23:01:25