From b51914707dd4cdde228f89c5b913a249b0cbcdbe Mon Sep 17 00:00:00 2001 From: curt Date: Tue, 8 Nov 2005 16:30:10 +0000 Subject: [PATCH] Initial revision. This is a little util that can fill SRTM voids with data from another DEM source. --- src/Prep/DemChop/fillvoids.cxx | 126 +++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 src/Prep/DemChop/fillvoids.cxx diff --git a/src/Prep/DemChop/fillvoids.cxx b/src/Prep/DemChop/fillvoids.cxx new file mode 100644 index 00000000..c0f81a6a --- /dev/null +++ b/src/Prep/DemChop/fillvoids.cxx @@ -0,0 +1,126 @@ +// fillvoids.cxx -- fill voids in one array from data points of another array. +// +// Written by Curtis Olson, started November 2005. +// +// Copyright (C) 2005 Curtis L. Olson - http://www.flightgear.org/~curt +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// +// $Id$ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include STL_STRING + +#include +#include +#include + +#include + +SG_USING_STD(cout); +SG_USING_STD(string); + + +int main(int argc, char **argv) { + sglog().setLogLevels( SG_ALL, SG_WARN ); + + if ( argc != 3 ) { + cout << "Usage " << argv[0] << " " + << endl; + exit(-1); + } + + string src_array_path = argv[1]; + string fill_base_path = argv[2]; + + // compute the fill array path + SGPath tmp1( src_array_path ); + string tmp2 = tmp1.base(); // strip .gz + cout << "tmp2 = " << tmp2 << endl; + string tmp3 = SGPath(tmp2).base(); // strip .arr + cout << "tmp3 = " << tmp3 << endl; + string file = SGPath(tmp3).file(); + cout << "file = " << file << endl; + long int index = atoi(file.c_str()); + SGBucket bucket( index ); + SGPath tmp4( fill_base_path ); + tmp4.append( bucket.gen_base_path() ); + tmp4.append( file ); + string tmp5 = tmp1.dir(); + string tmp6 = SGPath(tmp5).dir(); + string tmp7 = SGPath(tmp6).dir(); + cout << "tmp7 = " << tmp7 << endl; + + cout << "Index = " << index << endl; + cout << "fill array = " << tmp4.str() << endl; + + // open the source array + TGArray src_array; + src_array.open( tmp3 ); + src_array.parse( bucket ); + if ( !src_array.is_open() ) { + cout << "Unable to open source array " << tmp3 << endl; + return -1; + } + + // open the fill array + TGArray fill_array; + fill_array.open( tmp4.str() ); + fill_array.parse( bucket ); + if ( !fill_array.is_open() ) { + cout << "no fill array, nothing to do " << tmp4.str() << endl; + return 0; + } + + // traverse the source array and lookup replacement values for any voids + bool has_void = false; + for ( int i = 0; i < src_array.get_cols(); ++i ) { + for ( int j = 0; j < src_array.get_rows(); ++j ) { + int src_elev = src_array.get_array_elev(i, j); + if ( src_elev < -9000 ) { + has_void = true; + cout << "We have a void = " << src_elev << endl; + int fill_elev = fill_array.get_array_elev(i, j); + cout << "Replacing with " << fill_elev << endl; + src_array.set_array_elev(i, j, fill_elev); + } + } + } + + // write out the new data file if we filled any voids + if ( has_void ) { + cout << "Has voids, writing file ..." << endl; + bool result = src_array.write( tmp7, bucket ); + if ( result ) { + // filled data written to new file name, now replace old file + SGPath tmp_file(tmp3); + tmp_file.concat(".arr.new.gz"); + SGPath orig_file(tmp3); + orig_file.concat(".arr.gz"); + rename( tmp_file.str().c_str(), orig_file.str().c_str() ); + } + } else { + cout << "no voids" << endl; + } + + return 0; +} + +