zoukankan      html  css  js  c++  java
  • 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

    内容供参考。

    目前针对JSFLEXAndroidIOS都有调用在线地图、天地图等情况,需要根据对应的API版本进行相关方法重载。

  • 相关阅读:
    MSP430:输入捕获
    MSP430:串口输出
    测试输出时钟频率
    C# MySql Select
    C# MySql 连接
    MSP430:PWM产生
    MSP430:定时器学习TimerA
    MSP430:中断简介
    MSP430 PIN 操作寄存器
    剑指offer---包含min函数的栈
  • 原文地址:https://www.cnblogs.com/ajg016/p/arcgis_ios_dynamiclayer_sub.html
Copyright © 2011-2022 走看看