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);
80 err = vasprintf(&
value, format, ap);
91 const uint8_t ndr_nan[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x7f};
94 memcpy(&double_nan, ndr_nan, 8);
105 double *xpts, *ypts, *zpts, *mpts;
108 xpts =
malloc(
sizeof(
double));
109 ypts =
malloc(
sizeof(
double));
110 zpts =
malloc(
sizeof(
double));
111 mpts =
malloc(
sizeof(
double));
122 LWDEBUGF(4,
"Point: %g %g %g %g", xpts[0], ypts[0], zpts[0], mpts[0]);
141 double *xpts, *ypts, *zpts, *mpts;
151 for (i = 0; i < lwmultipoint->
ngeoms; i++)
160 LWDEBUGF(4,
"MultiPoint %d - Point: %g %g %g %g", i, xpts[i], ypts[i], zpts[i], mpts[i]);
180 double *xpts, *ypts, *zpts, *mpts;
182 int *shpparts, shppointtotal = 0, shppoint = 0;
188 for (i = 0; i < lwpolygon->
nrings; i++)
192 xpts =
malloc(
sizeof(
double) * shppointtotal);
193 ypts =
malloc(
sizeof(
double) * shppointtotal);
194 zpts =
malloc(
sizeof(
double) * shppointtotal);
195 mpts =
malloc(
sizeof(
double) * shppointtotal);
197 LWDEBUGF(4,
"Total number of points: %d", shppointtotal);
200 for (i = 0; i < lwpolygon->
nrings; i++)
203 shpparts[i] = shppoint;
209 xpts[shppoint] = p4d.
x;
210 ypts[shppoint] = p4d.
y;
211 zpts[shppoint] = p4d.
z;
212 mpts[shppoint] = p4d.
m;
214 LWDEBUGF(4,
"Polygon Ring %d - Point: %g %g %g %g", i, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
227 &xpts[shpparts[i]], &ypts[shpparts[i]], NULL) )
229 LWDEBUG(4,
"Outer ring not clockwise, forcing clockwise\n");
232 &xpts[shpparts[i]], &ypts[shpparts[i]],
233 &zpts[shpparts[i]], &mpts[shpparts[i]]);
239 &xpts[shpparts[i]], &ypts[shpparts[i]], NULL) )
241 LWDEBUGF(4,
"Inner ring %d not counter-clockwise, forcing counter-clockwise\n", i);
244 &xpts[shpparts[i]], &ypts[shpparts[i]],
245 &zpts[shpparts[i]], &mpts[shpparts[i]]);
268 double *xpts, *ypts, *zpts, *mpts;
270 int *shpparts, shppointtotal = 0, shppoint = 0, shpringtotal = 0, shpring = 0;
275 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
277 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
285 shpparts =
malloc(
sizeof(
int) * shpringtotal);
288 xpts =
malloc(
sizeof(
double) * shppointtotal);
289 ypts =
malloc(
sizeof(
double) * shppointtotal);
290 zpts =
malloc(
sizeof(
double) * shppointtotal);
291 mpts =
malloc(
sizeof(
double) * shppointtotal);
293 LWDEBUGF(4,
"Total number of rings: %d Total number of points: %d", shpringtotal, shppointtotal);
296 for (i = 0; i < lwmultipolygon->
ngeoms; i++)
298 for (j = 0; j < lwmultipolygon->
geoms[i]->
nrings; j++)
301 shpparts[shpring] = shppoint;
303 LWDEBUGF(4,
"Ring offset: %d", shpring);
309 xpts[shppoint] = p4d.
x;
310 ypts[shppoint] = p4d.
y;
311 zpts[shppoint] = p4d.
z;
312 mpts[shppoint] = p4d.
m;
314 LWDEBUGF(4,
"MultiPolygon %d Polygon Ring %d - Point: %g %g %g %g", i, j, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
327 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
329 LWDEBUG(4,
"Outer ring not clockwise, forcing clockwise\n");
332 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
333 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
339 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]], NULL) )
341 LWDEBUGF(4,
"Inner ring %d not counter-clockwise, forcing counter-clockwise\n", i);
344 &xpts[shpparts[shpring]], &ypts[shpparts[shpring]],
345 &zpts[shpparts[shpring]], &mpts[shpparts[shpring]]);
372 double *xpts, *ypts, *zpts, *mpts;
391 LWDEBUGF(4,
"Linestring - Point: %g %g %g %g", i, xpts[i], ypts[i], zpts[i], mpts[i]);
411 double *xpts, *ypts, *zpts, *mpts;
413 int *shpparts, shppointtotal = 0, shppoint = 0;
416 shpparts =
malloc(
sizeof(
int) * lwmultilinestring->
ngeoms);
419 for (i = 0; i < lwmultilinestring->
ngeoms; i++)
422 LWDEBUGF(3,
"Total number of points: %d", shppointtotal);
425 xpts =
malloc(
sizeof(
double) * shppointtotal);
426 ypts =
malloc(
sizeof(
double) * shppointtotal);
427 zpts =
malloc(
sizeof(
double) * shppointtotal);
428 mpts =
malloc(
sizeof(
double) * shppointtotal);
431 for (i = 0; i < lwmultilinestring->
ngeoms; i++)
434 shpparts[i] = shppoint;
440 xpts[shppoint] = p4d.
x;
441 ypts[shppoint] = p4d.
y;
442 zpts[shppoint] = p4d.
z;
443 mpts[shppoint] = p4d.
m;
445 LWDEBUGF(4,
"Linestring %d - Point: %g %g %g %g", i, xpts[shppoint], ypts[shppoint], zpts[shppoint], mpts[shppoint]);
472 for (i=0; i <num_points; i++)
510 double x_change,y_change,area;
511 double *x_new, *y_new;
514 x_new = (
double *)
malloc(
sizeof(
double) * num_points);
515 y_new = (
double *)
malloc(
sizeof(
double) * num_points);
520 for (i=0; i < num_points ; i++)
522 x_new[i] =
x[i] - x_change;
523 y_new[i] =
y[i] - y_change;
526 for (i=0; i < num_points - 1; i++)
529 area += (
x[i] *
y[i+1]) - (
y[i] *
x[i+1]);
565 "select max(octet_length(\"%s\"::text)) from \"%s\".\"%s\"",
566 fname, schema, table);
572 "select max(octet_length(\"%s\"::text)) from \"%s\"",
580 if ( !
res || PQresultStatus(
res) != PGRES_TUPLES_OK )
582 printf(
_(
"Querying for maximum field length: %s"),
583 PQerrorMessage(
conn));
587 if (PQntuples(
res) <= 0 )
592 size = atoi(PQgetvalue(
res, 0, 0));
619 return "MultiPointZ";
627 return "MultiPointM";
645 return "****************";
680 buf[0] = toupper(in[0]);
705 hexewkb =
malloc(size * 2 + 1);
706 for (i=0; i<size; ++i)
deparse_hex(ewkb[i], &hexewkb[i * 2]);
707 hexewkb[size * 2] =
'\0';
722 char *pszFullname, *pszBasename;
725 char *pszFilename = state->
shp_file;
726 char *schema = state->
schema;
727 char *table = state->
table;
732 char esc_schema[1024];
733 char esc_table[1024];
734 char esc_geo_col_name[1024];
742 PQescapeStringConn(state->
conn, esc_table, table, strlen(table), &error);
743 PQescapeStringConn(state->
conn, esc_geo_col_name, geo_col_name, strlen(geo_col_name), &error);
756 PQescapeStringConn(state->
conn, esc_schema, schema, strlen(schema), &error);
758 "SELECT COALESCE((SELECT sr.srtext "
759 " FROM geometry_columns As gc INNER JOIN spatial_ref_sys sr ON sr.srid = gc.srid "
760 " WHERE gc.f_table_schema = '%s' AND gc.f_table_name = '%s' AND gc.f_geometry_column = '%s' LIMIT 1), "
761 " (SELECT CASE WHEN COUNT(DISTINCT sr.srid) > 1 THEN 'm' ELSE MAX(sr.srtext) END As srtext "
762 " FROM \"%s\".\"%s\" As g INNER JOIN spatial_ref_sys sr ON sr.srid = ST_SRID((g.\"%s\")::geometry)) , ' ') As srtext ",
763 esc_schema, esc_table, esc_geo_col_name, schema, table, geo_col_name);
768 "SELECT COALESCE((SELECT sr.srtext "
769 " FROM geometry_columns As gc INNER JOIN spatial_ref_sys sr ON sr.srid = gc.srid "
770 " 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), "
771 " (SELECT CASE WHEN COUNT(DISTINCT sr.srid) > 1 THEN 'm' ELSE MAX(sr.srtext) END as srtext "
772 " FROM \"%s\" As g INNER JOIN spatial_ref_sys sr ON sr.srid = ST_SRID((g.\"%s\")::geometry)), ' ') As srtext ",
773 esc_table, esc_geo_col_name, table, geo_col_name);
778 res = PQexec(state->
conn, query);
780 if ( !
res || PQresultStatus(
res) != PGRES_TUPLES_OK )
788 for (i=0; i < PQntuples(
res); i++)
790 srtext = PQgetvalue(
res, i, 0);
791 if (strcmp(srtext,
"m") == 0)
793 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"WARNING: Mixed set of spatial references. No prj file will be generated"));
800 if (srtext[0] ==
' ')
802 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"WARNING: Cannot determine spatial reference (empty table or unknown spatial ref). No prj file will be generated."));
813 pszBasename = (
char *)
malloc(strlen(pszFilename)+5);
814 strcpy( pszBasename, pszFilename );
815 for ( i = strlen(pszBasename)-1;
816 i > 0 && pszBasename[i] !=
'.' && pszBasename[i] !=
'/'
817 && pszBasename[i] !=
'\\';
820 if ( pszBasename[i] ==
'.' )
821 pszBasename[i] =
'\0';
830 fp = fopen( pszFullname,
"wb" );
839 result = fputs (srtext,fp);
840 LWDEBUGF(3,
"\n result %d proj SRText is %s .\n",
result, srtext);
888 "SELECT count(1), max(ST_zmflag(\"%s\"::geometry)), geometrytype(\"%s\"::geometry) FROM \"%s\".\"%s\" GROUP BY 3",
894 "SELECT count(1), max(ST_zmflag(\"%s\"::geometry)), geometrytype(\"%s\"::geometry) FROM \"%s\" GROUP BY 3",
904 "SELECT count(1) FROM \"%s\".\"%s\"",
910 "SELECT count(1) FROM \"%s\"",
915 LWDEBUGF(3,
"Table metadata query: %s\n", query);
917 res = PQexec(state->
conn, query);
920 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
928 if (PQntuples(
res) == 0)
949 int typefound = 0, typemismatch = 0;
953 for (i = 0; i < PQntuples(
res); i++)
956 if (PQgetisnull(
res, i, 2))
1019 tmpint = atoi(PQgetvalue(
res, i, 1));
1137 config->
table = NULL;
1169 state->
table = NULL;
1204 if ( ! getenv(
"PGCLIENTENCODING") )
1222 state->
conn = PQconnectdb(connstring);
1223 if (PQstatus(state->
conn) == CONNECTION_BAD)
1231 res = PQexec(state->
conn,
"SET DATESTYLE='ISO'");
1232 if (PQresultStatus(
res) != PGRES_COMMAND_OK)
1243 res = PQexec(state->
conn,
"SELECT postgis_version()");
1244 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1252 tmpvalue = PQgetvalue(
res, 0, 0);
1258 res = PQexec(state->
conn,
"SELECT oid FROM pg_type WHERE typname = 'geometry'");
1259 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1267 if (PQntuples(
res) > 0)
1269 tmpvalue = PQgetvalue(
res, 0, 0);
1283 res = PQexec(state->
conn,
"SELECT oid FROM pg_type WHERE typname = 'geography'");
1284 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1292 if (PQntuples(
res) > 0)
1295 tmpvalue = PQgetvalue(
res, 0, 0);
1314 int gidfound = 0, i, j, ret, status;
1331 "CREATE TEMP TABLE \"%s\" AS %s",
1337 if (PQresultStatus(
res) != PGRES_COMMAND_OK)
1357 "SELECT a.attname, a.atttypid, "
1358 "a.atttypmod, a.attlen FROM "
1359 "pg_attribute a, pg_class c, pg_namespace n WHERE "
1360 "n.nspname = '%s' AND a.attrelid = c.oid AND "
1361 "n.oid = c.relnamespace AND "
1362 "a.atttypid != 0 AND "
1363 "a.attnum > 0 AND c.relname = '%s'",
1370 "SELECT a.attname, a.atttypid, "
1371 "a.atttypmod, a.attlen FROM "
1372 "pg_attribute a, pg_class c WHERE "
1373 "a.attrelid = c.oid and a.attnum > 0 AND "
1374 "a.atttypid != 0 AND "
1375 "c.relname = '%s' AND "
1376 "pg_catalog.pg_table_is_visible(c.oid)",
1380 LWDEBUGF(3,
"query is: %s\n", query);
1385 if (PQresultStatus(
res) != PGRES_TUPLES_OK)
1392 if (!PQntuples(
res))
1408 if ( getenv(
"PGCLIENTENCODING") )
1439 for (i = 0; i < PQntuples(
res); i++)
1443 int pgfieldtype, pgtypmod, pgfieldlen;
1446 int dbffieldtype, dbffieldsize, dbffielddecs;
1449 pgfieldname = PQgetvalue(
res, i, 0);
1450 pgfieldtype = atoi(PQgetvalue(
res, i, 1));
1451 pgtypmod = atoi(PQgetvalue(
res, i, 2));
1452 pgfieldlen = atoi(PQgetvalue(
res, i, 3));
1483 if (!strcmp(pgfieldname,
"gid") )
1505 dbffieldname =
malloc(11);
1506 strncpy(dbffieldname, ptr, 10);
1507 dbffieldname[10] =
'\0';
1516 strncpy(dbffieldname, mapped, 10);
1517 dbffieldname[10] =
'\0';
1527 if (!strncasecmp(dbffieldname, state->
dbffieldnames[j], 10))
1529 sprintf(dbffieldname,
"%.7s_%.2d", ptr, abs(tmpint) % 100);
1539 for (nameit = 0; nameit < strlen(dbffieldname); nameit++)
1540 dbffieldname[nameit] = toupper(dbffieldname[nameit]);
1544 if (strcasecmp(dbffieldname, pgfieldname))
1546 snprintf(buf,
sizeof(buf),
_(
"Warning, field %s renamed to %s\n"), pgfieldname, dbffieldname);
1560 if (pgfieldtype == 21)
1573 else if (pgfieldtype == 23)
1586 else if (pgfieldtype == 20)
1607 else if (pgfieldtype == 700 || pgfieldtype == 701 || pgfieldtype == 1700)
1617 else if (pgfieldtype == 16)
1627 else if (pgfieldtype == 1082)
1637 else if (pgfieldtype == 1083 || pgfieldtype == 1266 || pgfieldtype == 1114 || pgfieldtype == 1184)
1650 secondsize = pgtypmod + 1;
1662 if (pgfieldtype == 1083)
1664 dbffieldsize = 8 + secondsize;
1667 else if (pgfieldtype == 1266)
1669 dbffieldsize = 8 + secondsize + 9;
1672 else if (pgfieldtype == 1114)
1674 dbffieldsize = 13 + 1 + 8 + secondsize;
1677 else if (pgfieldtype == 1184)
1679 dbffieldsize = 13 + 1 + 8 + secondsize + 9;
1689 else if (pgfieldtype == 2950)
1701 else if ((pgfieldtype == 1042 || pgfieldtype == 1043) && pgtypmod != -1)
1708 dbffieldsize = pgtypmod - 4;
1713 else if (dbffieldtype == -1)
1721 if (dbffieldsize == -1)
1739 snprintf(buf,
sizeof(buf),
_(
"Warning: values of field '%s' exceeding maximum dbf field width (%d) "
1751 LWDEBUGF(3,
"DBF FIELD_NAME: %s, SIZE: %d\n", dbffieldname, dbffieldsize);
1753 if (dbffieldtype != 9)
1756 if (
DBFAddField(state->
dbf, dbffieldname, dbffieldtype, dbffieldsize, dbffielddecs) == -1)
1758 snprintf(state->
message,
SHPDUMPERMSGLEN,
_(
"Error: field %s of type %d could not be created."), dbffieldname, dbffieldtype);
1797 snprintf(buf,
sizeof(buf),
_(
"No geometry column found.\nThe DBF file will be created but not the shx or shp files.\n"));
1860 #ifdef WORDS_BIGENDIAN
1863 "ST_asEWKB(ST_SetSRID(%s::geometry, 0), 'XDR') AS _geoX",
1869 "asbinary(%s::geometry, 'XDR') AS _geoX",
1876 "ST_AsEWKB(ST_SetSRID(%s::geometry, 0), 'NDR') AS _geoX",
1882 "asbinary(%s::geometry, 'NDR') AS _geoX",
1891 " FROM \"%s\".\"%s\"",
1916 res = PQexec(state->
conn,
"BEGIN");
1917 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK)
1930 if (!
res || PQresultStatus(
res) != PGRES_COMMAND_OK)
1955 char *hexewkb = NULL;
1956 unsigned char *hexewkb_binary = NULL;
1962 int i, geocolnum = 0;
1980 if (PQresultStatus(state->
fetchres) != PGRES_TUPLES_OK)
1993 geocolnum = PQfnumber(state->
fetchres,
"_geoX");
2050 LWDEBUG(4,
"PostGIS >= 1.0, non-binary cursor");
2054 hexewkb_binary = PQunescapeBytea((
unsigned char *)val, &hexewkb_len);
2059 LWDEBUG(4,
"PostGIS < 1.0, non-binary cursor");
2064 hexewkb =
malloc(hexewkb_len + 1);
2065 strncpy(hexewkb, val, hexewkb_len + 1);
2070 LWDEBUG(4,
"PostGIS (any version) using binary cursor");
2077 LWDEBUGF(4,
"HexEWKB - length: %d value: %s", strlen(hexewkb), hexewkb);
2092 switch (lwgeom->
type)
2147 if (hexewkb)
free(hexewkb);
2148 if (hexewkb_binary) PQfreemem(hexewkb_binary);
2201 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 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)
static char * core_asprintf(const char *format,...)
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]