shp2txt/src/cpp/shp_2_txt.cpp
dfriedrich bfaaa91639 first
2019-05-23 21:08:09 -04:00

95 lines
2.5 KiB
C++

/*
http://shapelib.maptools.org/dbf_api.html
basic funtionality taken from dbfdump.c
path to libshp.dll has to be added as a PATH var
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <fstream>
using namespace std;
#include "shapefil.h"
int main(int argc, char const *argv[])
{ string dbf_filename;
string txt_filename;
if (argc == 1)
{
// no arguments given, print help
cout << "No input and output files defined!" << endl;
cout << "example: shp_2_txt -i MA.dbf -o MA.txt" << endl;
return 0;
}
// parse arguments
for (int i = 1; i < argc; i++)
{
if (argv[i][0] == '\0')
{
continue;
}
else if (strcmp(argv[i],"-i") == 0)
{
dbf_filename = argv[i + 1];
}
else if (strcmp(argv[i],"-o") == 0 )
{
txt_filename = argv[i + 1];
}
}
DBFHandle dbfh;
int i, iRecord;
char szTitle[12];
cout << dbf_filename << " " << txt_filename << endl;
// open textfile and dbf handle
ofstream txt_file(txt_filename);
dbfh = DBFOpen(dbf_filename.c_str(), "rb");
// check
if (dbfh <= 0)
{
throw string("File " + dbf_filename + " not found");
}
else
{
// loop over dbf records
for( iRecord = 0; iRecord < DBFGetRecordCount(dbfh); iRecord++ )
{
// loop over fields of record
for( i = 0; i < DBFGetFieldCount(dbfh); i++ )
{
// DBFFieldType eType;
// eType = DBFGetFieldInfo( dbfh, i, szTitle, &nWidth, &nDecimals );
string dec_lat = "DEC_LAT";
string dec_lon = "DEC_LON";
string ellip_h = "ELLIP_HT";
string ortho_h = "ORTHO_HT";
string str(szTitle);
string line;
// parse for lat, lon in degrees and orhto height
if (szTitle == dec_lat or szTitle == dec_lon or szTitle == ortho_h)
{
txt_file << DBFReadStringAttribute( dbfh, iRecord, i );
txt_file << " ";
}
}
txt_file << endl;
}
// close dbf handle and textfile
DBFClose( dbfh );
txt_file.close();
cout << "Done." << endl;
}
return 0;
}