source: issm/trunk/src/c/modules/Exp2Kmlx/Exp2Kmlx.cpp@ 12330

Last change on this file since 12330 was 12330, checked in by Mathieu Morlighem, 13 years ago

merged trunk-jpl and trunk for revision 12326M

File size: 8.4 KB
Line 
1/*!\file Exp2Kmlx
2 * \brief exp to kml conversion routines.
3 */
4
5#include "./Exp2Kmlx.h"
6#include "../../shared/shared.h"
7#include "../../include/include.h"
8#include "../../io/io.h"
9#include "../../toolkits/toolkits.h"
10#include "../../EnumDefinitions/EnumDefinitions.h"
11#include "../modules.h"
12
13int Exp2Kmlx(char* filexp,char* filkml,
14 int sgn,
15 bool holes){
16
17 double cm,sp;
18
19 Xy2lldef(&cm,&sp,sgn);
20
21 return(Exp2Kmlx(filexp,filkml,
22 sgn,cm,sp,
23 holes));
24}
25
26int Exp2Kmlx(char* filexp,char* filkml,
27 int sgn,double cm,double sp,
28 bool holes){
29
30 int i,j,iret=0;
31 int lwidth=1;
32 double popac=0.50;
33 int nprof;
34 int *pnvert=NULL;
35 double **pprofx=NULL,**pprofy=NULL;
36 bool *closed=NULL;
37 double *lat=NULL,*lon=NULL;
38
39 char indent[81]="";
40 KML_File* kfile =NULL;
41 KML_Document* kdoc =NULL;
42 KML_Style* kstyle=NULL;
43 KML_LineStyle* klsty =NULL;
44 KML_PolyStyle* kpsty =NULL;
45 KML_Folder* kfold =NULL;
46 KML_Placemark* kplace=NULL;
47 KML_Polygon* kpoly =NULL;
48 KML_LinearRing* kring =NULL;
49 KML_LineString* kline =NULL;
50 KML_Point* kpoint=NULL;
51
52 FILE* fid=NULL;
53
54 clock_t clock0,clock1;
55 time_t time0, time1;
56
57 clock0=clock();
58 time0 =time(NULL);
59 _printf_(true,"\nExp2Kmlx Module -- %s",ctime(&time0));
60
61/* read exp file */
62
63 if (!DomainOutlineRead(&nprof,&pnvert,&pprofx,&pprofy,&closed,filexp))
64 _error_("Error reading exp file.");
65 _printf_(true,"Exp2Kmlx -- Reading %d exp profiles from file \"%s\".\n",nprof,filexp);
66// for (i=0; i<nprof; i++)
67// printf("i=%d; nvert=%d, closed=%d\n",i,pnvert[i],closed[i]);
68
69/* construct kml file */
70
71 kfile =new KML_File();
72 kfile->AddAttrib("xmlns","http://www.opengis.net/kml/2.2");
73
74/* construct kml document */
75
76 kdoc =new KML_Document();
77 sprintf(kdoc->name ,"Exp2Kmlx Module -- %s",ctime(&time0));
78 kdoc->open =1;
79
80/* construct style templates for defaults */
81
82 klsty =new KML_LineStyle();
83 sprintf(klsty->color ,"ff000000");
84 sprintf(klsty->colormode ,"normal");
85 klsty->width =lwidth;
86 kpsty =new KML_PolyStyle();
87 sprintf(kpsty->color ,"%02xffffff",(int)floor(popac*255+0.5));
88 sprintf(kpsty->colormode ,"random");
89 kstyle=new KML_Style();
90 kstyle->AddAttrib("id","BlackLineRandomPoly");
91 kstyle->line =klsty;
92 kstyle->poly =kpsty;
93 (kdoc->style )->AddObject((Object*)kstyle);
94
95 klsty =new KML_LineStyle();
96 sprintf(klsty->color ,"ff000000");
97 sprintf(klsty->colormode ,"normal");
98 klsty->width ,lwidth;
99 kpsty =new KML_PolyStyle();
100 sprintf(kpsty->color ,"00ffffff");
101 sprintf(kpsty->colormode ,"random");
102 kstyle=new KML_Style();
103 kstyle->AddAttrib("id","BlackLineEmptyPoly");
104 kstyle->line =klsty;
105 kstyle->poly =kpsty;
106 (kdoc->style )->AddObject((Object*)kstyle);
107
108 klsty =new KML_LineStyle();
109 sprintf(klsty->color ,"%02xffffff",(int)floor(popac*255+0.5));
110 sprintf(klsty->colormode ,"random");
111 klsty->width =lwidth*2;
112 kpsty =new KML_PolyStyle();
113 sprintf(kpsty->color ,"00ffffff");
114 sprintf(kpsty->colormode ,"random");
115 kstyle=new KML_Style();
116 kstyle->AddAttrib("id","RandomLineEmptyPoly");
117 kstyle->line =klsty;
118 kstyle->poly =kpsty;
119 (kdoc->style )->AddObject((Object*)kstyle);
120
121/* construct kml folder for polygons */
122
123 kfold =new KML_Folder();
124 sprintf(kfold->name ,"Profiles translated from file \"%s\".",filexp);
125 kfold->open =1;
126
127/* polygon with multiple holes */
128
129 if (holes && nprof && (pnvert[0] <= 1 || pprofx[0][pnvert[0]-1] != pprofx[0][0] || pprofy[0][pnvert[0]-1] != pprofy[0][0])) {
130 _printf_(true,"Warning -- Outer profile is not closed, so \"holes\" option will be ignored.\n");
131 holes=false;
132 }
133
134 if (holes) {
135 i=0;
136 kplace=new KML_Placemark();
137 sprintf(kplace->name ,"Polygon with Holes");
138 kplace->visibility=true;
139 sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
140
141 kpoly =new KML_Polygon();
142 kring =new KML_LinearRing();
143
144 kring->ncoord =pnvert[i]-1;
145 lat=(double *) xmalloc(kring->ncoord*sizeof(double));
146 lon=(double *) xmalloc(kring->ncoord*sizeof(double));
147 Xy2llx(lat,lon,pprofx[i],pprofy[i],kring->ncoord,sgn,cm,sp);
148 kring->coords =(double (*)[3]) xmalloc(kring->ncoord*3*sizeof(double));
149 for (j=0; j<kring->ncoord; j++) {
150 kring->coords[j][0]=lon[j];
151 kring->coords[j][1]=lat[j];
152 kring->coords[j][2]=0.;
153 }
154 xfree((void**)&lon);
155 xfree((void**)&lat);
156
157 (kpoly ->outer )->AddObject((Object*)kring);
158 kring =NULL;
159
160 for (i=1; i<nprof; i++) {
161 if (pnvert[i] <= 1 || pprofx[i][pnvert[i]-1] != pprofx[i][0] || pprofy[i][pnvert[i]-1] != pprofy[i][0]) {
162 _printf_(true,"Warning -- Inner profile %d is not closed with \"holes\" specified, so it will be ignored.\n",i+1);
163 continue;
164 }
165
166 kring =new KML_LinearRing();
167
168 kring->ncoord =pnvert[i]-1;
169 lat=(double *) xmalloc(kring->ncoord*sizeof(double));
170 lon=(double *) xmalloc(kring->ncoord*sizeof(double));
171 Xy2llx(lat,lon,pprofx[i],pprofy[i],kring->ncoord,sgn,cm,sp);
172 kring->coords =(double (*)[3]) xmalloc(kring->ncoord*3*sizeof(double));
173 for (j=0; j<kring->ncoord; j++) {
174 kring->coords[j][0]=lon[j];
175 kring->coords[j][1]=lat[j];
176 kring->coords[j][2]=0.;
177 }
178 xfree((void**)&lon);
179 xfree((void**)&lat);
180
181 (kpoly ->inner )->AddObject((Object*)kring);
182 kring =NULL;
183 }
184
185 (kplace->geometry )->AddObject((Object*)kpoly);
186 kpoly =NULL;
187 (kfold ->feature )->AddObject((Object*)kplace);
188 kplace=NULL;
189 }
190
191/* multiple polygons or linestrings */
192
193 else {
194 for (i=0; i<nprof; i++) {
195 kplace=new KML_Placemark();
196
197 if (pnvert[i] > 1 && pprofx[i][pnvert[i]-1] == pprofx[i][0] && pprofy[i][pnvert[i]-1] == pprofy[i][0]) {
198 sprintf(kplace->name ,"Polygon %d",i+1);
199 kplace->visibility=true;
200 sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
201
202 kpoly =new KML_Polygon();
203 kring =new KML_LinearRing();
204
205 kring->ncoord =pnvert[i]-1;
206 lat=(double *) xmalloc(kring->ncoord*sizeof(double));
207 lon=(double *) xmalloc(kring->ncoord*sizeof(double));
208 Xy2llx(lat,lon,pprofx[i],pprofy[i],kring->ncoord,sgn,cm,sp);
209 kring->coords =(double (*)[3]) xmalloc(kring->ncoord*3*sizeof(double));
210 for (j=0; j<kring->ncoord; j++) {
211 kring->coords[j][0]=lon[j];
212 kring->coords[j][1]=lat[j];
213 kring->coords[j][2]=0.;
214 }
215 xfree((void**)&lon);
216 xfree((void**)&lat);
217
218 (kpoly ->outer )->AddObject((Object*)kring);
219 kring =NULL;
220
221 (kplace->geometry )->AddObject((Object*)kpoly);
222 kpoly =NULL;
223 }
224
225 else if (pnvert[i] > 1) {
226 sprintf(kplace->name ,"LineString %d",i+1);
227 kplace->visibility=true;
228 sprintf(kplace->styleurl ,"#RandomLineEmptyPoly");
229
230 kline =new KML_LineString();
231
232 kline->ncoord =pnvert[i];
233 lat=(double *) xmalloc(kline->ncoord*sizeof(double));
234 lon=(double *) xmalloc(kline->ncoord*sizeof(double));
235 Xy2llx(lat,lon,pprofx[i],pprofy[i],kline->ncoord,sgn,cm,sp);
236 kline->coords =(double (*)[3]) xmalloc(kline->ncoord*3*sizeof(double));
237 for (j=0; j<kline->ncoord; j++) {
238 kline->coords[j][0]=lon[j];
239 kline->coords[j][1]=lat[j];
240 kline->coords[j][2]=0.;
241 }
242 xfree((void**)&lon);
243 xfree((void**)&lat);
244
245 (kplace->geometry )->AddObject((Object*)kline);
246 kline =NULL;
247 }
248
249 else if (pnvert[i]) {
250 sprintf(kplace->name ,"Point %d",i+1);
251 kplace->visibility=true;
252 sprintf(kplace->styleurl ,"#RandomLineEmptyPoly");
253
254 kpoint=new KML_Point();
255
256 lat=(double *) xmalloc(sizeof(double));
257 lon=(double *) xmalloc(sizeof(double));
258 Xy2llx(lat,lon,pprofx[i],pprofy[i],1,sgn,cm,sp);
259 kpoint->coords[0]=lon[0];
260 kpoint->coords[1]=lat[0];
261 kpoint->coords[2]=0.;
262 xfree((void**)&lon);
263 xfree((void**)&lat);
264
265 (kplace->geometry )->AddObject((Object*)kpoint);
266 kpoint =NULL;
267 }
268
269 (kfold ->feature )->AddObject((Object*)kplace);
270 kplace=NULL;
271 }
272 }
273
274/* assemble the rest of the kml hierarchy */
275
276 (kdoc ->feature )->AddObject((Object*)kfold);
277 kfold=NULL;
278 (kfile->kmlobj )->AddObject((Object*)kdoc);
279 kdoc =NULL;
280
281/* write kml file */
282
283 _printf_(true,"Exp2Kmlx -- Writing kml document to file \"%s\".\n",filkml);
284 fid=fopen(filkml,"w");
285 fprintf(fid,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
286 kfile->Write(fid,indent);
287 fclose(fid);
288
289 delete kfile;
290 for (i=nprof-1; i>=0; i--) {
291 xfree((void**)&(pprofy[i]));
292 xfree((void**)&(pprofx[i]));
293 }
294 xfree((void**)&pnvert);
295
296 clock1=clock();
297 time1 =time(NULL);
298 _printf_(true,"Exp2Kmlx Module -- %f CPU seconds; %f elapsed seconds.\n\n",
299 ((double)(clock1-clock0))/CLOCKS_PER_SEC,difftime(time1,time0));
300
301 return(iret);
302}
303
Note: See TracBrowser for help on using the repository browser.