[Shapelib] Adding a polygon to a shapefile
Tom Kazimiers
2voodoo at gmx.de
Sun Feb 17 18:34:51 EST 2008
Hi Joaquin,
as fas as I understood you can not make this call:
psObject = SHPCreateObject(nShapeType, ShapeId, nParts, panParts, NULL,
vertexcount, X, Y, NULL, NULL );
have you checked if osObject is null afterwards? Please try it.
Could it be that the first and the last vertex of a polygon need to be
the same? In your code they are different.
For my writing I use: SHPCreateSimpleObject which implys some NULLs of
yours - maybe you could try this, too.
bye,
Tom
Joaquin Perez Valera schrieb:
> Hi
>
> I can create shapefiles and they are valid when I work with
> ArcCatalog. But the shapefiles are empty.
>
> Now I'm trying to add objects to my shapefile. I want to add polygons.
>
> First I create a shapefile and a dbf file with an a simple column.
> Then it becomes valid for ArcCatalog.
> Then I create 2 arrays of 7 elements X[7] and Y[7], and give a valor
> to each element. Seven elements because
> I want to draw a polygon of six vertices.
>
> After it I use psObject = SHPCreateObject to create my polygon and
> after SHPWriteObject( hSHP, -1, psObject ); to write it
> in my shapefile.
>
> It's obviously that I'm doing something wrong.
> But I don't know what.
>
> Can somebody help me or say me what I'm doing wrong?
>
> Thanks.
>
>
> [CODE]
> #include <iostream>
> #include <cstdlib>
> #include "shapefil.h"
> #include "string.h"
>
>
> using namespace std;
> int main()
>
> {
> SHPHandle hSHP;
> DBFHandle hDBF;
> int nShapeType, nWidth = 3, vertexcount, *panParts,
> ShapeId, nParts;
>
> string shape_name, Col1;
> Col1= "Column";
>
> SHPObject *psObject;
>
>
> cout << "Name of the new Shapefile" << endl;
> getline(cin,shape_name);
>
> cout << "The shapefile is: " << shape_name << endl;
>
> //Here I define the type of shapefile, the 5 is for a polygon.
> nShapeType=5;
>
>
> hSHP = SHPCreate( shape_name.c_str(), nShapeType );
>
> hDBF = DBFCreate( shape_name.c_str() );
>
>
> cout <<"The shape has "<< DBFGetFieldCount( hDBF ) <<" columns" <<
> endl;
>
>
>
> DBFAddField( hDBF, Col1.c_str(), FTInteger, nWidth, 0 );
> cout <<"Now the shape has " << DBFGetFieldCount( hDBF ) << " columns";
>
> //At this point the shape is valid for ArcView
>
> //Here I define an array of seven elements and I'll give a
> coordinate for each element
>
> double X[7], Y[7];
> X[0] = 220764;
> Y[0]= 2343777;
> X[1] = 220610;
> Y[1]= 2343627;
> X[2] = 220818;
> Y[2]= 2343477;
> X[3] = 221109;
> Y[3]= 2343777;
> X[4] = 230504;
> Y[4]= 2343627;
> X[5] = 221102;
> Y[5]= 2343477;
> X[6] = X[0];
> Y[6] = Y[0];
>
>
> //I know the number of vertex is 7, six of my polygon and an extra
> //vertex to close the polygon.
>
> vertexcount = 7;
>
> //I can't understand what is exactly the panParts variable. :(
>
> panParts[0] = 1;
> //What is nParts? For me my polygon has 1 part, an entire part. It
> is true?
> nParts = 1;
> //I give a shape id for this unique object.
> ShapeId=1;
>
> //From the shp_api I took this line of code to create a feature/object
> //SHPCreateObject( nSHPType, iShape, nParts, panPartStart,
> panPartType,int nVertices, *padfX, * padfY, *padfZ, *padfM );
> //I have the nShapeType;
> //I give the ShapeId
> //I give the nParts
> //I don't know what is panParts
> //panPartType is NULL because it isn't a multipatch file
> //I know the numer of vertex
> //I now the number of vertex I have two arrays of coordinates.
> //padfZ and padfM are NULL, zero.
>
> psObject = SHPCreateObject(nShapeType, ShapeId, nParts, panParts,
> NULL, vertexcount, X, Y, NULL, NULL );
>
> SHPWriteObject( hSHP, -1, psObject );
>
> SHPDestroyObject( psObject );
>
> DBFClose( hDBF );
>
> SHPClose( hSHP );
>
>
> return 0;
> }
>
> [/CODE]
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Shapelib mailing list
> Shapelib at lists.maptools.org
> http://lists.maptools.org/mailman/listinfo/shapelib
>
More information about the Shapelib
mailing list