pktools 2.6.7
Processing Kernel for geospatial data
pkascii2ogr.cc
1/**********************************************************************
2pkascii2ogr.cc: program to create vector points or polygons from text file
3Copyright (C) 2008-2014 Pieter Kempeneers
4
5This file is part of pktools
6
7pktools is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation, either version 3 of the License, or
10(at your option) any later version.
11
12pktools is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with pktools. If not, see <http://www.gnu.org/licenses/>.
19***********************************************************************/
20#include <string>
21#include <fstream>
22#include <assert.h>
23#include "base/Optionpk.h"
24#include "imageclasses/ImgWriterOgr.h"
25
26/******************************************************************************/
70using namespace std;
71
72int main(int argc, char *argv[])
73{
74 Optionpk<string> input_opt("i","input","Input ASCII file");
75 Optionpk<string> output_opt("o", "output", "Output file");
76 Optionpk<string> ogrformat_opt("f", "f", "Output sample file format","ESRI Shapefile");
77 Optionpk<short> colX_opt("x", "x", "column number of x (0)", 0);
78 Optionpk<short> colY_opt("y", "y", "column number of y (1)", 1);
79 Optionpk<bool> polygon_opt("l", "line", "create OGRPolygon as geometry instead of points. Fields are taken from first point and polygon is automatically closed (no need to repeat first point at last line). (false: use OGRPoint)", false);
80 Optionpk<string> fname_opt("n", "name", "Field names for the columns in the input ascii file");
81 Optionpk<string> ftype_opt("ot", "ot", "Field type (Real, Integer, String) for each of the fields as defined by name","Real");
82 Optionpk<string> projection_opt("a_srs", "a_srs", "Override the projection for the output file, use epsg:<code> or Wkt string", "epsg:4326");
83 Optionpk<char> fs_opt("fs","fs","field separator.",' ');
84 Optionpk<int> verbose_opt("v", "verbose", "verbose (0)", 0,2);
85
86 bool doProcess;//stop process when program was invoked with help option (-h --help)
87 try{
88 doProcess=input_opt.retrieveOption(argc,argv);
89 output_opt.retrieveOption(argc,argv);
90 ogrformat_opt.retrieveOption(argc,argv);
91 colX_opt.retrieveOption(argc,argv);
92 colY_opt.retrieveOption(argc,argv);
93 polygon_opt.retrieveOption(argc,argv);
94 fname_opt.retrieveOption(argc,argv);
95 ftype_opt.retrieveOption(argc,argv);
96 projection_opt.retrieveOption(argc,argv);
97 fs_opt.retrieveOption(argc,argv);
98 verbose_opt.retrieveOption(argc,argv);
99 }
100 catch(string predefinedString){
101 std::cout << predefinedString << std::endl;
102 exit(0);
103 }
104 if(!doProcess){
105 cout << endl;
106 cout << "Usage: pkascii2ogr -i input.txt -o output" << endl;
107 cout << endl;
108 std::cout << "short option -h shows basic options only, use long option --help to show all options" << std::endl;
109 exit(0);//help was invoked, stop processing
110 }
111 if(input_opt.empty()){
112 std::cerr << "No input file provided (use option -i). Use --help for help information";
113 exit(0);
114 }
115 if(output_opt.empty()){
116 std::cerr << "No output file provided (use option -o). Use --help for help information";
117 exit(0);
118 }
119
120 string theProjection;
121 theProjection=projection_opt[0];
122 int ogr_typecount=11;//hard coded for now!
123 while(ftype_opt.size()<fname_opt.size())
124 ftype_opt.push_back(ftype_opt[0]);
125 // vector<string> fname(fname_opt.size());
126 vector<OGRFieldType> ftype(ftype_opt.size());
127 if(verbose_opt[0])
128 cout << "field types can be: ";
129 for(int ifield=0;ifield<fname_opt.size();++ifield){
130 // fname[ifield]=fname_opt[ifield];
131 for(int iType = 0; iType < ogr_typecount; ++iType){
132 if(!ifield&&verbose_opt[0])
133 cout << " " << OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType);
134 if( OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType) != NULL
135 && EQUAL(OGRFieldDefn::GetFieldTypeName((OGRFieldType)iType),
136 ftype_opt[ifield].c_str()))
137 ftype[ifield]=(OGRFieldType) iType;
138 }
139 }
140 //todo: what if unknown?
141 if(verbose_opt[0]){
142 cout << endl << "field types are: ";
143 for(int ifield=0;ifield<ftype.size();++ifield)
144 cout << OGRFieldDefn::GetFieldTypeName(ftype[ifield]) << " ";
145 cout << endl;
146 }
147
148 ImgWriterOgr imgWriter;
149 imgWriter.open(output_opt[0],ogrformat_opt[0]);
150 try{
151 if(polygon_opt[0])
152 imgWriter.ascii2ogr(input_opt[0], "New Layer", fname_opt, ftype, colX_opt[0], colY_opt[0], theProjection, wkbPolygon, fs_opt[0]);
153 else
154 imgWriter.ascii2ogr(input_opt[0], "New Layer", fname_opt, ftype, colX_opt[0], colY_opt[0], theProjection, wkbPoint, fs_opt[0]);
155 }
156 catch(string errorString){
157 cout << errorString << endl;
158 }
159 imgWriter.close();
160}