source: issm/trunk/src/m/classes/basin.m@ 24313

Last change on this file since 24313 was 24313, checked in by Mathieu Morlighem, 5 years ago

merged trunk-jpl and trunk for revision 24310

File size: 4.4 KB
Line 
1%BASIN class definition
2%
3% Usage:
4% basin=basin();
5
6classdef basin
7 properties (SetAccess=public)
8 boundaries = {};
9 epsg = 3426;
10 name = '';
11 continent = '';
12 end
13 methods (Static)
14 function self = loadobj(self) % {{{
15 % This function is directly called by matlab when a model object is
16 % loaded. Update old properties here
17 end% }}}
18 end
19 methods
20 function self = basin(varargin) % {{{
21 switch nargin
22 case 0
23 self=setdefaultparameters(self);
24 otherwise
25
26 self=setdefaultparameters(self);
27 options=pairoptions(varargin{:});
28
29 %recover field values:
30 self.boundaries=getfieldvalue(options,'boundaries',{});
31 self.name=getfieldvalue(options,'name','');
32 self.continent=getfieldvalue(options,'continent','');
33 self.epsg=getfieldvalue(options,'epsg',3426);
34 end
35 end % }}}
36 function self = setdefaultparameters(self) % {{{
37 self.name='';
38 self.continent='';
39 self.epsg=3426;
40 self.boundaries={};
41
42 end % }}}
43 function disp(self) % {{{
44 disp(sprintf(' basin parameters:'));
45 fielddisplay(self,'continent','continent name');
46 fielddisplay(self,'name','basin name');
47 fielddisplay(self,'epsg','epsg projection number for the entire basin');
48 fielddisplay(self,'boundaries','list of boundary objects');
49 for i=1:length(self.boundaries),
50 disp(sprintf(' boundary #%i: %s',i,self.boundaries{i}.name));
51 end
52
53 end % }}}
54 function boolean=isnameany(self,varargin) % {{{
55 boolean=0;
56 for i=1:length(varargin),
57 if strcmpi(self.name,varargin{i}),
58 boolean=1;
59 break;
60 end
61 end
62 end % }}}
63 function boolean=iscontinentany(self,varargin) % {{{
64 boolean=0;
65 for i=1:length(varargin),
66 if strcmpi(self.continent,varargin{i}),
67 boolean=1;
68 break;
69 end
70 end
71 end % }}}
72 function output=outputname(self,varargin) % {{{
73
74 %recover options
75 options=pairoptions(varargin{:});
76 extension=getfieldvalue(options,'extension',1);
77
78 [path,nme,ext]=fileparts(self.name);
79 if extension,
80 output=[nme ext];
81 else
82 output=nme;
83 end
84 end % }}}
85 function plot(self,varargin) % {{{
86
87 %add option:
88 for i=1:length(self.boundaries),
89 self.boundaries{i}.plot('epsg',self.epsg,varargin{:});
90 end
91
92 end % }}}
93 function plot3d(self,varargin) % {{{
94
95 %add option:
96 for i=1:length(self.boundaries),
97 self.boundaries{i}.plot3d(varargin{:});
98 end
99
100 end % }}}
101 function out=contour(self,varargin) % {{{
102
103 %recover options
104 options=pairoptions(varargin{:});
105 x=[]; y=[];
106
107 %go through boundaries, recover edges and project them in the basin epsg reference frame:
108 for i=1:length(self.boundaries),
109 boundary=self.boundaries{i};
110 contour=boundary.edges();
111 [contour.x,contour.y]=gdaltransform(contour.x,contour.y,sprintf('EPSG:%i',boundary.epsg),sprintf('EPSG:%i',self.epsg));
112 x=[x;contour.x];
113 y=[y;contour.y];
114 end
115 %close the contour:
116 if x(end)~=x(1) | y(end)~=y(1),
117 x(end)=x(1); y(end)=y(1);
118 end
119
120 out.x=x;
121 out.y=y;
122 out.nods=length(x);
123 end % }}}
124 function output=shapefilecrop(self,varargin) % {{{
125
126 %recover options
127 options=pairoptions(varargin{:});
128 threshold=getfieldvalue(options,'threshold',.65); %.65 degrees lat,long
129 inshapefile=getfieldvalue(options,'shapefile');
130 outputshapefile=getfieldvalue(options,'outputshapefile','');
131 epsgshapefile=getfieldvalue(options,'epsgshapefile');
132
133 %create list of contours that have critical length > threshold: (in lat,long)
134 contours=shpread(inshapefile);
135 llist=[];
136 for i=1:length(contours),
137 contour=contours(i);
138 carea=polyarea(contour.x,contour.y);
139 clength=sqrt(carea);
140 if clength<threshold,
141 llist=[llist;i];
142 end
143 end
144 contours(llist)=[];
145
146 %project onto reference frame:
147 if self.epsg~=epsgshapefile,
148 for i=1:length(contours),
149 h=contours(i);
150 [h.x,h.y]=gdaltransform(h.x,h.y,sprintf('EPSG:%i',epsgshapefile),sprintf('EPSG:%i',self.epsg));
151 contours(i).x=h.x;
152 contours(i).y=h.y;
153 end
154 end
155
156 %only keep the contours that are inside the basin (take centroids):
157 ba=self.contour();
158 flags=zeros(length(contours),1);
159 for i=1:length(contours),
160 h=contours(i);
161 in=inpolygon(h.x,h.y,ba.x,ba.y);
162 if ~isempty(find(in==0)),
163 flags(i)=1;
164 end
165 end
166 pos=find(flags); contours(pos)=[];
167
168 %Two options:
169 if strcmpi(outputshapefile,''),
170 output=contours;
171 else
172 shpwrite(contours,outputshapefile);
173 end
174
175 end % }}}
176 end
177end
Note: See TracBrowser for help on using the repository browser.