Skip to content
Snippets Groups Projects
polyMap.m 3.28 KiB
Newer Older
function target = polyMap(this,long,lat,value,varargin)
%KML.POLY3(long,lat,alt) Draw a polygonal 3D form, with vertices given by long, lat and alt.
%  
%   Copyright 2012 Rafael Fernandes de Oliveira (rafael@rafael.aero)
%   $Revision: 2.3 $  $Date: 2012/09/05 08:00:00 $

    target = struct('type','','id','');
    
    lat   = lat(:);
    long  = long(:);
    value = value(:);
    
    p = inputParser;
    nlat = numel(lat);

    p.addRequired('lat', @(a)isnumeric(a) &&~isempty(a));
    p.addRequired('long',@(a)isnumeric(a) &&~isempty(a) && numel(a)==nlat);
    p.addRequired('value', @(a)isnumeric(a) &&~isempty(a) && numel(a)==nlat);
    
    p.addParamValue('id',kml.getTempID('kml_polyMap'),@ischar);
    p.addParamValue('name','kml_polyMap',@ischar);
    p.addParamValue('description','',@ischar);
    p.addParamValue('visibility',true,@islogical);
    p.addParamValue('colorMap','jet',@ischar);
    p.addParamValue('scale',1e4,@(a)isnumeric(a) && numel(a)==1);
    p.addParamValue('width',1,@(a)isnumeric(a) && numel(a)==1);
    p.addParamValue('type','square',@(a)ismember(lower(a),{'square','circle'}));
    p.addParamValue('noFolder',false,@islogical)
    
    p.addParamValue('timeStamp','',@ischar);
    p.addParamValue('timeSpanBegin','',@ischar);
    p.addParamValue('timeSpanEnd','',@ischar);    
    
    p.parse(lat,long,value,varargin{:});
    
    arg = p.Results;
    
    fDR = this.checkUnit(1);

    lls = max(max(lat)-min(lat),max(long)-min(long));
    width = 0.5*lls./sqrt(numel(value));
    
    
    if arg.noFolder
        f = this;
    else
        f = this.createFolder(arg.name);
    end
        
    maxVal = max(value);
    minVal = min(value);
    
    if maxVal==minVal
        minVal = 0;
    end

    
    
    
    scale = arg.scale .* value; %-minVal)./(maxVal-minVal);
    
    ncolors = 100;
    cmap = feval(arg.colorMap,ncolors);
    vs = linspace(minVal,maxVal,ncolors);    

    switch lower(arg.type)
        case 'square'
            pLong = 0.5*[-1 -1 1 1 -1].*arg.width.*width;
            pLat  = 0.5*[-1 1 1 -1 -1].*arg.width.*width;
        case 'circle'
            t = linspace(0,2*pi,100);
            pLong = 0.5*sin(t).*arg.width.*width;
            pLat  = 0.5*cos(t).*arg.width.*width;
    end
    
    maxValCount = 1e4;
    
    
    if numel(value) > maxValCount
        warning('kml:maxPoly','Ignoring any point under the top %i values',maxValCount);
        [tmp,indexToPlot] = sort(-value);
        indexToPlot = indexToPlot(1:maxValCount).';
    else
        indexToPlot = 1:numel(value);
    end
    
    for i = indexToPlot
        if scale(i)>0
            color = [interp1(vs,cmap(:,1),value(i)) interp1(vs,cmap(:,2),value(i)) interp1(vs,cmap(:,3),value(i))];
            colorHex = kml.color2kmlHex(color);        
            target(end+1) = f.poly3(long(i) + pLong,lat(i) + pLat.*cosd(fDR*lat(i)),ones(size(pLong)).*scale(i), ...
                                    'extrude', true, ...
                                    'visibility',arg.visibility,...
                                    'altitudeMode','absolute',...
                                    'lineWidth',0, ...
                                    'polyColor',colorHex, ...
                                    'id', [arg.id '_' num2str(i)]);
        end
    end
    target(1) = []; %remove the empty initial field
end