|
@@ -34,7 +34,7 @@ int main(int argc, char *argv[])
|
|
|
int field;
|
|
|
struct GModule *module;
|
|
|
struct Options options;
|
|
|
- struct Flags flags;
|
|
|
+ struct Flags flags;
|
|
|
|
|
|
char buf[2000];
|
|
|
char key1[200], key2[200];
|
|
@@ -56,8 +56,8 @@ int main(int argc, char *argv[])
|
|
|
dbString dbstring;
|
|
|
dbColumn *Column;
|
|
|
|
|
|
- int fout, fskip; /* features written/ skip */
|
|
|
- int nocat, noatt, nocatskip; /* number of features without cats/atts written/skip */
|
|
|
+ int fout, fskip; /* features written/ skip */
|
|
|
+ int nocat, noatt, nocatskip; /* number of features without cats/atts written/skip */
|
|
|
|
|
|
/* OGR */
|
|
|
int drn, ogr_ftype = OFTInteger;
|
|
@@ -80,14 +80,13 @@ int main(int argc, char *argv[])
|
|
|
G_add_keyword(_("vector"));
|
|
|
G_add_keyword(_("export"));
|
|
|
G_add_keyword(_("ogr"));
|
|
|
-
|
|
|
+
|
|
|
module->description =
|
|
|
_("Converts a vector map to any of the supported OGR vector formats.");
|
|
|
-
|
|
|
+
|
|
|
/* parse & read options */
|
|
|
- parse_args(argc, argv,
|
|
|
- &options, &flags);
|
|
|
-
|
|
|
+ parse_args(argc, argv, &options, &flags);
|
|
|
+
|
|
|
/* parse dataset creation options */
|
|
|
i = 0;
|
|
|
while (options.dsco->answers[i]) {
|
|
@@ -109,73 +108,76 @@ int main(int argc, char *argv[])
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- If no output type specified: determine one automatically.
|
|
|
- Centroids, Boundaries and Kernels always have to be exported
|
|
|
- explicitely, using the "type=" option.
|
|
|
- */
|
|
|
+ If no output type specified: determine one automatically.
|
|
|
+ Centroids, Boundaries and Kernels always have to be exported
|
|
|
+ explicitely, using the "type=" option.
|
|
|
+ */
|
|
|
if (!flags.new->answer) {
|
|
|
/* open input vector (topology required) */
|
|
|
Vect_set_open_level(2);
|
|
|
Vect_open_old2(&In, options.input->answer, "", options.field->answer);
|
|
|
-
|
|
|
+
|
|
|
if (strcmp(options.type->answer, "auto") == 0) {
|
|
|
G_debug(2, "Automatic type determination.");
|
|
|
-
|
|
|
- options.type->answers = G_malloc(sizeof(char*) * 10);
|
|
|
+
|
|
|
+ options.type->answers = G_malloc(sizeof(char *) * 10);
|
|
|
G_zero(options.type->answers, sizeof(char *) * 10);
|
|
|
num_types = 0;
|
|
|
-
|
|
|
- if (Vect_get_num_primitives (&In, GV_POINT) > 0) {
|
|
|
+
|
|
|
+ if (Vect_get_num_primitives(&In, GV_POINT) > 0) {
|
|
|
options.type->answers[num_types++] = G_store("point");
|
|
|
G_debug(3, "Adding points to export list.");
|
|
|
}
|
|
|
-
|
|
|
- if (Vect_get_num_primitives (&In, GV_LINE) > 0 ) {
|
|
|
+
|
|
|
+ if (Vect_get_num_primitives(&In, GV_LINE) > 0) {
|
|
|
options.type->answers[num_types++] = G_store("line");
|
|
|
G_debug(3, "Adding lines to export list.");
|
|
|
}
|
|
|
-
|
|
|
- if (Vect_get_num_areas (&In) > 0) {
|
|
|
+
|
|
|
+ if (Vect_get_num_areas(&In) > 0) {
|
|
|
options.type->answers[num_types++] = G_store("area");
|
|
|
G_debug(3, "Adding areas to export list.");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* Faces and volumes:
|
|
|
- For now, volumes will just be exported as sets of faces.
|
|
|
- */
|
|
|
- if (Vect_get_num_primitives (&In, GV_FACE) > 0) {
|
|
|
+ For now, volumes will just be exported as sets of faces.
|
|
|
+ */
|
|
|
+ if (Vect_get_num_primitives(&In, GV_FACE) > 0) {
|
|
|
options.type->answers[num_types++] = G_store("face");
|
|
|
G_debug(3, "Adding faces to export list.");
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* this check HAS TO FOLLOW RIGHT AFTER check for GV_FACE! */
|
|
|
- if ( Vect_get_num_volumes (&In) > 0) {
|
|
|
+ if (Vect_get_num_volumes(&In) > 0) {
|
|
|
G_warning(_("Volumes will be exported as sets of faces"));
|
|
|
if (num_types == 0) {
|
|
|
/* no other types yet? */
|
|
|
options.type->answers[num_types++] = G_store("volume");
|
|
|
G_debug(3, "Adding volumes to export list.");
|
|
|
- } else {
|
|
|
- if (strcmp(options.type->answers[num_types-1], "face") != 0) {
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (strcmp(options.type->answers[num_types - 1], "face")
|
|
|
+ != 0) {
|
|
|
/* only put faces on export list if that's not the case already */
|
|
|
- options.type->answers[num_types++] = G_store("volume");
|
|
|
+ options.type->answers[num_types++] =
|
|
|
+ G_store("volume");
|
|
|
G_debug(3, "Adding volumes to export list.");
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (num_types == 0)
|
|
|
G_fatal_error(_("Unable to determine input map's vector feature type(s)."));
|
|
|
}
|
|
|
}
|
|
|
|
|
|
field = Vect_get_field_number(&In, options.field->answer);
|
|
|
-
|
|
|
+
|
|
|
/* check output feature type */
|
|
|
otype = Vect_option_to_types(options.type);
|
|
|
|
|
|
if (!options.layer->answer) {
|
|
|
- char xname[GNAME_MAX], xmapset[GMAPSET_MAX];
|
|
|
+ char xname[GNAME_MAX], xmapset[GMAPSET_MAX];
|
|
|
|
|
|
if (G_name_is_fully_qualified(options.input->answer, xname, xmapset))
|
|
|
options.layer->answer = G_store(xname);
|
|
@@ -234,11 +236,14 @@ int main(int argc, char *argv[])
|
|
|
/* create new OGR layer in datasource */
|
|
|
if (flags.new->answer) {
|
|
|
const char *name;
|
|
|
- name = options.layer->answer ? options.layer->answer : options.input->answer;
|
|
|
-
|
|
|
+
|
|
|
+ name =
|
|
|
+ options.layer->answer ? options.layer->answer : options.input->
|
|
|
+ answer;
|
|
|
+
|
|
|
create_ogr_layer(options.dsn->answer, options.format->answer, name,
|
|
|
- wkbtype, (const char **) papszDSCO, (const char **) papszLCO);
|
|
|
-
|
|
|
+ wkbtype, papszDSCO, papszLCO);
|
|
|
+
|
|
|
G_message(_("OGR layer <%s> created in datasource <%s> (format '%s')"),
|
|
|
name, options.dsn->answer, options.format->answer);
|
|
|
exit(EXIT_SUCCESS);
|
|
@@ -252,9 +257,10 @@ int main(int argc, char *argv[])
|
|
|
Points = Vect_new_line_struct();
|
|
|
Cats = Vect_new_cats_struct();
|
|
|
|
|
|
- if ((GV_AREA & otype) && Vect_get_num_islands(&In) > 0 && flags.cat->answer)
|
|
|
+ if ((GV_AREA & otype) && Vect_get_num_islands(&In) > 0 &&
|
|
|
+ flags.cat->answer)
|
|
|
G_warning(_("The map contains islands. With the -c flag, "
|
|
|
- "islands will appear as filled areas, not holes in the output map."));
|
|
|
+ "islands will appear as filled areas, not holes in the output map."));
|
|
|
|
|
|
/* Open OGR DSN */
|
|
|
G_debug(2, "driver count = %d", OGRGetDriverCount());
|
|
@@ -274,12 +280,15 @@ int main(int argc, char *argv[])
|
|
|
G_fatal_error(_("OGR driver <%s> not found"), options.format->answer);
|
|
|
Ogr_driver = OGRGetDriver(drn);
|
|
|
|
|
|
- if (flags.update->answer) {
|
|
|
- G_debug(1, "Update OGR data source");
|
|
|
- Ogr_ds = OGR_Dr_Open(Ogr_driver, options.dsn->answer, TRUE);
|
|
|
- } else {
|
|
|
- G_debug(1, "Create OGR data source");
|
|
|
- Ogr_ds = OGR_Dr_CreateDataSource(Ogr_driver, options.dsn->answer, papszDSCO);
|
|
|
+ if (flags.update->answer) {
|
|
|
+ G_debug(1, "Update OGR data source");
|
|
|
+ Ogr_ds = OGR_Dr_Open(Ogr_driver, options.dsn->answer, TRUE);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ G_debug(1, "Create OGR data source");
|
|
|
+ Ogr_ds =
|
|
|
+ OGR_Dr_CreateDataSource(Ogr_driver, options.dsn->answer,
|
|
|
+ papszDSCO);
|
|
|
}
|
|
|
|
|
|
CSLDestroy(papszDSCO);
|
|
@@ -299,7 +308,7 @@ int main(int argc, char *argv[])
|
|
|
papszLCO = CSLSetNameValue(papszLCO, "OVERWRITE", "YES");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* check if the map is 3d */
|
|
|
if (Vect_is_3d(&In)) {
|
|
|
/* specific check for ESRI ShapeFile */
|
|
@@ -336,8 +345,8 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
G_debug(1, "Create OGR layer");
|
|
|
Ogr_layer =
|
|
|
- OGR_DS_CreateLayer(Ogr_ds, options.layer->answer, Ogr_projection, wkbtype,
|
|
|
- papszLCO);
|
|
|
+ OGR_DS_CreateLayer(Ogr_ds, options.layer->answer, Ogr_projection,
|
|
|
+ wkbtype, papszLCO);
|
|
|
CSLDestroy(papszLCO);
|
|
|
if (Ogr_layer == NULL)
|
|
|
G_fatal_error(_("Unable to create OGR layer"));
|
|
@@ -354,8 +363,8 @@ int main(int argc, char *argv[])
|
|
|
/* if we have no more than a 'cat' column, then that has to
|
|
|
be exported in any case */
|
|
|
if (flags.nocat->answer) {
|
|
|
- G_warning(_("Exporting 'cat' anyway, as it is the only attribute table field"));
|
|
|
- flags.nocat->answer=0;
|
|
|
+ G_warning(_("Exporting 'cat' anyway, as it is the only attribute table field"));
|
|
|
+ flags.nocat->answer = 0;
|
|
|
}
|
|
|
Ogr_field = OGR_Fld_Create("cat", OFTInteger);
|
|
|
OGR_L_CreateField(Ogr_layer, Ogr_field, 0);
|
|
@@ -368,7 +377,7 @@ int main(int argc, char *argv[])
|
|
|
if (!Driver)
|
|
|
G_fatal_error(_("Unable to open database <%s> by driver <%s>"),
|
|
|
Fi->database, Fi->driver);
|
|
|
-
|
|
|
+
|
|
|
db_set_string(&dbstring, Fi->table);
|
|
|
if (db_describe_table(Driver, &dbstring, &Table) != DB_OK)
|
|
|
G_fatal_error(_("Unable to describe table <%s>"), Fi->table);
|
|
@@ -407,17 +416,19 @@ int main(int argc, char *argv[])
|
|
|
keycol = i;
|
|
|
G_debug(2, "%s x %s -> %s x %s -> keycol = %d", Fi->key,
|
|
|
db_get_column_name(Column), key1, key2, keycol);
|
|
|
-
|
|
|
+
|
|
|
if (!flags.nocat->answer) {
|
|
|
Ogr_field =
|
|
|
- OGR_Fld_Create(db_get_column_name(Column), ogr_ftype);
|
|
|
+ OGR_Fld_Create(db_get_column_name(Column), ogr_ftype);
|
|
|
OGR_L_CreateField(Ogr_layer, Ogr_field, 0);
|
|
|
OGR_Fld_Destroy(Ogr_field);
|
|
|
- } else {
|
|
|
+ }
|
|
|
+ else {
|
|
|
/* skip export of 'cat' field */
|
|
|
- if (strcmp (Fi->key, db_get_column_name(Column)) != 0) {
|
|
|
+ if (strcmp(Fi->key, db_get_column_name(Column)) != 0) {
|
|
|
Ogr_field =
|
|
|
- OGR_Fld_Create(db_get_column_name(Column), ogr_ftype);
|
|
|
+ OGR_Fld_Create(db_get_column_name(Column),
|
|
|
+ ogr_ftype);
|
|
|
OGR_L_CreateField(Ogr_layer, Ogr_field, 0);
|
|
|
OGR_Fld_Destroy(Ogr_field);
|
|
|
}
|
|
@@ -426,7 +437,6 @@ int main(int argc, char *argv[])
|
|
|
if (keycol == -1)
|
|
|
G_fatal_error(_("Key column <%s> not found"), Fi->key);
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
Ogr_featuredefn = OGR_L_GetLayerDefn(Ogr_layer);
|
|
@@ -453,8 +463,8 @@ int main(int argc, char *argv[])
|
|
|
if (Vect_get_num_primitives(&In, GV_CENTROID) > 0 &&
|
|
|
!(otype & GV_CENTROID) && !(otype & GV_AREA))
|
|
|
G_warning(_("%d centroid(s) found, but not requested to be exported. "
|
|
|
- "Verify 'type' parameter."), Vect_get_num_primitives(&In,
|
|
|
- GV_CENTROID));
|
|
|
+ "Verify 'type' parameter."), Vect_get_num_primitives(&In,
|
|
|
+ GV_CENTROID));
|
|
|
|
|
|
if (Vect_get_num_areas(&In) > 0 && !(otype & GV_AREA))
|
|
|
G_warning(_("%d areas found, but not requested to be exported. "
|
|
@@ -472,73 +482,89 @@ int main(int argc, char *argv[])
|
|
|
/* warn and eventually abort if there is nothing to be exported */
|
|
|
num_to_export = 0;
|
|
|
if (Vect_get_num_primitives(&In, GV_POINT) < 1 && (otype & GV_POINTS)) {
|
|
|
- G_warning(_("No points found, but requested to be exported. "
|
|
|
+ G_warning(_("No points found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_POINT)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_POINT);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_POINT)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_POINT);
|
|
|
}
|
|
|
|
|
|
if (Vect_get_num_primitives(&In, GV_LINE) < 1 && (otype & GV_LINE)) {
|
|
|
- G_warning(_("No lines found, but requested to be exported. "
|
|
|
+ G_warning(_("No lines found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_LINE)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_LINE);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_LINE)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_LINE);
|
|
|
}
|
|
|
|
|
|
- if (Vect_get_num_primitives(&In, GV_BOUNDARY) < 1 && (otype & GV_BOUNDARY)) {
|
|
|
- G_warning(_("No boundaries found, but requested to be exported. "
|
|
|
- "Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_BOUNDARY)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_BOUNDARY);
|
|
|
+ if (Vect_get_num_primitives(&In, GV_BOUNDARY) < 1 &&
|
|
|
+ (otype & GV_BOUNDARY)) {
|
|
|
+ G_warning(_("No boundaries found, but requested to be exported. "
|
|
|
+ "Will skip this feature type."));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_BOUNDARY)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_BOUNDARY);
|
|
|
}
|
|
|
|
|
|
if (Vect_get_num_areas(&In) < 1 && (otype & GV_AREA)) {
|
|
|
- G_warning(_("No areas found, but requested to be exported. "
|
|
|
+ G_warning(_("No areas found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_AREA)
|
|
|
- num_to_export = num_to_export + Vect_get_num_areas(&In);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_AREA)
|
|
|
+ num_to_export = num_to_export + Vect_get_num_areas(&In);
|
|
|
}
|
|
|
|
|
|
- if (Vect_get_num_primitives(&In, GV_CENTROID) < 1 && (otype & GV_CENTROID)) {
|
|
|
- G_warning(_("No centroids found, but requested to be exported. "
|
|
|
- "Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_CENTROID)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_CENTROID);
|
|
|
+ if (Vect_get_num_primitives(&In, GV_CENTROID) < 1 &&
|
|
|
+ (otype & GV_CENTROID)) {
|
|
|
+ G_warning(_("No centroids found, but requested to be exported. "
|
|
|
+ "Will skip this feature type."));
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_CENTROID)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_CENTROID);
|
|
|
}
|
|
|
|
|
|
if (Vect_get_num_primitives(&In, GV_FACE) < 1 && (otype & GV_FACE)) {
|
|
|
- G_warning(_("No faces found, but requested to be exported. "
|
|
|
+ G_warning(_("No faces found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_FACE)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_FACE);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_FACE)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_FACE);
|
|
|
}
|
|
|
|
|
|
if (Vect_get_num_primitives(&In, GV_KERNEL) < 1 && (otype & GV_KERNEL)) {
|
|
|
- G_warning(_("No kernels found, but requested to be exported. "
|
|
|
+ G_warning(_("No kernels found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_KERNEL)
|
|
|
- num_to_export = num_to_export + Vect_get_num_primitives(&In, GV_KERNEL);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_KERNEL)
|
|
|
+ num_to_export =
|
|
|
+ num_to_export + Vect_get_num_primitives(&In, GV_KERNEL);
|
|
|
}
|
|
|
|
|
|
if (Vect_get_num_volumes(&In) < 1 && (otype & GV_VOLUME)) {
|
|
|
- G_warning(_("No volumes found, but requested to be exported. "
|
|
|
+ G_warning(_("No volumes found, but requested to be exported. "
|
|
|
"Will skip this feature type."));
|
|
|
- } else {
|
|
|
- if (otype & GV_VOLUME)
|
|
|
- num_to_export = num_to_export + Vect_get_num_volumes(&In);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (otype & GV_VOLUME)
|
|
|
+ num_to_export = num_to_export + Vect_get_num_volumes(&In);
|
|
|
}
|
|
|
|
|
|
G_debug(1, "Requested to export %d features", num_to_export);
|
|
|
|
|
|
if (num_to_export < 1) {
|
|
|
- G_warning(_("Nothing to export"));
|
|
|
+ G_warning(_("Nothing to export"));
|
|
|
exit(EXIT_SUCCESS);
|
|
|
}
|
|
|
|
|
@@ -562,7 +588,7 @@ int main(int argc, char *argv[])
|
|
|
nocatskip++;
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/* Geometry */
|
|
|
if (type == GV_LINE && flags.poly->answer) {
|
|
|
OGRGeometryH ring;
|
|
@@ -584,7 +610,8 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
OGR_G_AddGeometryDirectly(Ogr_geometry, ring);
|
|
|
}
|
|
|
- else if ((type == GV_POINT) || ((type == GV_CENTROID) && (otype & GV_CENTROID))) {
|
|
|
+ else if ((type == GV_POINT) ||
|
|
|
+ ((type == GV_CENTROID) && (otype & GV_CENTROID))) {
|
|
|
Ogr_geometry = OGR_G_CreateGeometry(wkbPoint);
|
|
|
OGR_G_AddPoint(Ogr_geometry, Points->x[0], Points->y[0],
|
|
|
Points->z[0]);
|
|
@@ -613,7 +640,8 @@ int main(int argc, char *argv[])
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer, Ogr_feature, &noatt, &fout);
|
|
|
+ mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer,
|
|
|
+ Ogr_feature, &noatt, &fout);
|
|
|
OGR_L_CreateFeature(Ogr_layer, Ogr_feature);
|
|
|
}
|
|
|
OGR_G_DestroyGeometry(Ogr_geometry);
|
|
@@ -671,7 +699,7 @@ int main(int argc, char *argv[])
|
|
|
OGR_G_AddGeometryDirectly(Ogr_geometry, ring);
|
|
|
}
|
|
|
|
|
|
- Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
+ Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
OGR_F_SetGeometry(Ogr_feature, Ogr_geometry);
|
|
|
|
|
|
/* Output one feature for each category */
|
|
@@ -687,7 +715,8 @@ int main(int argc, char *argv[])
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer, Ogr_feature, &noatt, &fout);
|
|
|
+ mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer,
|
|
|
+ Ogr_feature, &noatt, &fout);
|
|
|
OGR_L_CreateFeature(Ogr_layer, Ogr_feature);
|
|
|
}
|
|
|
OGR_G_DestroyGeometry(Ogr_geometry);
|
|
@@ -697,8 +726,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
/* Faces (run always to count features of different type) - Faces are similar to lines */
|
|
|
if (Vect_get_num_primitives(&In, GV_FACE) > 0 && otype & GV_FACE) {
|
|
|
- G_message(_("Exporting %i faces..."),
|
|
|
- Vect_get_num_faces(&In));
|
|
|
+ G_message(_("Exporting %i faces..."), Vect_get_num_faces(&In));
|
|
|
for (i = 1; i <= Vect_get_num_faces(&In); i++) {
|
|
|
OGRGeometryH ring;
|
|
|
|
|
@@ -718,7 +746,7 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
if (type & GV_FACE) {
|
|
|
|
|
|
- Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
+ Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
|
|
|
/* Geometry */
|
|
|
Ogr_geometry = OGR_G_CreateGeometry(wkbPolygon25D);
|
|
@@ -747,14 +775,14 @@ int main(int argc, char *argv[])
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer, Ogr_feature, &noatt, &fout);
|
|
|
+ mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer,
|
|
|
+ Ogr_feature, &noatt, &fout);
|
|
|
OGR_L_CreateFeature(Ogr_layer, Ogr_feature);
|
|
|
}
|
|
|
|
|
|
OGR_G_DestroyGeometry(Ogr_geometry);
|
|
|
OGR_F_Destroy(Ogr_feature);
|
|
|
} /* if type & GV_FACE */
|
|
|
-
|
|
|
} /* for */
|
|
|
}
|
|
|
|
|
@@ -779,48 +807,48 @@ int main(int argc, char *argv[])
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/* Geometry */
|
|
|
if (type == GV_KERNEL) {
|
|
|
- Ogr_geometry = OGR_G_CreateGeometry(wkbPoint);
|
|
|
- OGR_G_AddPoint(Ogr_geometry, Points->x[0], Points->y[0],
|
|
|
- Points->z[0]);
|
|
|
-
|
|
|
- Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
-
|
|
|
- OGR_F_SetGeometry(Ogr_feature, Ogr_geometry);
|
|
|
-
|
|
|
- /* Output one feature for each category */
|
|
|
- for (j = -1; j < Cats->n_cats; j++) {
|
|
|
- if (j == -1) {
|
|
|
- if (cat >= 0)
|
|
|
- continue; /* cat(s) exists */
|
|
|
- }
|
|
|
- else {
|
|
|
- if (Cats->field[j] == field)
|
|
|
- cat = Cats->cat[j];
|
|
|
- else
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer, Ogr_feature, &noatt, &fout);
|
|
|
- OGR_L_CreateFeature(Ogr_layer, Ogr_feature);
|
|
|
- }
|
|
|
- OGR_G_DestroyGeometry(Ogr_geometry);
|
|
|
- OGR_F_Destroy(Ogr_feature);
|
|
|
+ Ogr_geometry = OGR_G_CreateGeometry(wkbPoint);
|
|
|
+ OGR_G_AddPoint(Ogr_geometry, Points->x[0], Points->y[0],
|
|
|
+ Points->z[0]);
|
|
|
+
|
|
|
+ Ogr_feature = OGR_F_Create(Ogr_featuredefn);
|
|
|
+
|
|
|
+ OGR_F_SetGeometry(Ogr_feature, Ogr_geometry);
|
|
|
+
|
|
|
+ /* Output one feature for each category */
|
|
|
+ for (j = -1; j < Cats->n_cats; j++) {
|
|
|
+ if (j == -1) {
|
|
|
+ if (cat >= 0)
|
|
|
+ continue; /* cat(s) exists */
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (Cats->field[j] == field)
|
|
|
+ cat = Cats->cat[j];
|
|
|
+ else
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ mk_att(cat, Fi, Driver, ncol, doatt, flags.nocat->answer,
|
|
|
+ Ogr_feature, &noatt, &fout);
|
|
|
+ OGR_L_CreateFeature(Ogr_layer, Ogr_feature);
|
|
|
+ }
|
|
|
+ OGR_G_DestroyGeometry(Ogr_geometry);
|
|
|
+ OGR_F_Destroy(Ogr_feature);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- TODO: Volumes. Do not export kernels here, that's already done.
|
|
|
- We do need to worry about holes, though.
|
|
|
- NOTE: We can probably just merge this with faces export function.
|
|
|
- Except for GRASS, which output format would know the difference?
|
|
|
- */
|
|
|
+ TODO: Volumes. Do not export kernels here, that's already done.
|
|
|
+ We do need to worry about holes, though.
|
|
|
+ NOTE: We can probably just merge this with faces export function.
|
|
|
+ Except for GRASS, which output format would know the difference?
|
|
|
+ */
|
|
|
if ((otype & GV_VOLUME)) {
|
|
|
- G_message(_("Exporting %i volumes..."), Vect_get_num_volumes(&In));
|
|
|
- G_warning(_("Export of volumes not implemented yet. Skipping."));
|
|
|
+ G_message(_("Exporting %i volumes..."), Vect_get_num_volumes(&In));
|
|
|
+ G_warning(_("Export of volumes not implemented yet. Skipping."));
|
|
|
}
|
|
|
|
|
|
OGR_DS_Destroy(Ogr_ds);
|
|
@@ -839,7 +867,7 @@ int main(int argc, char *argv[])
|
|
|
G_warning(_("%d features without attributes were written"), noatt);
|
|
|
if (nocatskip > 0)
|
|
|
G_message(_("%d features found without category were skipped"),
|
|
|
- nocatskip);
|
|
|
+ nocatskip);
|
|
|
|
|
|
/* Enable this? May be confusing that for area type are not reported
|
|
|
* all boundaries/centroids.
|
|
@@ -851,6 +879,6 @@ int main(int argc, char *argv[])
|
|
|
|
|
|
G_done_msg(_("%d features written to <%s> (%s)."), fout,
|
|
|
options.layer->answer, options.format->answer);
|
|
|
-
|
|
|
+
|
|
|
exit(EXIT_SUCCESS);
|
|
|
}
|