22 #include "base/Optionpk.h" 23 #include "imageclasses/ImgReaderOgr.h" 24 #include "imageclasses/ImgWriterOgr.h" 25 #include "imageclasses/ImgReaderGdal.h" 26 #include "imageclasses/ImgWriterGdal.h" 30 int main(
int argc,
char *argv[])
34 Optionpk<string> ogrformat_opt(
"f",
"f",
"Output OGR file format",
"ESRI Shapefile");
35 Optionpk<string> selectField_opt(
"select",
"select",
"select field (combined with like opt)");
37 Optionpk<string> like_opt(
"like",
"like",
"substring(s) to be found in select field. If multiple substrings are provided, feature will be selected if one of them is found (stringent option must be false)");
38 Optionpk<bool> stringent_opt(
"st",
"stringent",
"string in like option must exactly match to select feature)",
false);
42 Optionpk<long int> setfeature_opt(
"sf",
"sf",
"id of feature(s) to set (start from 0)");
45 Optionpk<string> addname_opt(
"an",
"an",
"name(s) of field(s) to add (number must exactly match field types)");
46 Optionpk<string> addtype_opt(
"at",
"at",
"type(s) of field(s) to add (number must exactly match fieldnames to add",
"Real");
52 doProcess=input_opt.retrieveOption(argc,argv);
53 output_opt.retrieveOption(argc,argv);
54 ogrformat_opt.retrieveOption(argc,argv);
55 selectField_opt.retrieveOption(argc,argv);
56 like_opt.retrieveOption(argc,argv);
57 stringent_opt.retrieveOption(argc,argv);
59 addname_opt.retrieveOption(argc,argv);
60 addtype_opt.retrieveOption(argc,argv);
61 addvalue_opt.retrieveOption(argc,argv);
62 setfeature_opt.retrieveOption(argc,argv);
63 setname_opt.retrieveOption(argc,argv);
64 setvalue_opt.retrieveOption(argc,argv);
65 verbose_opt.retrieveOption(argc,argv);
67 catch(
string predefinedString){
68 std::cout << predefinedString << std::endl;
72 std::cout <<
"short option -h shows basic options only, use long option --help to show all options" << std::endl;
75 if(input_opt.empty()){
76 std::cerr <<
"No input file provided (use option -i). Use --help for help information";
79 if(output_opt.empty()){
80 std::cerr <<
"No output file provided (use option -o). Use --help for help information";
84 cout <<
"opening " << input_opt[0] <<
" for reading " << endl;
87 cout <<
"opening " << output_opt[0] <<
" for writing " << endl;
89 OGRFieldType fieldType[addtype_opt.size()];
91 for(
int it=0;it<addtype_opt.size();++it){
92 for(
int iType = 0; iType < ogr_typecount; ++iType){
93 if( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL
94 && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),
95 addtype_opt[it].c_str()))
96 fieldType[it]=(OGRFieldType) iType;
99 std::cout << std::endl <<
"field type is: " << OGRFieldDefn::GetFieldTypeName(fieldType[it]) << std::endl;
105 unsigned long int ifeature=0;
107 cout <<
"going through features" << endl << flush;
112 int nlayer=ogrReader.getLayerCount();
114 std::cout <<
"number of layers: " << nlayer << endl;
116 for(
int ilayer=0;ilayer<nlayer;++ilayer){
117 OGRLayer *readLayer=ogrReader.getLayer(ilayer);
119 cout <<
"reset reading" << endl;
120 readLayer->ResetReading();
122 OGRLayer *writeLayer=ogrWriter.createLayer(output_opt[0],ogrReader.getProjection(),ogrReader.getGeometryType(ilayer),NULL);
123 std::vector<OGRFieldDefn*> readFields;
124 std::vector<OGRFieldDefn*> writeFields;
125 ogrReader.getFields(readFields,ilayer);
126 writeFields=readFields;
128 for(
int ifield=0;ifield<readFields.size();++ifield){
132 std::cout << readFields[ifield]->GetNameRef() <<
" -> " << writeFields[ifield]->GetNameRef() << std::endl;
133 if(writeLayer->CreateField(writeFields[ifield]) != OGRERR_NONE ){
138 es <<
"Creating field " << readFields[ifield] <<
" failed";
139 string errorString=es.str();
144 catch(
string errorString){
145 std::cerr << errorString << std::endl;
149 std::cout <<
"add " << addname_opt.size() <<
" fields" << std::endl;
150 if(addname_opt.size()){
151 assert(addname_opt.size()==addtype_opt.size());
152 while(addvalue_opt.size()<addname_opt.size())
153 addvalue_opt.push_back(addvalue_opt.back());
155 for(
int iname=0;iname<addname_opt.size();++iname){
157 std::cout << addname_opt[iname] <<
" " << std::endl;
158 ogrWriter.createField(addname_opt[iname],fieldType[iname]);
161 std::cout << std::endl;
162 std::cout << addname_opt.size() <<
" fields created" << std::endl;
164 const char* pszMessage;
165 void* pProgressArg=NULL;
166 GDALProgressFunc pfnProgress=GDALTermProgress;
168 OGRFeature *poFeature;
169 unsigned long int nfeature=ogrReader.getFeatureCount(ilayer);
170 while((poFeature = ogrReader.getLayer(ilayer)->GetNextFeature()) != NULL ){
172 std::cout <<
"feature " << ifeature << std::endl;
178 assert(selectField_opt.size());
179 int fieldIndex=poFeature->GetFieldIndex(selectField_opt[0].c_str());
180 string fieldValue=poFeature->GetFieldAsString(fieldIndex);
181 if(stringent_opt[0]){
182 if(fieldValue==like_opt[0])
189 for(
int ilike=0;ilike<like_opt.size();++ilike){
190 if(fieldValue.find(like_opt[ilike])!=std::string::npos){
192 std::cout <<
"found " << like_opt[ilike] <<
" in " << fieldValue << std::endl;
201 std::cout <<
"string not found in feature " << ifeature << std::endl;
204 OGRFeature *poDstFeature = NULL;
205 poDstFeature=ogrWriter.createFeature(ilayer);
206 if( poDstFeature->SetFrom( poFeature, TRUE ) != OGRERR_NONE ){
208 string errorString=
"Unable to translate feature %d from layer %s.\n";
209 fmt=errorString.c_str();
210 CPLError( CE_Failure, CPLE_AppDefined,
212 poFeature->GetFID(), ogrWriter.getLayerName().c_str() );
213 OGRFeature::DestroyFeature( poFeature );
214 OGRFeature::DestroyFeature( poDstFeature );
216 long int fid=poFeature->GetFID();
217 poDstFeature->SetFID( poFeature->GetFID() );
218 for(
int ifeature=0;ifeature<setfeature_opt.size();++ifeature){
219 if(fid==setfeature_opt[ifeature]){
220 switch(poDstFeature->GetFieldDefnRef(fid)->GetType()){
222 poDstFeature->SetField(setname_opt[ifeature].c_str(),string2type<float>(setvalue_opt[ifeature]));
225 poDstFeature->SetField(setname_opt[ifeature].c_str(),string2type<int>(setvalue_opt[ifeature]));
228 poDstFeature->SetField(setname_opt[ifeature].c_str(),setvalue_opt[ifeature].c_str());
231 std::cerr <<
"Error: field type not supported" << std::endl;
240 std::cout <<
"set default values for new fields in feature " << ifeature << std::endl;
241 for(
int iname=0;iname<addname_opt.size();++iname){
242 switch(fieldType[iname]){
245 std::cout <<
"set field " << addname_opt[iname] <<
" to default " << string2type<float>(addvalue_opt[iname]) << std::endl;
246 poDstFeature->SetField(addname_opt[iname].c_str(),string2type<float>(addvalue_opt[iname]));
250 std::cout <<
"set field " << addname_opt[iname] <<
" to default " << string2type<int>(addvalue_opt[iname]) << std::endl;
251 poDstFeature->SetField(addname_opt[iname].c_str(),string2type<int>(addvalue_opt[iname]));
255 std::cout <<
"set field " << addname_opt[iname] <<
" to default " << addvalue_opt[iname] << std::endl;
256 poDstFeature->SetField(addname_opt[iname].c_str(),addvalue_opt[iname].c_str());
259 std::cerr <<
"Error: field type not supported" << std::endl;
266 std::cout <<
"create feature" << std::endl;
267 if(ogrWriter.createFeature( poDstFeature,ilayer ) != OGRERR_NONE){
269 string errorString=
"Unable to translate feature %d from layer %s.\n";
270 fmt=errorString.c_str();
271 CPLError( CE_Failure, CPLE_AppDefined,
273 poFeature->GetFID(), ogrWriter.getLayerName().c_str() );
274 OGRFeature::DestroyFeature( poDstFeature );
276 OGRFeature::DestroyFeature( poFeature );
277 OGRFeature::DestroyFeature( poDstFeature );
278 progress=
static_cast<float>(ifeature+1)/nfeature;
279 pfnProgress(progress,pszMessage,pProgressArg);
283 std::cout <<
"replaced " << ifeature <<
" features" << std::endl;