[vtkusers] Re2: How can I add ESRI Shape Files supporting to VTK?
Malcolm Drummond
malcolm at geovision.co.za
Thu Nov 7 03:00:44 EST 2002
Hi Alexey
I guess I'm going paddling over Christmas :)
Malcolm
----- Original Message -----
From: "Alexey Yutkin" <yutkin at geol.msu.ru>
To: <vtkusers at public.kitware.com>
Sent: Thursday, November 07, 2002 12:28 AM
Subject: [vtkusers] Re2: How can I add ESRI Shape Files supporting to VTK?
> > Have you read the shapefile white paper on the ESRI site?
> Yes.
>
>
>
> My C++ way:
>
> I am download latest source code from Frank Warmerdam Shapelib library
and
> "ESRI Shapefile Technical Description" from ESRI web site.
> I put source code from this library into VTK/Utilities/shapelib and make
> CMakeLists.txt in this directory.
> -----------------------------------------------------------
> File VTK/Utilities/shapelib/CMakeLists.txt:
> -----------------------------------------------------------
>
> PROJECT(VTKSHP)
>
> # source files for shp
> SOURCE_FILES(SHP_SRCS
> dbfopen.c shpopen.c
> )
>
> CONFIGURE_FILE(
> ${VTKSHP_SOURCE_DIR}/.NoDartCoverage
> ${VTKSHP_BINARY_DIR}/.NoDartCoverage)
>
> IF(WIN32)
> IF(BUILD_SHARED_LIBS)
> ADD_DEFINITIONS(-DSHAPELIB_DLLEXPORT)
> ELSE(BUILD_SHARED_LIBS)
> ADD_DEFINITIONS()
> ENDIF(BUILD_SHARED_LIBS)
> ENDIF(WIN32)
>
> ADD_LIBRARY(vtkshp SHP_SRCS)
>
> INSTALL_TARGETS(/lib/vtk vtkshp)
> -----------------------------------------------------------
> Also I modify file VTK\Utilities\CMakeLists.txt
> (add shapelib to SUBDIRS before Doxygen directory)
> -----------------------------------------------------------
> File VTK/Utilities/CMakeLists.txt:
> -----------------------------------------------------------
>
> # build zlib, png, jpeg and shapelib
> SUBDIRS(zlib png jpeg shapelib Doxygen)
> -----------------------------------------------------------
> Is this simple way correct?
> -------------------------------------------------------------------------
--
> ---------------------------------------------
> Build is ok, now I must write some classes for this library.
> -----------------------------------------------------------
> File VTK/IO/CMakeLists.txt:
> -----------------------------------------------------------
> SOURCE_FILES( IO_SRCS
> vtkESRI_PolygonZWriter -
> ...
> -----------------------------------------------------------
>
> Now, I need to add the VTK-like C++ wrap for this library. For example,
> PolygonZWriter case:
> -----------------------------------------------------------
> vtkESRI_PolygonZWriter .h file:
> -----------------------------------------------------------
> class VTK_IO_EXPORT vtkESRI_PolygonZWriter : public vtkPolyDataWriter
> {
> public:
> static vtkESRI_PolygonZWriter *New();
> vtkTypeMacro(vtkESRI_PolygonZWriter,vtkPolyDataWriter);
>
> protected:
> vtkESRI_PolygonZWriter();
> ~vtkESRI_PolygonZWriter() {};
>
> void WriteData();
>
> private:
> vtkESRI_PolygonZWriter(const vtkESRI_PolygonZWriter&); // Not
> implemented.
> void operator=(const vtkESRI_PolygonZWriter&); // Not implemented.
> };
> -----------------------------------------------------------
> .cpp file, general function:
> -----------------------------------------------------------
> void vtkESRI_PolygonZWriter::WriteData()
> {
> vtkPoints *pts;
> vtkCellArray *polys;
>
> vtkPolyData *input = this->GetInput();
> int numCells = input->GetNumberOfCells();
> vtkCellData *cd= input->GetCellData();
> vtkDataArray *scalars = cd->GetScalars();
>
> int dataType;
> int numComp;
> if ( scalars && scalars->GetNumberOfTuples() > 0 )
> {
> dataType = scalars->GetDataType();
> numComp = scalars->GetNumberOfComponents();
> }
>
> polys = input->GetPolys();
> pts = input->GetPoints();
> if (pts == NULL || polys == NULL )
> {
> vtkErrorMacro(<<"No data to write!");
> return;
> }
>
> if ( this->FileName == NULL)
> {
> vtkErrorMacro(<< "Please specify FileName to write");
> return;
> }
>
> FILE *fp;
> float n[3], *v;
> double *x, *y, *z;
> vtkIdType npts;
> vtkIdType *indx;
>
> if ((fp = fopen(this->FileName, "w")) == NULL)
> {
> vtkErrorMacro(<< "Couldn't open file: " << this->FileName);
> return;
> }
> vtkDebugMacro("Writing ESRI POLYGONZ shape file ");
>
> SHPHandle hSHPHandle = SHPCreate( this->FileName, SHPT_POLYGONZ );
> DBFHandle psDBF = DBFCreate( this->FileName );
> DBFAddField(psDBF, "Id", FTInteger, 10, 0);
> if ( scalars && scalars->GetNumberOfTuples() > 0 )
> {
>
> switch (dataType)
> {
> case VTK_BIT:
> DBFAddField(psDBF, scalars->GetName(), FTInteger, 1, 0);
> case VTK_CHAR:
> case VTK_UNSIGNED_CHAR:
> DBFAddField(psDBF, scalars->GetName(), FTInteger, 4, 0);
> break;
> case VTK_SHORT:
> case VTK_UNSIGNED_SHORT:
> DBFAddField(psDBF, scalars->GetName(), FTInteger, 8, 0);
> break;
>
> case VTK_INT:
> case VTK_ID_TYPE:// currently writing vtkIdType as int.
> case VTK_UNSIGNED_INT:
> DBFAddField(psDBF, scalars->GetName(), FTInteger, 16, 0);
> break;
>
> case VTK_LONG:
> case VTK_UNSIGNED_LONG:
> DBFAddField(psDBF, scalars->GetName(), FTInteger, 32, 0);
> break;
>
> case VTK_FLOAT:
> DBFAddField(psDBF, scalars->GetName(), FTDouble, 10, 2);
> break;
> case VTK_DOUBLE:
> DBFAddField(psDBF, scalars->GetName(), FTDouble, 16, 6);
> break;
> }
> }
> int j=0;
> for (polys->InitTraversal(); polys->GetNextCell(npts,indx); )
> {
> // write geometry
> x = new double[npts+1];
> y = new double[npts+1];
> z = new double[npts+1];
> for(int i=0; i<npts; i++)
> {
> v = pts->GetPoint(indx[i]);
> x[i] = v[0];
> y[i] = v[1];
> z[i] = v[2];
> }
> x[npts] = x[0];
> y[npts] = y[0];
> z[npts] = z[0];
> SHPObject *pObject = SHPCreateSimpleObject( SHPT_POLYGONZ, npts+1,
x,y,z);
> SHPWriteObject(hSHPHandle, -1, pObject );
> DBFWriteIntegerAttribute( psDBF, j, 0, j+1);
> SHPDestroyObject(pObject);
> delete x; delete y; delete z;
> // write attribute data
> if ( scalars && scalars->GetNumberOfTuples() > 0 )
> {
>
> float fv = ((vtkFloatArray *)scalars)->GetValue(j);
> //DBFWriteIntegerAttribute( psDBF, j, 0, j);
> DBFWriteDoubleAttribute( psDBF, j, 1, fv);
> j++;
> }
>
> }
> SHPClose(hSHPHandle);
> DBFClose(psDBF);
> }
>
>
>
>
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at:
<http://public.kitware.com/cgi-bin/vtkfaq>
> Follow this link to subscribe/unsubscribe:
> http://public.kitware.com/mailman/listinfo/vtkusers
>
>
More information about the vtkusers
mailing list