Arcgis API For IOS扩展AGSDynamicLayer新旧版API对比

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版本进行相关方法重载。

 

posted @ 2014-12-10 16:21  GIS流水  阅读(792)  评论(0编辑  收藏  举报