Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
function target = quiver(this,long,lat,u,v,varargin)
%KML.QUIVER(long,lat,u,v) Create a quiver plot, similar to built-in
% function quiver3, using line arrows.
%
% Copyright 2012 Rafael Fernandes de Oliveira (rafael@rafael.aero)
% $Revision: 2.3 $ $Date: 2012/09/05 08:00:00 $
target = struct('type','','id','','coordinates_type','','coordinates_id','');
[longDEG,latDEG] = this.checkUnit(long,lat);
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('u', @(a)isnumeric(a) && ~isempty(a) && numel(a)==nlat);
p.addRequired('v', @(a)isnumeric(a) && ~isempty(a) && numel(a)==nlat);
p.addParamValue('altitude',1000,@(a)isnumeric(a) && numel(a)==1);
p.addParamValue('scale',1,@(a)isnumeric(a) && numel(a)==1);
p.addParamValue('arrowBaseSize',0.3,@(a)isnumeric(a) && numel(a)==1);
p.addParamValue('plotArrows',true,@islogical);
p.addParamValue('arrowHeadSize',0.3,@(a)isnumeric(a) && numel(a)==1);
p.addParamValue('color','FFFFFFFF',@(a)ischar(a) && numel(a)==8);
p.addParamValue('name','kml_quiver',@ischar);
p.addParamValue('id',kml.getTempID('kml_quiver'),@ischar);
p.addParamValue('description','',@ischar);
p.addParamValue('visibility',true,@islogical);
p.addParamValue('altitudeMode','relativeToGround',@(a)ismember(a,{'clampToGround','relativeToGround','absolute'}));
p.addParamValue('timeStamp','',@ischar);
p.addParamValue('timeSpanBegin','',@ischar);
p.addParamValue('timeSpanEnd','',@ischar);
p.parse(lat,long,u,v,varargin{:});
arg = p.Results;
f = this.createFolder(arg.name);
uv = sqrt((u+v).^2);
edgelen = @(a)(max(a(:))-min(a(:))).^2;
dS = edgelen(latDEG) + edgelen(longDEG);
scale = sqrt((u.^2 + v.^2)./dS);
scale = arg.scale .* scale;
alpha = arg.arrowHeadSize;
beta = arg.arrowBaseSize;
for i = 1:numel(lat)
if arg.plotArrows
long2 = scale(i).*[0 u(i) u(i)-alpha*(u(i)+beta*(v(i)+eps)) u(i) u(i)-alpha*(u(i)-beta*(v(i)+eps))] + long(i);
lat2 = scale(i).*[0 v(i) v(i)-alpha*(v(i)-beta*(u(i)+eps)) v(i) v(i)-alpha*(v(i)+beta*(u(i)+eps))] + lat(i);
else
long2 = scale(i).*[0 u(i)] + long(i);
lat2 = scale(i).*[0 v(i)] + lat(i);
end
target(i) = f.plot(long2,lat2, 'altitude',arg.altitude,...
'altitudeMode',arg.altitudeMode, ...
'visibility',arg.visibility, ...
'name',sprintf('Arrow %i',i), ...
'lineColor',arg.color, ...
'timeStamp', arg.timeStamp , ...
'timeSpanBegin', arg.timeSpanBegin , ...
'timeSpanEnd', arg.timeSpanEnd, ...
'id', [arg.id '_' num2str(i)] ...
);
end
end