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

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

merged trunk-jpl and trunk for revision 11994M

File size: 8.4 KB
RevLine 
[8711]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"
[9761]8#include "../../io/io.h"
[8711]9#include "../../toolkits/toolkits.h"
10#include "../../EnumDefinitions/EnumDefinitions.h"
11#include "../modules.h"
12
13int Exp2Kmlx(char* filexp,char* filkml,
[8716]14 int sgn,
15 bool holes){
[8711]16
[8716]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
[8711]30 int i,j,iret=0;
[8747]31 int lwidth=1;
32 double popac=0.50;
[8711]33 int nprof;
34 int *pnvert=NULL;
35 double **pprofx=NULL,**pprofy=NULL;
[8737]36 bool *closed=NULL;
[8711]37 double *lat=NULL,*lon=NULL;
38
39 char indent[81]="";
40 KML_File* kfile =NULL;
41 KML_Document* kdoc =NULL;
[8747]42 KML_Style* kstyle=NULL;
43 KML_LineStyle* klsty =NULL;
44 KML_PolyStyle* kpsty =NULL;
[8711]45 KML_Folder* kfold =NULL;
46 KML_Placemark* kplace=NULL;
47 KML_Polygon* kpoly =NULL;
48 KML_LinearRing* kring =NULL;
[8741]49 KML_LineString* kline =NULL;
[11995]50 KML_Point* kpoint=NULL;
[8711]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
[11995]63 if (!DomainOutlineRead(&nprof,&pnvert,&pprofx,&pprofy,&closed,filexp,true))
[8711]64 _error_("Error reading exp file.");
[11995]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]);
[8711]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
[8747]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
[8711]121/* construct kml folder for polygons */
122
123 kfold =new KML_Folder();
[8741]124 sprintf(kfold->name ,"Profiles translated from file \"%s\".",filexp);
[8711]125 kfold->open =1;
126
127/* polygon with multiple holes */
128
[11995]129 if (holes && nprof && (pnvert[0] <= 1 || pprofx[0][pnvert[0]-1] != pprofx[0][0] || pprofy[0][pnvert[0]-1] != pprofy[0][0])) {
[8741]130 _printf_(true,"Warning -- Outer profile is not closed, so \"holes\" option will be ignored.\n");
131 holes=false;
132 }
133
[8711]134 if (holes) {
135 i=0;
136 kplace=new KML_Placemark();
137 sprintf(kplace->name ,"Polygon with Holes");
138 kplace->visibility=true;
[8747]139 sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
[8711]140
141 kpoly =new KML_Polygon();
142 kring =new KML_LinearRing();
143
[11995]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++) {
[8711]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++) {
[11995]161 if (pnvert[i] <= 1 || pprofx[i][pnvert[i]-1] != pprofx[i][0] || pprofy[i][pnvert[i]-1] != pprofy[i][0]) {
[8741]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
[8711]166 kring =new KML_LinearRing();
167
[11995]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++) {
[8711]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
[8741]191/* multiple polygons or linestrings */
[8711]192
193 else {
194 for (i=0; i<nprof; i++) {
195 kplace=new KML_Placemark();
196
[11995]197 if (pnvert[i] > 1 && pprofx[i][pnvert[i]-1] == pprofx[i][0] && pprofy[i][pnvert[i]-1] == pprofy[i][0]) {
[8741]198 sprintf(kplace->name ,"Polygon %d",i+1);
199 kplace->visibility=true;
[8747]200 sprintf(kplace->styleurl ,"#BlackLineRandomPoly");
[8711]201
[8741]202 kpoly =new KML_Polygon();
203 kring =new KML_LinearRing();
[8711]204
[11995]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++) {
[8741]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;
[8711]223 }
224
[11995]225 else if (pnvert[i] > 1) {
[8741]226 sprintf(kplace->name ,"LineString %d",i+1);
227 kplace->visibility=true;
[8747]228 sprintf(kplace->styleurl ,"#RandomLineEmptyPoly");
[8711]229
[8741]230 kline =new KML_LineString();
231
232 kline->ncoord =pnvert[i];
[11995]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++) {
[8741]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
[11995]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
[8711]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
[11995]283 _printf_(true,"Exp2Kmlx -- Writing kml document to file \"%s\".\n",filkml);
[8711]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.