5 #include "../../shared/shared.h"
6 #include "../../toolkits/toolkits.h"
8 void KMLMeshWritex(
int* ierror,
char* name,
char* notes,
int* elem,
int melem,
int nelem,
int* nodecon,
int mncon,
int nncon,
double* lat,
double* lng,
int* part,
double* data,
int mdata,
int ndata,
double* cmap,
int mcmap,
int ncmap,FILE* fid){
10 int i,j,k,ipt=0,jpt=0,nnodes;
14 char indent[81] =
" ";
17 bool ncfree=
false, edfree=
false;
23 clock_t clock0,clock1,clock0a,clock0b,clock0c;
24 time_t time0, time1, time0a, time0b, time0c;
28 _printf0_(
"\nKMLMeshWritex Module -- " << ctime(&time0));
33 sprintf(kdoc->
name ,
"ISSM Mesh: %s",name);
43 sprintf(klsty->
color ,
"ff000000");
47 sprintf(kpsty->
color ,
"%02xffffff",(
int)floor(popac*255+0.5));
50 kstyle->
AddAttrib(
"id",
"BlackLineRandomPoly");
56 sprintf(klsty->
color ,
"ff000000");
60 sprintf(kpsty->
color ,
"00ffffff");
63 kstyle->
AddAttrib(
"id",
"BlackLineEmptyPoly");
69 sprintf(klsty->
color ,
"ff0000ff");
73 sprintf(kpsty->
color ,
"%02x0000ff",(
int)floor(popac*255+0.5));
82 _printf0_(
"Writing " << mcmap <<
" Matlab colors as KML style templates.\n");
84 for (i=0; i<mcmap; i++) {
87 sprintf(klsty->
color ,
"%02x%02x%02x%02x",
89 (
int)floor(cmap[ipt+2]*255+0.5),
90 (
int)floor(cmap[ipt+1]*255+0.5),
91 (
int)floor(cmap[ipt ]*255+0.5));
95 sprintf(kpsty->
color ,
"%02x%02x%02x%02x",
96 (
int)floor(popac*255+0.5),
97 (
int)floor(cmap[ipt+2]*255+0.5),
98 (
int)floor(cmap[ipt+1]*255+0.5),
99 (
int)floor(cmap[ipt ]*255+0.5));
102 sprintf(cstr,
"MatlabColor%d",i+1);
117 _printf0_(
"Creating the node connectivity table.\n");
119 nodecon=xNewZeroInit<int>(mncon*nncon);
123 for (i=0; i<melem; i++) {
124 for (j=0; j<nelem; j++) {
126 ipt=(elem[jpt]-1)*nncon;
127 if (nodecon[ipt+(nncon-1)] < mxepg) {
128 nodecon[ipt+nodecon[ipt+(nncon-1)]]=i+1;
129 nodecon[ipt+(nncon-1)]++;
132 _error_(
"Nodal connectivity table needs more than specified " << mxepg <<
" columns.\n");
147 else if (mdata == mncon) {
148 _printf0_(
"Averaging nodal data to element data.\n");
149 edata=xNewZeroInit<double>(melem*ndata);
154 for (i=0; i<melem; i++) {
156 for (j=0; j<nelem; j++) {
158 for (k=0; k<ndata; k++)
159 edata[ipt+k]+=data[(elem[jpt]-1)*ndata+k];
165 for (k=0; k<ndata; k++)
166 edata[ipt+k]/=(
double)nnodes;
172 _error_(
"Data matrix has incorrect number of " << mdata <<
" rows.\n");
183 if(edfree) xDelete<double>(edata);
184 if(ncfree) xDelete<int>(nodecon);
187 _printf_(
" Constructed kml document -- " << ((
double)(clock0a-clock0))/CLOCKS_PER_SEC <<
" CPU seconds; " << difftime(time0a,time0) <<
" elapsed seconds.\n\n\n");
191 _printf0_(
"Writing kml document to file.\n");
192 fprintf(fid,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
193 fprintf(fid,
"<kml xmlns=\"http://www.opengis.net/kml/2.2\">\n");
194 kdoc->
Write(fid,indent);
195 fprintf(fid,
"</kml>\n");
198 _printf_(
" Wrote kml file -- " << ((
double)(clock0b-clock0a))/CLOCKS_PER_SEC <<
" CPU seconds; " << difftime(time0b,time0a) <<
" elapsed seconds.\n\n\n");
204 _printf_(
" Deleted kml document -- " << ((
double)(clock0c-clock0b))/CLOCKS_PER_SEC <<
" CPU seconds; " << difftime(time0c,time0b) <<
" elapsed seconds.\n\n\n");
208 _printf_(
"KMLMeshWritex Module -- " << ((
double)(clock1-clock0))/CLOCKS_PER_SEC <<
" CPU seconds; " << difftime(time1,time0) <<
" elapsed seconds.\n\n\n");
214 int* nodecon,
int mncon,
int nncon,
215 double* lat,
double* lng,
217 double* cmap,
int mcmap,
int ncmap){
221 double cmin= DBL_MAX,
233 sprintf(kfold->
name ,
"ISSM Targets");
236 sprintf(kfold->
descript ,
"campaign{\n");
237 strcat(kfold->
descript ,
" evaluator ClaspTargetEvaluator;\n");
238 strcat(kfold->
descript ,
" solver IssmSolver;\n");
239 strcat(kfold->
descript ,
" spacecraft airplane ClaspSpacecraft(\n");
240 strcat(kfold->
descript ,
" dutyCycleDuration=0,\n");
241 strcat(kfold->
descript ,
" dutyCycleOnDuration=0,\n");
242 strcat(kfold->
descript ,
" memoryInit=15000,\n");
243 strcat(kfold->
descript ,
" memoryLimit=40000000,\n");
244 strcat(kfold->
descript ,
" maxDataCollectionRate=27,\n");
245 strcat(kfold->
descript ,
" maxDataDownlinkRate=10);\n");
247 strcat(kfold->
descript ,
" //sensor names\n");
248 strcat(kfold->
descript ,
" sensor qqp_swath = 2,102,1002,1102;\n");
250 strcat(kfold->
descript ,
" //sensor ids to modes\n");
251 strcat(kfold->
descript ,
" low_bandwidth_single_pol = 2,102,1002,1102;\n");
252 strcat(kfold->
descript ,
" single_pol = 2,102,1002,1102;\n");
253 strcat(kfold->
descript ,
" dual_pol = 2,102,1002,1102;\n");
254 strcat(kfold->
descript ,
" quad_pol = 2,102,1002,1102;\n");
256 strcat(kfold->
descript ,
" //LRAD\n");
257 strcat(kfold->
descript ,
" //Note all targets are \"ascending right\"-- i.e. mode=2\n");
258 strcat(kfold->
descript ,
" left = 1002,1102;\n");
259 strcat(kfold->
descript ,
" right = 2,102;\n");
260 strcat(kfold->
descript ,
" ascending = 2,1002;\n");
261 strcat(kfold->
descript ,
" descending = 102,1102;\n");
263 strcat(kfold->
descript ,
" //data rates\n");
264 strcat(kfold->
descript ,
" low_bandwidth_single_pol datarate = 0.896;\n");
265 strcat(kfold->
descript ,
" single_pol datarate = 4.214;\n");
266 strcat(kfold->
descript ,
" dual_pol datarate = 8.428;\n");
267 strcat(kfold->
descript ,
" quad_pol datarate = 16.856;\n");
269 strcat(kfold->
descript ,
" //mode domination relationships\n");
270 strcat(kfold->
descript ,
" quad_pol dominates low_bandwidth_single_pol;\n");
271 strcat(kfold->
descript ,
" quad_pol dominates single_pol;\n");
272 strcat(kfold->
descript ,
" quad_pol dominates dual_pol;\n");
273 strcat(kfold->
descript ,
" dual_pol dominates low_bandwidth_single_pol;\n");
274 strcat(kfold->
descript ,
" dual_pol dominates single_pol;\n");
275 strcat(kfold->
descript ,
" single_pol dominates low_bandwidth_single_pol;\n");
277 strcat(kfold->
descript ,
" //sensor styles\n");
278 strcat(kfold->
descript ,
" 2 0xff00ffff 0xff000000;\n");
279 strcat(kfold->
descript ,
" 102 0x7f00ffff 0xff00ffff;\n");
280 strcat(kfold->
descript ,
" 1002 0xffffff00 0xffffff00;\n");
281 strcat(kfold->
descript ,
" 1102 0x7fffff00 0xffffff00;\n");
283 strcat(kfold->
descript ,
" //discipline styles\n");
284 strcat(kfold->
descript ,
" deformation 0xff006090 0xff006090 0xff0000ff 0xff1010ff;\n");
285 strcat(kfold->
descript ,
" vegetation 0xff00ff00 0xff00ff00 0xff0000ff 0xff0020ff;\n");
286 strcat(kfold->
descript ,
" ice 0xffff0000 0xffff0000 0xff0000ff 0xff2000ff;\n");
290 for (i=0; i<melem; i++) {
299 _printf0_(
"Writing " << melem <<
" tria elements as KML polygons.\n");
301 for (i=0; i<melem; i++) {
303 sprintf(kplace->
name ,
"Element %d",(i+1));
307 sprintf(kplace->
descript ,
"campaign{\n deformation 1 %g quad_pol ascending right asap;\n}",edata[i]);
308 imap = (int)floor((edata[i]-cmin)/(cmax-cmin)*mcmap+0.5)+1;
309 if ((imap >= 1) && (imap <= mcmap))
310 sprintf(kplace->
styleurl ,
"#MatlabColor%d",imap);
311 else if (edata[i] == cmax)
312 sprintf(kplace->
styleurl ,
"#MatlabColor%d",mcmap);
314 sprintf(kplace->
styleurl ,
"#BlackLineEmptyPoly");
318 sprintf(kplace->
styleurl ,
"#BlackLineRandomPoly");
324 sprintf(kpoly->
altmode ,
"clampToGround");
329 kring->
coords =xNew<double>((nelem+1)*3);
333 for (j=0; j<nelem; j++) {
334 kring->
coords[3*j+0]=lng[elem[ipt]-1];
335 kring->
coords[3*j+1]=lat[elem[ipt]-1];
353 _printf0_(
" " << melem <<
" tria elements written.\n");