#include "StdAfx.h" #include "Fshape.h" #include //************************************************************************** int Fshape::inv_4(int *pb) { char (*pc)[],(*pd)[]; int j,dw; dw = *pb; pc = (char (*)[]) &dw; pd = (char (*)[]) pb; for (j=0; j<4; j++) (*pd)[j] = (*pc)[3-j]; return(dw); } //************************************************************************** Fshape::Fshape(void) { } //************************************************************************** Fshape::~Fshape(void) { } //************************************************************************** bool Fshape::leeHead(Cb_file *file) { f = file; if(!f->lee(&head, sizeof(head))) return false; inv_4(&head.code); inv_4(&head.nb); head.nb = 2 * head.nb- sizeof(head); switch(head.tipo) { case(Point): nc = 2; ReadType = Rpoint; break; case(PolyLine): nc = 2; ReadType = RPolyLine; break; case(Polygon): nc = 2; ReadType = Rpolygon; break; case(MultiPoint): nc = 2; ReadType = RMpoint; break; case(PointZ): nc = 4; ReadType = Rpoint; break; case(PolyLineZ): nc = 4; ReadType = RPolyLine; break; case(PolygonZ): nc = 4; ReadType = Rpolygon; break; case(MultiPointZ): nc = 4; ReadType = RMpoint; break; case(PointM): nc = 3; ReadType = Rpoint; break; case(PolyLineM): nc = 3; ReadType = RPolyLine; break; case(PolygonM): nc = 3; ReadType = Rpolygon; break; case(MultiPointM): nc = 3; ReadType = RMpoint; break; default: return false; } return true; } //************************************************************************** bool Fshape::LeeRecord() { //lee cab int nb; if(head.nb<=0) return false; if(!f->lee(&headr, sizeof(headr))) return false; head.nb-=sizeof(headr); inv_4(&headr.nrec); inv_4(&headr.nb); //tipo incluido en cabecera headr.nb = 2 * headr.nb-sizeof(int); //lee contenido record; bufRecord.n = 0; if(!(bufRecord+= headr.nb)) return false; bufRecord.n = headr.nb; if(!f->lee(&bufRecord[0], bufRecord.n)) return false; head.nb-=bufRecord.n; numPart = 0; nb = 0; maxC = NULL; mimC = NULL; mimaM = NULL; mimaZ = NULL; ptosM = NULL; ptos = NULL; ptosZ = NULL; switch (ReadType) { case Rpoint: numPart = 0; ptos = (double*)&bufRecord[nb];//salta el tipo tc = (bufRecord.n-nb)/sizeof(double); npt =tc/nc; break; case RMpoint: mimC = (double*)&bufRecord[nb]; nb +=2*sizeof(double); maxC = (double*)&bufRecord[nb]; nb +=2*sizeof(double); npt = *(int*)&bufRecord[nb]; nb += sizeof(int); ptos = (double*)&bufRecord[nb];//salta el tipo nb+=sizeof(double)*2*npt; if(nc>2) { if(nc<4) { mimaM = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosM = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); } else { mimaZ = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosZ = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); mimaM = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosM = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); } } tc = npt*2; break; case RPolyLine: case Rpolygon: mimC = (double*)&bufRecord[nb]; nb +=2*sizeof(double); maxC = (double*)&bufRecord[nb]; nb +=2*sizeof(double); numPart = *(int*)&bufRecord[nb]; nb += sizeof(int); npt = *(int*)&bufRecord[nb]; nb += sizeof(int); part = (int*)&bufRecord[nb]; nb += sizeof(int)*numPart; ptos = (double*)&bufRecord[nb];//salta el tipo nb+=sizeof(double)*2*npt; if(nc>2) { if(nc<4) { mimaM = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosM = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); } else { mimaZ = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosZ = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); mimaM = (double*)&bufRecord[nb]; nb+=2*sizeof(double); ptosM = (double*)&bufRecord[nb]; nb+=npt*sizeof(double); } } tc = npt*2; break; default: return false; } return true; } //************************************************************************** double* Fshape::get(int ip, int i) { if(ip>numPart) return NULL; int nn = part[ip]*2+i*2; if((nn+2)>tc) return NULL; return &ptos[nn]; } //************************************************************************** double* Fshape::get( int i) { if(i>=npt) return NULL; return &ptos[i*2]; } //************************************************************************** int Fshape::getNp() { return numPart; } //************************************************************************** int Fshape::getType() { return ReadType; } //************************************************************************** int Fshape::getNcoord() { return nc; } //************************************************************************** int Fshape::getNPt(int ip) { if(ip>numPart) return -1; if((numPart-1)>ip) return part[ip+1]-part[ip]; return npt - part[ip]; } //************************************************************************** int Fshape::getNPt() { return npt; } //************************************************************************** bool Fshape::set(int type/*FshpReadType*/,int ncoord, Cb_file *file, Cb_file *file_shx) { f_shx = file_shx; memset(&head,0,sizeof(head)); head.mima[0][0] = head.mima[0][1]= DBL_MAX; head.mima[1][0] = head.mima[1][1]= -DBL_MAX; ReadType=type; nc = ncoord; head.mimam[0]=head.mimam[1]=0; head.mimaz[0]=head.mimam[1]=0; head.ver =1000; head.code = 9994; //inv_4(&head.ver); inv_4(&head.code); head.nb = sizeof(head); headr.nb = 0; headr.nrec=0; f = file; if(nc<2 || nc>4) return false; switch(type) { case(Rpoint): if(nc<=2) head.tipo = Point; else if(nc<=3) head.tipo = PointM; else head.tipo = PointZ; break; case(RMpoint): if(nc<=2) head.tipo = MultiPoint; else if(nc<=3) head.tipo = MultiPointM; else head.tipo = MultiPointZ; break; case(RPolyLine): if(nc<=2) head.tipo = PolyLine; else if(nc<=3) head.tipo = PolyLineM; else head.tipo = PolyLineZ; break; case(Rpolygon): if(nc<=2) head.tipo = Polygon; else if(nc<=3) head.tipo = PolygonM; else head.tipo = PolygonZ; break; default: return false; } headr.tipo = head.tipo; if(f_shx && !f_shx->escribe(&head, sizeof(head))) return false; return (f->escribe(&head, sizeof(head))==TRUE); } //************************************************************************** bool Fshape::grabaRecord(Cgarray *pts) { int aux; npt = pts->n/nc; if(npt<=0) return false; double mimaxr[2][2]; mimaxr[0][0] = mimaxr[0][1]= DBL_MAX; mimaxr[1][0] = mimaxr[1][1]= -DBL_MAX; double mimaxZ[2]; double mimaxM[2]; mimaxZ[0] = mimaxM[0]= DBL_MAX; mimaxZ[1] = mimaxM[1]= -DBL_MAX; ptosM = NULL; ptosZ = NULL; int ii = 0; switch(ReadType) { case(Rpoint): { headr.nb =sizeof(int)+sizeof(double)*nc; headr.nb = headr.nb/2; inv_4(&headr.nb); for(int i=0; iescribe(&headr, sizeof(headr))) return false; inv_4(&headr.nrec); aux = head.nb/2; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; head.nb+=sizeof(headr); //graba offset aux = headr.nb; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; ii = i*nc; ptos = &(*pts)[ii]; //pilla minimo y maximo if(mimaxr[0][0]>ptos[0]) mimaxr[0][0]=ptos[0]; if(mimaxr[0][1]>ptos[1]) mimaxr[0][1]=ptos[1]; if(mimaxr[1][0]escribe(ptos, sizeof(double)*nc)) return false; head.nb+=sizeof(double)*nc; } } break; case(RMpoint): { headr.nb = sizeof(double)*nc*npt+sizeof(int); headr.nb = inv_4(&headr.nb); headr.nrec++; headr.nrec=inv_4(&headr.nrec); if(!f->escribe(&headr, sizeof(headr))) return false; headr.nrec=inv_4(&headr.nrec); aux = head.nb/2; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; head.nb+=sizeof(headr); //graba offset aux = headr.nb; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; if(nc>3) { ptosZ = &(*pts)[npt*3]; ptosM = &(*pts)[npt*3]; } else if(nc>2) { ptosM = &(*pts)[npt*2]; //mimam } for(int i=0; iptos[0]) mimaxr[0][0]=ptos[0]; if(mimaxr[0][1]>ptos[1]) mimaxr[0][1]=ptos[1]; if(mimaxr[1][0]ptosM[i]) mimaxM[0]=ptosM[i]; if(mimaxM[1]ptosZ[i]) mimaxZ[0]=ptosZ[i]; if(mimaxZ[1]escribe(mimaxr, sizeof(double)*4)) return false; head.nb+=sizeof(double)*4; if(!f->escribe(&npt, sizeof(npt))) return false; head.nb+=sizeof(npt); if(!f->escribe(&(*pts)[0], sizeof(double)*nc*npt)) return false; head.nb+=sizeof(double)*2*npt; if(ptosZ) { if(!f->escribe(mimaxZ, sizeof(double)*2)) return false; head.nb+=sizeof(double)*2; if(!f->escribe(ptosZ, sizeof(double)*npt)) return false; head.nb+=sizeof(double)*npt; } if(ptosM) { if(!f->escribe(mimaxM, sizeof(double)*2)) return false; head.nb+=sizeof(double)*2; if(!f->escribe(ptosM, sizeof(double)*npt)) return false; head.nb+=sizeof(double)*npt; } } break; default: return false; } //pilla coordenadas maximas y minimas totales del shp if(head.mima[0][0]>mimaxr[0][0]) head.mima[0][0]=mimaxr[0][0]; if(head.mima[0][1]>mimaxr[0][1]) head.mima[0][1]=mimaxr[0][1]; if(head.mima[1][0] *pts, Cgarray*parts) { int aux; npt = pts->n/nc; if(npt<=0) return false; double mimaxr[2][2]; mimaxr[0][0] = mimaxr[0][1]= DBL_MAX; mimaxr[1][0] = mimaxr[1][1]= -DBL_MAX; double mimaxZ[2]; double mimaxM[2]; mimaxZ[0] = mimaxM[0]= DBL_MAX; mimaxZ[1] = mimaxM[1]= -DBL_MAX; ptosM = NULL; ptosZ = NULL; headr.tipo = head.tipo; int ii = 0; switch(ReadType) { case(RPolyLine): case(Rpolygon): { headr.nrec++; inv_4(&headr.nrec); headr.nb = sizeof(int)+sizeof(double)*4+2*sizeof(int)+ +sizeof(int)*parts->n+sizeof(double)*2*npt; if(nc>3) { ptosZ = &(*pts)[npt*3]; ptosM = &(*pts)[npt*3]; headr.nb+=2*(sizeof(double)*2+sizeof(double)*npt); } else if(nc>2) { headr.tipo = PolyLineZ; ptosM = &(*pts)[npt*2]; headr.nb+=sizeof(double)*2+sizeof(double)*npt; //mimam } headr.nb = headr.nb/2; inv_4(&headr.nb); if(!f->escribe(&headr, sizeof(headr))) return false; inv_4(&headr.nrec); inv_4(&headr.nb); aux = head.nb/2; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; head.nb+=sizeof(headr); //graba offset aux = headr.nb; inv_4(&aux); if(f_shx && !f_shx->escribe(&aux, sizeof(aux))) return false; for(int i=0; iptos[0]) mimaxr[0][0]=ptos[0]; if(mimaxr[0][1]>ptos[1]) mimaxr[0][1]=ptos[1]; if(mimaxr[1][0]ptosM[i]) mimaxM[0]=ptosM[i]; if(mimaxM[1]ptosZ[i]) mimaxZ[0] = ptosZ[i]; if(mimaxZ[1]escribe(mimaxr, sizeof(double)*4)) return false; head.nb+=sizeof(double)*4; if(!f->escribe(&parts->n, sizeof(parts->n))) return false; head.nb+=sizeof(parts->n); if(!f->escribe(&npt, sizeof(npt))) return false; head.nb+=sizeof(npt); if(!f->escribe(&(*parts)[0], sizeof(int)*parts->n)) return false; head.nb+=sizeof(int)*parts->n; if(!f->escribe(&(*pts)[0], sizeof(double)*2*npt)) return false; head.nb+=sizeof(double)*2*npt; if(ptosZ) { if(!f->escribe(mimaxZ, sizeof(double)*2)) return false; head.nb+=sizeof(double)*2; if(!f->escribe(ptosZ, sizeof(double)*npt)) return false; head.nb+=sizeof(double)*npt; } if(ptosM) { if(!f->escribe(mimaxM, sizeof(double)*2)) return false; head.nb+=sizeof(double)*2; if(!f->escribe(ptosM, sizeof(double)*npt)) return false; head.nb+=sizeof(double)*npt; } } break; default: return false; } //pilla coordenadas maximas y minimas totales del shp if(head.mima[0][0]>mimaxr[0][0]) head.mima[0][0]=mimaxr[0][0]; if(head.mima[0][1]>mimaxr[0][1]) head.mima[0][1]=mimaxr[0][1]; if(head.mima[1][0]irAini()) return false; if(f_shx && !f_shx->irAini()) return false; head.nb = head.nb/2; inv_4(&head.nb); head.ver =1000; head.code =9994; inv_4(&head.code); if(!f->escribe(&head, sizeof(head))) return false; int auxi = head.nb; head.nb = 100+headr.nrec*2*sizeof(int); head.nb = head.nb/2; inv_4(&head.nb); if(f_shx && !f_shx->escribe(&head, sizeof(head))) return false; if(f_shx && !f_shx->irAfin()) return false; return (f->irAfin()== TRUE); } //**************************************************************************