22 #include "../postgis_config.h"
38 #include <sys/param.h>
41 #include "../liblwgeom/stringbuffer.h"
42 #include "../liblwgeom/liblwgeom.h"
43 #include "../liblwgeom/lwgeom_log.h"
46 #define MAX_DBF_FIELD_SIZE 254
50 static int reverse_points(
int num_points,
double *
x,
double *
y,
double *z,
double *m);
51 static int is_clockwise(
int num_points,
double *
x,
double *
y,
double *z);
83 err = vasprintf(&
value, format, ap);
94 const uint8_t ndr_nan[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f};
97 memcpy(&double_nan, ndr_nan, 8);
108 double *xpts, *ypts, *zpts, *mpts;
111 xpts =
malloc(
sizeof(
double));
112 ypts =
malloc(
sizeof(
double));
113 zpts =
malloc(
sizeof(
double));
114 mpts =
malloc(
sizeof(
double));
125 LWDEBUGF(4,
"Point: %g %g %g %g", xpts[0], ypts[0], zpts[0], mpts[0]);
144 double *xpts, *ypts, *zpts, *mpts;
154 for (i = 0; i < lwmultipoint->
ngeoms; i++)
163 LWDEBUGF(4,
"MultiPoint %d - Point: %g %g %g %g", i, xpts[i], ypts[i], zpts[i], mpts[i]);
183 double *xpts, *ypts, *zpts, *mpts;
185 int *shpparts, shppointtotal = 0, shppoint = 0;
191 for (i = 0; i < lwpolygon->
nrings; i++)
195 xpts =
malloc(
sizeof(
double) * shppointtotal);
196 ypts =
malloc(
sizeof(
double) * shppointtotal);
197 zpts =
malloc(
sizeof(
double) * shppointtotal);
198 mpts =
malloc(
sizeof(
double) * shppointtotal);
200 LWDEBUGF(4,
"Total number of points: %d", shppointtotal);
203 for (i = 0; i < lwpolygon->
nrings; i++)
206 shpparts[i] = shppoint;
212 xpts[shppoint] = p4d.
x;
213 ypts[shppoint] = p4d.
y;
214 zpts[shppoint] = p4d.
z;
215 mpts[shppoint] = p4d.
m;
217 LWDEBUGF(4,
"Polygon Ring %d - Point: %g %g %g %g", i, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
230 &xpts[shpparts[i]], &ypts[shpparts[i]], NULL) )
232 LWDEBUG(4,
"Outer ring not clockwise, forcing clockwise\n");
235 &xpts[shpparts[i]], &ypts[shpparts[i]],
236 &zpts[shpparts[i]], &mpts[shpparts[i]]);
242 &xpts[shpparts[i]], &ypts[shpparts[i]], NULL) )
244 LWDEBUGF(4,
"Inner ring %d not counter-clockwise, forcing counter-clockwise\n", i);
247 &xpts[shpparts[i]], &ypts[shpparts[i]],
248 &zpts[shpparts[i]], &mpts[shpparts[i]]);
271 double *xpts, *ypts, *zpts, *mpts;
273 int *shpparts, shppointtotal = 0, shppoint = 0, shpringtotal = 0, shpring = 0;
278 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
280 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
288 shpparts =
malloc(
sizeof(
int) * shpringtotal);
291 xpts =
malloc(
sizeof(
double) * shppointtotal);
292 ypts =
malloc(
sizeof(
double) * shppointtotal);
293 zpts =
malloc(
sizeof(
double) * shppointtotal);
294 mpts =
malloc(
sizeof(
double) * shppointtotal);
296 LWDEBUGF(4,
"Total number of rings: %d Total number of points: %d", shpringtotal, shppointtotal);
299 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
301 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
304 shpparts[shpring] = shppoint;
306 LWDEBUGF(4,
"Ring offset: %d", shpring);
312 xpts[shppoint] = p4d.
x;
313 ypts[shppoint] = p4d.
y;
314 zpts[shppoint] = p4d.
z;
315 mpts[shppoint] = p4d.
m;
317 LWDEBUGF(4,
"MultiPolygon %d Polygon Ring %d - Point: %g %g %g %g", i, j, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
330 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
332 LWDEBUG(4,
"Outer ring not clockwise, forcing clockwise\n");
335 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
336 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
342 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
344 LWDEBUGF(4,
"Inner ring %d not counter-clockwise, forcing counter-clockwise\n", i);
347 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
348 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
375 double *xpts, *ypts, *zpts, *mpts;
394 LWDEBUGF(4,
"Linestring - Point: [%u] %g %g %g %g", i, xpts[i], ypts[i], zpts[i], mpts[i]);
414 double *xpts, *ypts, *zpts, *mpts;
416 int *shpparts, shppointtotal = 0, shppoint = 0;
419 shpparts =
malloc(
sizeof(
int) * lwmultilinestring->
ngeoms);
422 for (i = 0; i < lwmultilinestring->
ngeoms; i++)
425 LWDEBUGF(3,
"Total number of points: %d", shppointtotal);
428 xpts =
malloc(
sizeof(
double) * shppointtotal);
429 ypts =
malloc(
sizeof(
double) * shppointtotal);
430 zpts =
malloc(
sizeof(
double) * shppointtotal);
431 mpts =
malloc(
sizeof(
double) * shppointtotal);
434 for (i = 0; i < lwmultilinestring->
ngeoms; i++)
437 shpparts[i] = shppoint;
443 xpts[shppoint] = p4d.
x;
444 ypts[shppoint] = p4d.
y;
445 zpts[shppoint] = p4d.
z;
446 mpts[shppoint] = p4d.
m;
448 LWDEBUGF(4,
"Linestring %d - Point: %g %g %g %g", i, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
476 for (i=0; i <num_points; i++)
514 double x_change,y_change,area;
515 double *x_new, *y_new;
518 x_new = (
double *)
malloc(
sizeof(
double) * num_points);
519 y_new = (
double *)
malloc(
sizeof(
double) * num_points);
524 for (i=0; i < num_points ; i++)
526 x_new[i] =
x[i] - x_change;
527 y_new[i] =
y[i] - y_change;
530 for (i=0; i < num_points - 1; i++)
533 area += (
x[i] *
y[i+1]) - (
y[i] *
x[i+1]);
569 "select max(octet_length(\"%s\"::text)) from \"%s\".\"%s\"",
570 fname, schema, table);
576 "select max(octet_length(\"%s\"::text)) from \"%s\"",
584 if ( !
res || PQresultStatus(
res) != PGRES_TUPLES_OK )
586 printf(
_(
"Querying for maximum field length: %s"),
587 PQerrorMessage(
conn));
591 if (PQntuples(
res) <= 0 )
596 size = atoi(PQgetvalue(
res, 0, 0));
623 return "MultiPointZ";
631 return "MultiPointM";
649 return "****************";
684 buf[0] = toupper(in[0]);
709 hexewkb =
malloc(size * 2 + 1);
710 for (i=0; i<size; ++i)
deparse_hex(ewkb[i], &hexewkb[i * 2]);
711 hexewkb[size * 2] =
'\0';
726 char *pszFullname, *pszBasename;
729 char *pszFilename = state->
shp_file;
730 char *schema = state->
schema;
731 char *table = state->
table;
736 char esc_schema[1024];
737 char esc_table[1024];
738 char esc_geo_col_name[1024];
746 PQescapeStringConn(state->
conn, esc_table, table, strlen(table), &error);
747 PQescapeStringConn(state->
conn, esc_geo_col_name, geo_col_name, strlen(geo_col_name), &error);
760 PQescapeStringConn(state->
conn, esc_schema, schema, strlen(schema), &error);
762 "SELECT COALESCE((SELECT sr.srtext "
763 " FROM geometry_columns As gc INNER JOIN spatial_ref_sys sr ON sr.srid = gc.srid "
764 " WHERE gc.f_table_schema = '%s' AND gc.f_table_name = '%s' AND gc.f_geometry_column = '%s' LIMIT 1), "
765 " (SELECT CASE WHEN COUNT(DISTINCT sr.srid) > 1 THEN 'm' ELSE MAX(sr.srtext) END As srtext "
766 " FROM \"%s\".\"%s\" As g INNER JOIN spatial_ref_sys sr ON sr.srid = ST_SRID((g.\"%s\")::geometry)) , ' ') As srtext ",
767 esc_schema, esc_table, esc_geo_col_name, schema, table, geo_col_name);
772 "SELECT COALESCE((SELECT sr.srtext "
773 " FROM geometry_columns As gc INNER JOIN spatial_ref_sys sr ON sr.srid = gc.srid "
774 " WHERE gc.f_table_name = '%s' AND gc.f_geometry_column = '%s' AND pg_table_is_visible((gc.f_table_schema || '.' || gc.f_table_name)::regclass) LIMIT 1), "
775 " (SELECT CASE WHEN COUNT(DISTINCT sr.srid) > 1 THEN 'm' ELSE MAX(sr.srtext) END as srtext "
776 " FROM \"%s\" As g INNER JOIN spatial_ref_sys sr ON sr.srid = ST_SRID((g.\"%s\")::geometry)), ' ') As srtext ",
777 esc_table, esc_geo_col_name, table, geo_col_name);
782 res = PQexec(state->
conn, query);
784 if ( !
res || PQresultStatus(
res) != PGRES_TUPLES_OK )
792 for (i=0; i < PQntuples(
res); i++)
794 srtext = PQgetvalue(
res, i, 0);
795 if (strcmp(srtext,
"m") == 0)
797 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"WARNING: Mixed set of spatial references. No prj file will be generated"));
804 if (srtext[0] ==
' ')
806 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"WARNING: Cannot determine spatial reference (empty table or unknown spatial ref). No prj file will be generated."));
817 pszBasename = (
char *)
malloc(strlen(pszFilename)+5);
818 strcpy( pszBasename, pszFilename );
819 for ( i = strlen(pszBasename)-1;
820 i > 0 && pszBasename[i] !=
'.' && pszBasename[i] !=
'/'
821 && pszBasename[i] !=
'\\';
824 if ( pszBasename[i] ==
'.' )
825 pszBasename[i] =
'\0';
834 fp = fopen( pszFullname,
"wb" );
843 result = fputs (srtext,fp);
844 LWDEBUGF(3,
"\n result %d proj SRText is %s .\n",
result, srtext);
892 "SELECT count(1), max(ST_zmflag(\"%s\"::geometry)), geometrytype(\"%s\"::geometry) FROM \"%s\".\"%s\" GROUP BY 3",
898 "SELECT count(1), max(ST_zmflag(\"%s\"::geometry)), geometrytype(\"%s\"::geometry) FROM \"%s\" GROUP BY 3",
908 "SELECT count(1) FROM \"%s\".\"%s\"",
914 "SELECT count(1) FROM \"%s\"",
919 LWDEBUGF(3,
"Table metadata query: %s\n", query);
921 res = PQexec(state->
conn, query);
924 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
932 if (PQntuples(
res) == 0)
953 int typefound = 0, typemismatch = 0;
957 for (i = 0; i < PQntuples(
res); i++)
960 if (PQgetisnull(
res, i, 2))
1023 tmpint = atoi(PQgetvalue(
res, i, 1));
1141 config->
table = NULL;
1173 state->
table = NULL;
1208 if ( ! getenv(
"PGCLIENTENCODING") )
1226 state->
conn = PQconnectdb(connstring);
1227 if (PQstatus(state->
conn) == CONNECTION_BAD)
1235 res = PQexec(state->
conn,
"SET DATESTYLE='ISO'");
1236 if (PQresultStatus(
res) != PGRES_COMMAND_OK)
1247 res = PQexec(state->
conn,
"SELECT postgis_version()");
1248 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1256 tmpvalue = PQgetvalue(
res, 0, 0);
1262 res = PQexec(state->
conn,
"SELECT oid FROM pg_type WHERE typname = 'geometry'");
1263 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1271 if (PQntuples(
res) > 0)
1273 tmpvalue = PQgetvalue(
res, 0, 0);
1287 res = PQexec(state->
conn,
"SELECT oid FROM pg_type WHERE typname = 'geography'");
1288 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1296 if (PQntuples(
res) > 0)
1299 tmpvalue = PQgetvalue(
res, 0, 0);
1318 int gidfound = 0, i, j, ret, status;
1320 char *quoted = NULL;
1336 "CREATE TEMP TABLE \"%s\" AS %s",
1342 if (PQresultStatus(
res) != PGRES_COMMAND_OK)
1363 "SELECT a.attname, a.atttypid, "
1364 "a.atttypmod, a.attlen FROM "
1365 "pg_attribute a, pg_class c, pg_namespace n WHERE "
1366 "n.nspname = '%s' AND a.attrelid = c.oid AND "
1367 "n.oid = c.relnamespace AND "
1368 "a.atttypid != 0 AND "
1369 "a.attnum > 0 AND c.relname = '%s'",
1376 "SELECT a.attname, a.atttypid, "
1377 "a.atttypmod, a.attlen FROM "
1378 "pg_attribute a, pg_class c WHERE "
1379 "a.attrelid = c.oid and a.attnum > 0 AND "
1380 "a.atttypid != 0 AND "
1381 "c.relname = '%s' AND "
1382 "pg_catalog.pg_table_is_visible(c.oid)",
1391 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1398 if (!PQntuples(
res))
1414 if ( getenv(
"PGCLIENTENCODING") )
1448 for (i = 0; i < PQntuples(
res); i++)
1452 int pgfieldtype, pgtypmod, pgfieldlen;
1455 int dbffieldtype, dbffieldsize, dbffielddecs;
1458 pgfieldname = PQgetvalue(
res, i, 0);
1459 pgfieldtype = atoi(PQgetvalue(
res, i, 1));
1460 pgtypmod = atoi(PQgetvalue(
res, i, 2));
1461 pgfieldlen = atoi(PQgetvalue(
res, i, 3));
1492 if (!strcmp(pgfieldname,
"gid") )
1514 dbffieldname =
malloc(11);
1515 strncpy(dbffieldname, ptr, 10);
1516 dbffieldname[10] =
'\0';
1525 strncpy(dbffieldname, mapped, 10);
1526 dbffieldname[10] =
'\0';
1536 if (!strncasecmp(dbffieldname, state->
dbffieldnames[j], 10))
1538 sprintf(dbffieldname,
"%.7s_%.2d", ptr, abs(tmpint) % 100);
1548 for (nameit = 0; nameit < strlen(dbffieldname); nameit++)
1549 dbffieldname[nameit] = toupper(dbffieldname[nameit]);
1553 if (strcasecmp(dbffieldname, pgfieldname))
1555 snprintf(buf,
sizeof(buf),
_(
"Warning, field %s renamed to %s\n"), pgfieldname, dbffieldname);
1569 if (pgfieldtype == 21)
1582 else if (pgfieldtype == 23)
1595 else if (pgfieldtype == 20)
1616 else if (pgfieldtype == 700 || pgfieldtype == 701 || pgfieldtype == 1700)
1626 else if (pgfieldtype == 16)
1636 else if (pgfieldtype == 1082)
1646 else if (pgfieldtype == 1083 || pgfieldtype == 1266 || pgfieldtype == 1114 || pgfieldtype == 1184)
1659 secondsize = pgtypmod + 1;
1671 if (pgfieldtype == 1083)
1673 dbffieldsize = 8 + secondsize;
1676 else if (pgfieldtype == 1266)
1678 dbffieldsize = 8 + secondsize + 9;
1681 else if (pgfieldtype == 1114)
1683 dbffieldsize = 13 + 1 + 8 + secondsize;
1686 else if (pgfieldtype == 1184)
1688 dbffieldsize = 13 + 1 + 8 + secondsize + 9;
1698 else if (pgfieldtype == 2950)
1710 else if ((pgfieldtype == 1042 || pgfieldtype == 1043) && pgtypmod != -1)
1717 dbffieldsize = pgtypmod - 4;
1722 else if (dbffieldtype == -1)
1730 if (dbffieldsize == -1)
1748 snprintf(buf,
sizeof(buf),
_(
"Warning: values of field '%s' exceeding maximum dbf field width (%d) "
1760 LWDEBUGF(3,
"DBF FIELD_NAME: %s, SIZE: %d\n", dbffieldname, dbffieldsize);
1762 if (dbffieldtype != 9)
1765 if (
DBFAddField(state->
dbf, dbffieldname, dbffieldtype, dbffieldsize, dbffielddecs) == -1)
1767 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"Error: field %s of type %d could not be created."), dbffieldname, dbffieldtype);
1811 snprintf(buf,
sizeof(buf),
_(
"No geometry column found.\nThe DBF file will be created but not the shx or shp files.\n"));
1876 #ifndef WORDS_BIGENDIAN
1900 " FROM \"%s\".\"%s\"",
1925 res = PQexec(state->
conn,
"BEGIN");
1926 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK)
1939 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK)
1964 char *hexewkb = NULL;
1965 unsigned char *hexewkb_binary = NULL;
1971 int i, geocolnum = 0;
1989 if (PQresultStatus(state->
fetchres) != PGRES_TUPLES_OK)
2002 geocolnum = PQfnumber(state->
fetchres,
"_geoX");
2059 LWDEBUG(4,
"PostGIS >= 1.0, non-binary cursor");
2063 hexewkb_binary = PQunescapeBytea((
unsigned char *)val, &hexewkb_len);
2068 LWDEBUG(4,
"PostGIS < 1.0, non-binary cursor");
2073 hexewkb =
malloc(hexewkb_len + 1);
2074 strncpy(hexewkb, val, hexewkb_len + 1);
2079 LWDEBUG(4,
"PostGIS (any version) using binary cursor");
2086 LWDEBUGF(4,
"HexEWKB - length: %lu value: %s", strlen(hexewkb), hexewkb);
2101 switch (lwgeom->
type)
2156 if (hexewkb)
free(hexewkb);
2157 if (hexewkb_binary) PQfreemem(hexewkb_binary);
2210 PQfinish(state->
conn);
char result[OUT_DOUBLE_BUFFER_SIZE]
int SHPAPI_CALL DBFAddField(DBFHandle psDBF, const char *pszFieldName, DBFFieldType eType, int nWidth, int nDecimals)
DBFHandle SHPAPI_CALL DBFCreateEx(const char *pszFilename, const char *pszCodePage)
void SHPAPI_CALL DBFClose(DBFHandle psDBF)
void SHPAPI_CALL DBFSetWriteEndOfFileChar(DBFHandle psDBF, int bWriteFlag)
int SHPAPI_CALL DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField, void *pValue)
void deparse_hex(uint8_t str, char *result)
Convert a char into a human readable hex digit.
LWLINE * lwgeom_as_lwline(const LWGEOM *lwgeom)
POINT4D getPoint4d(const POINTARRAY *pa, uint32_t n)
LWGEOM * lwgeom_from_hexwkb(const char *hexwkb, const char check)
LWMPOINT * lwgeom_as_lwmpoint(const LWGEOM *lwgeom)
void lwgeom_free(LWGEOM *geom)
#define LW_PARSER_CHECK_NONE
LWMPOLY * lwgeom_as_lwmpoly(const LWGEOM *lwgeom)
int lwtype_is_collection(uint8_t type)
Determine whether a type number is a collection or not.
#define POINTTYPE
LWTYPE numbers, used internally by PostGIS.
int geometry_type_from_string(const char *str, uint8_t *type, int *z, int *m)
Utility function to get type number from string.
LWMLINE * lwgeom_as_lwmline(const LWGEOM *lwgeom)
const char * lwtype_name(uint8_t type)
Return the type name string associated with a type number (e.g.
LWPOLY * lwgeom_as_lwpoly(const LWGEOM *lwgeom)
#define LWDEBUG(level, msg)
#define LWDEBUGF(level, msg,...)
static int lwgeom_is_empty(const LWGEOM *geom)
Return true or false depending on whether a geometry is an "empty" geometry (no vertices members)
static LWPOINT * lwgeom_as_lwpoint(const LWGEOM *lwgeom)
void set_dumper_config_defaults(SHPDUMPERCONFIG *config)
static int getMaxFieldSize(PGconn *conn, char *schema, char *table, char *fname)
static SHPObject * create_polygon(SHPDUMPERSTATE *state, LWPOLY *lwpolygon)
int ShpDumperGetRecordCount(SHPDUMPERSTATE *state)
static char * core_asprintf(const char *format,...) __attribute__((format(printf
static SHPObject * create_multipolygon(SHPDUMPERSTATE *state, LWMPOLY *lwmultipolygon)
void ShpDumperDestroy(SHPDUMPERSTATE *state)
char * convert_bytes_to_hex(uint8_t *ewkb, size_t size)
Binary to hexewkb conversion function.
char * shapetypename(int num)
SHPDUMPERSTATE * ShpDumperCreate(SHPDUMPERCONFIG *config)
static SHPObject * create_linestring(SHPDUMPERSTATE *state, LWLINE *lwlinestring)
static int getTableInfo(SHPDUMPERSTATE *state)
int ShpDumperConnectDatabase(SHPDUMPERSTATE *state)
static int projFileCreate(SHPDUMPERSTATE *state)
Creates ESRI .prj file for this shp output It looks in the spatial_ref_sys table and outputs the srte...
int ShpLoaderGenerateShapeRow(SHPDUMPERSTATE *state)
static int reverse_points(int num_points, double *x, double *y, double *z, double *m)
static char * goodDBFValue(char *in, char fieldType)
Make appropriate formatting of a DBF value based on type.
static SHPObject * create_point(SHPDUMPERSTATE *state, LWPOINT *lwpoint)
int ShpDumperCloseTable(SHPDUMPERSTATE *state)
static int is_clockwise(int num_points, double *x, double *y, double *z)
char * quote_identifier(const char *s)
int ShpDumperOpenTable(SHPDUMPERSTATE *state)
static SHPObject * create_point_empty(SHPDUMPERSTATE *state, LWPOINT *lwpoint)
static char * nullDBFValue(char fieldType)
char * ShpDumperGetConnectionStringFromConn(SHPCONNECTIONCONFIG *conn)
#define MAX_DBF_FIELD_SIZE
static SHPObject * create_multipoint(SHPDUMPERSTATE *state, LWMPOINT *lwmultipoint)
static SHPObject * create_multilinestring(SHPDUMPERSTATE *state, LWMLINE *lwmultilinestring)
SHPHandle SHPAPI_CALL SHPCreate(const char *pszShapeFile, int nShapeType)
void SHPAPI_CALL SHPClose(SHPHandle hSHP)
void SHPAPI_CALL SHPDestroyObject(SHPObject *psObject)
SHPObject SHPAPI_CALL1 * SHPCreateObject(int nSHPType, int nShapeId, int nParts, const int *panPartStart, const int *panPartType, int nVertices, const double *padfX, const double *padfY, const double *padfZ, const double *padfM);SHPObject SHPAPI_CALL1(*) SHPCreateSimpleObject(int nSHPType, int nVertices, const double *padfX, const double *padfY, const double *padfZ
static SHPCONNECTIONCONFIG * conn
char * encoding2codepage(const char *encoding)
int colmap_read(const char *filename, colmap *map, char *errbuf, size_t errbuflen)
Read the content of filename into a symbol map.
void colmap_init(colmap *map)
const char * colmap_dbf_by_pg(colmap *map, const char *pgname)
void colmap_clean(colmap *map)
SHPObject SHPAPI_CALL1 * SHPCreateSimpleObject(int nSHPType, int nVertices, const double *padfX, const double *padfY, const double *padfZ){ return(SHPCreateObject(nSHPType, -1, 0, SHPLIB_NULLPTR, SHPLIB_NULLPTR, nVertices, padfX, padfY, padfZ, SHPLIB_NULLPTR)
int SHPAPI_CALL SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject *psObject)
void stringbuffer_release(stringbuffer_t *s)
int stringbuffer_aprintf(stringbuffer_t *s, const char *fmt,...)
Appends a formatted string to the current string buffer, using the format and argument list provided.
void stringbuffer_init(stringbuffer_t *s)
char * stringbuffer_getstringcopy(stringbuffer_t *s)
Returns a newly allocated string large enough to contain the current state of the string.
const char * stringbuffer_getstring(stringbuffer_t *s)
Returns a reference to the internal string being managed by the stringbuffer.
static void stringbuffer_append(stringbuffer_t *s, const char *a)
Append the specified string to the stringbuffer_t.
char * column_map_filename
SHPCONNECTIONCONFIG * conn
char message[SHPDUMPERMSGLEN]