26 #ifdef _HAVE_SHAPELIB_ //only works if Shapelib library has been compiled in.
33 int *pstype = NULL, *pnpart=NULL,**ppstrt=NULL,**pptype=NULL,*pnvert=NULL;
34 double **pshapx = NULL,**pshapy=NULL,**pshapz=NULL,**pshapm=NULL;
35 double *lat = NULL, *lon=NULL;
38 int nShapeType, nEntities, iPart, bValidate = 0,nInvalidCount=0;
40 double adfMinBound[4], adfMaxBound[4];
57 clock_t clock0,clock1;
62 _printf0_(
"\nShp2Kmlx Module -- " << ctime(&time0));
68 hSHP = SHPOpen( filshp,
"rb" );
69 if (!hSHP)
_error_(
"Error opening shp/shx files.");
73 SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound );
75 printf(
"Shapefile Type: %s # of Shapes: %d\n\n",
76 SHPTypeName( nShapeType ), nEntities );
78 printf(
"File Bounds: (%12.3f,%12.3f,%g,%g)\n"
79 " to (%12.3f,%12.3f,%g,%g)\n",
90 pstype=xNew<int>(nshape);
91 pnpart=xNew<int>(nshape);
92 ppstrt=xNew<int*>(nshape);
93 pptype=xNew<int*>(nshape);
94 pnvert=xNew<int>(nshape);
95 pshapx=xNew<double*>(nshape);
96 pshapy=xNew<double*>(nshape);
97 pshapz=xNew<double*>(nshape);
98 pshapm=xNew<double*>(nshape);
101 for(i=0;i<nEntities;i++ ){
104 psShape = SHPReadObject( hSHP, i );
106 printf(
"\nShape:%d (%s) nVertices=%d, nParts=%d\n"
107 " Bounds:(%12.3f,%12.3f, %g, %g)\n"
108 " to (%12.3f,%12.3f, %g, %g)\n",
109 i, SHPTypeName(psShape->nSHPType),
110 psShape->nVertices, psShape->nParts,
111 psShape->dfXMin, psShape->dfYMin,
112 psShape->dfZMin, psShape->dfMMin,
113 psShape->dfXMax, psShape->dfYMax,
114 psShape->dfZMax, psShape->dfMMax );
116 pstype[i]=psShape->nSHPType;
117 pnpart[i]=psShape->nParts;
119 ppstrt[i]=xNew<int>(pnpart[i]);
120 pptype[i]=xNew<int>(pnpart[i]);
126 pnvert[i]=psShape->nVertices;
128 pshapx[i]=xNew<double>(pnvert[i]);
129 pshapy[i]=xNew<double>(pnvert[i]);
130 pshapz[i]=xNew<double>(pnvert[i]);
131 pshapm[i]=xNew<double>(pnvert[i]);
140 for( j = 0, iPart = 1; j < psShape->nVertices; j++ )
142 const char *pszPartType =
"";
144 if( j == 0 && psShape->nParts > 0 )
146 pszPartType = SHPPartTypeName( psShape->panPartType[0] );
147 ppstrt[i][0]=psShape->panPartStart[0];
148 pptype[i][0]=psShape->panPartType[0];
151 if( iPart < psShape->nParts
152 && psShape->panPartStart[iPart] == j )
154 pszPartType = SHPPartTypeName( psShape->panPartType[iPart] );
155 ppstrt[i][iPart]=psShape->panPartStart[iPart];
156 pptype[i][iPart]=psShape->panPartType[iPart];
171 pshapx[i][j]=psShape->padfX[j];
172 pshapy[i][j]=psShape->padfY[j];
173 pshapz[i][j]=psShape->padfZ[j];
174 pshapm[i][j]=psShape->padfM[j];
179 int nAltered = SHPRewindObject( hSHP, psShape );
183 printf(
" %d rings wound in the wrong direction.\n",
189 SHPDestroyObject( psShape );
199 kfile->
AddAttrib(
"xmlns",
"http://www.opengis.net/kml/2.2");
204 sprintf(kdoc->
name ,
"Shp2Kmlx Module -- %s",ctime(&time0));
210 sprintf(klsty->
color ,
"ff000000");
212 klsty->
width =lwidth;
214 sprintf(kpsty->
color ,
"%02xffffff",(
int)floor(popac*255+0.5));
217 kstyle->
AddAttrib(
"id",
"BlackLineRandomPoly");
223 sprintf(klsty->
color ,
"ff000000");
225 klsty->
width =lwidth;
227 sprintf(kpsty->
color ,
"00ffffff");
230 kstyle->
AddAttrib(
"id",
"BlackLineEmptyPoly");
236 sprintf(klsty->
color ,
"%02xffffff",(
int)floor(popac*255+0.5));
238 klsty->
width =lwidth*2;
240 sprintf(kpsty->
color ,
"00ffffff");
243 kstyle->
AddAttrib(
"id",
"RandomLineEmptyPoly");
251 sprintf(kfold->
name ,
"Shapefile: %s Type: %s nShapes: %d",
252 filshp, SHPTypeName( nShapeType ), nEntities );
257 for (i=0; i<nshape; i++) {
261 if (pstype[i] == SHPT_NULL) {
267 else if (pstype[i] == SHPT_POINT ||
268 pstype[i] == SHPT_POINTZ ||
269 pstype[i] == SHPT_POINTM) {
272 sprintf(kplace->
name ,
"Shape:%d (%s) nVertices=%d, nParts=%d",
273 i,SHPTypeName(pstype[i]),pnvert[i],pnpart[i]);
275 sprintf(kplace->
styleurl ,
"#RandomLineEmptyPoly");
278 _printf_(
"Warning -- Shape "<< i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\" should not have " << pnpart[i] <<
" > 0 parts.\n\n");
280 _printf_(
"Warning -- Shape " << i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\" should not have " << pnpart[i] <<
" > 1 vertices.\n\n");
284 lat=xNew<double>(pnvert[i]);
285 lon=xNew<double>(pnvert[i]);
287 Xy2llx(lat,lon,pshapx[i],pshapy[i],pnvert[i],sgn,cm,sp);
290 memcpy(lon,pshapx[i],pnvert[i]*
sizeof(
double));
291 memcpy(lat,pshapy[i],pnvert[i]*
sizeof(
double));
294 kpoint->
coords[0]=lon [0];
295 kpoint->
coords[1]=lat [0];
296 kpoint->
coords[2]=pshapz[i][0];
298 xDelete<double>(lon);
299 xDelete<double>(lat);
309 else if (pstype[i] == SHPT_ARC ||
310 pstype[i] == SHPT_ARCZ ||
311 pstype[i] == SHPT_ARCM) {
314 sprintf(kplace->
name ,
"Shape:%d (%s) nVertices=%d, nParts=%d",
315 i,SHPTypeName(pstype[i]),pnvert[i],pnpart[i]);
317 sprintf(kplace->
styleurl ,
"#RandomLineEmptyPoly");
325 lat=xNew<double>(pnvert[i]);
326 lon=xNew<double>(pnvert[i]);
328 Xy2llx(lat,lon,pshapx[i],pshapy[i],pnvert[i],sgn,cm,sp);
331 memcpy(lon,pshapx[i],pnvert[i]*
sizeof(
double));
332 memcpy(lat,pshapy[i],pnvert[i]*
sizeof(
double));
337 for (j=0; j<pnpart[i]; j++) {
340 kline->
ncoord =(j<pnpart[i]-1 ? ppstrt[i][j+1]-ppstrt[i][j] : pnvert[i]-ppstrt[i][j]);
342 for (k=0; k<kline->
ncoord; k++) {
343 kline->
coords[3*k+0]=lon [ppstrt[i][j]+k];
344 kline->
coords[3*k+1]=lat [ppstrt[i][j]+k];
345 kline->
coords[3*k+2]=pshapz[i][ppstrt[i][j]+k];
351 xDelete<double>(lon);
352 xDelete<double>(lat);
362 else if (pstype[i] == SHPT_POLYGON ||
363 pstype[i] == SHPT_POLYGONZ ||
364 pstype[i] == SHPT_POLYGONM) {
377 sprintf(kplace->
name ,
"Shape:%d (%s) nVertices=%d, nParts=%d",
378 i,SHPTypeName(pstype[i]),pnvert[i],pnpart[i]);
380 sprintf(kplace->
styleurl ,
"#BlackLineRandomPoly");
388 lat=xNew<double>(pnvert[i]);
389 lon=xNew<double>(pnvert[i]);
391 Xy2llx(lat,lon,pshapx[i],pshapy[i],pnvert[i],sgn,cm,sp);
394 memcpy(lon,pshapx[i],pnvert[i]*
sizeof(
double));
395 memcpy(lat,pshapy[i],pnvert[i]*
sizeof(
double));
400 for (j=0; j<pnpart[i]; j++) {
404 ncoord=(j<pnpart[i]-1 ? ppstrt[i][j+1]-ppstrt[i][j] : pnvert[i]-ppstrt[i][j]);
407 for (k=ppstrt[i][j]; k<ppstrt[i][j]+ncoord-1; k++)
408 cpsum +=pshapx[i][k]*pshapy[i][k+1 ]-pshapy[i][k]*pshapx[i][k+1 ];
409 cpsum +=pshapx[i][k]*pshapy[i][ppstrt[i][j]]-pshapy[i][k]*pshapx[i][ppstrt[i][j]];
413 if (cpsum < 0 || pnpart[i] == 1) {
424 kring->
ncoord =(j<pnpart[i]-1 ? ppstrt[i][j+1]-ppstrt[i][j] : pnvert[i]-ppstrt[i][j]);
427 for (k=0; k<kring->
ncoord; k++) {
428 kring->
coords[3*(kring->
ncoord-1-k)+0]=lon [ppstrt[i][j]+k];
429 kring->
coords[3*(kring->
ncoord-1-k)+1]=lat [ppstrt[i][j]+k];
430 kring->
coords[3*(kring->
ncoord-1-k)+2]=pshapz[i][ppstrt[i][j]+k];
433 for (k=0; k<kring->
ncoord; k++) {
434 kring->
coords[3*k+0]=lon [ppstrt[i][j]+k];
435 kring->
coords[3*k+1]=lat [ppstrt[i][j]+k];
436 kring->
coords[3*k+2]=pshapz[i][ppstrt[i][j]+k];
447 _printf_(
"Warning -- Shape " << i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\", part " << j <<
", expected to be outer loop (cw).\n\n");
455 kring->
ncoord =(j<pnpart[i]-1 ? ppstrt[i][j+1]-ppstrt[i][j] : pnvert[i]-ppstrt[i][j]);
457 for (k=0; k<kring->
ncoord; k++) {
458 kring->
coords[3*k+0]=lon [ppstrt[i][j]+k];
459 kring->
coords[3*k+1]=lat [ppstrt[i][j]+k];
460 kring->
coords[3*k+2]=pshapz[i][ppstrt[i][j]+k];
473 xDelete<double>(lon);
474 xDelete<double>(lat);
484 else if (pstype[i] == SHPT_MULTIPOINT ||
485 pstype[i] == SHPT_MULTIPOINTZ ||
486 pstype[i] == SHPT_MULTIPOINTM) {
489 sprintf(kplace->
name ,
"Shape:%d (%s) nVertices=%d, nParts=%d",
490 i,SHPTypeName(pstype[i]),pnvert[i],pnpart[i]);
492 sprintf(kplace->
styleurl ,
"#RandomLineEmptyPoly");
495 _printf_(
"Warning -- Shape " << i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\" should not have " << pnpart[i] <<
" > 0 parts.\n\n");
503 lat=xNew<double>(pnvert[i]);
504 lon=xNew<double>(pnvert[i]);
506 Xy2llx(lat,lon,pshapx[i],pshapy[i],pnvert[i],sgn,cm,sp);
509 memcpy(lon,pshapx[i],pnvert[i]*
sizeof(
double));
510 memcpy(lat,pshapy[i],pnvert[i]*
sizeof(
double));
515 for (j=0; j<pnvert[i]; j++) {
518 kpoint->
coords[0]=lon [j];
519 kpoint->
coords[1]=lat [j];
520 kpoint->
coords[2]=pshapz[i][j];
526 xDelete<double>(lon);
527 xDelete<double>(lat);
537 else if (pstype[i] == SHPT_MULTIPATCH) {
538 _printf_(
"Warning -- Shape " << i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\" will be ignored.\n\n");
545 _printf_(
"Warning -- Shape " << i <<
" of type \"" << SHPTypeName( pstype[i] ) <<
"\" will be ignored.\n\n");
558 _printf0_(
"Writing kml document to file.\n");
559 fid=fopen(filkml,
"w");
560 fprintf(fid,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
561 kfile->
Write(fid,indent);
565 for (i=nshape-1; i>=0; i--) {
566 xDelete<double>((pshapm[i]));
567 xDelete<double>((pshapz[i]));
568 xDelete<double>((pshapy[i]));
569 xDelete<double>((pshapx[i]));
571 xDelete<double*>(pshapm);
572 xDelete<double*>(pshapz);
573 xDelete<double*>(pshapy);
574 xDelete<double*>(pshapx);
575 xDelete<int>(pnvert);
576 for (i=nshape-1; i>=0; i--) {
577 xDelete<int>((pptype[i]));
578 xDelete<int>((ppstrt[i]));
580 xDelete<int*>(pptype);
581 xDelete<int*>(ppstrt);
582 xDelete<int>(pnpart);
583 xDelete<int>(pstype);
587 _printf_(
"Shp2Kmlx Module -- " << ((
double)(clock1-clock0))/CLOCKS_PER_SEC <<
" CPU seconds; " << difftime(time1,time0) <<
" elapsed seconds.\n\n\n");
591 #else //ifdef _HAVE_SHAPELIB_