Add a tool to chop CGIAR (http://srtm.csi.cgiar.org/) srtm improved files
This commit is contained in:
parent
1bca4c11e2
commit
00b8658b99
11 changed files with 827 additions and 153 deletions
|
@ -104,6 +104,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\..\src\Lib\Hgt\hgt.cxx">
|
RelativePath="..\..\..\src\Lib\Hgt\hgt.cxx">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\Lib\Hgt\srtmbase.cxx">
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Header Files"
|
Name="Header Files"
|
||||||
|
@ -112,6 +115,9 @@
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\..\src\Lib\Hgt\hgt.hxx">
|
RelativePath="..\..\..\src\Lib\Hgt\hgt.hxx">
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\Lib\Hgt\srtmbase.hxx">
|
||||||
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
Name="Resource Files"
|
Name="Resource Files"
|
||||||
|
|
2
projects/VC7.1/srtmchop/.gitignore
vendored
Normal file
2
projects/VC7.1/srtmchop/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Debug
|
||||||
|
Release
|
140
projects/VC7.1/srtmchop/srtmchop.vcproj
Normal file
140
projects/VC7.1/srtmchop/srtmchop.vcproj
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="7.10"
|
||||||
|
Name="srtmchop"
|
||||||
|
ProjectGUID="{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}"
|
||||||
|
Keyword="Win32Proj">
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"/>
|
||||||
|
</Platforms>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="..\bin\Debug"
|
||||||
|
IntermediateDirectory="Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\..\SimGear.cs;..\..\..\..;..\..\..\..\3rdParty\include;..\..\..\..\install\msvc71\OpenSceneGraph\include;..\..\..\src\Lib;..\..\..\src\BuildTiles;..\..\..\..\gpc232;..\..\..\src"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE;NOMINMAX"
|
||||||
|
MinimalRebuild="TRUE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="4"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ul_d.lib sg_d.lib zlibd.lib libtiffd.lib"
|
||||||
|
OutputFile="$(OutDir)/srtmchop.exe"
|
||||||
|
LinkIncremental="2"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\..\plib;..\..\..\..\3rdParty\lib"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
ProgramDatabaseFile="$(OutDir)/srtmchop.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="..\bin\Release"
|
||||||
|
IntermediateDirectory="Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\..\SimGear.cs;..\..\..\..;..\..\..\..\3rdParty\include;..\..\..\..\install\msvc71\OpenSceneGraph\include;..\..\..\src\Lib;..\..\..\src\BuildTiles;..\..\..\..\gpc232;..\..\..\src"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;NOMINMAX"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
RuntimeTypeInfo="TRUE"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="3"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ul.lib sg.lib zlib.lib libtiff.lib"
|
||||||
|
OutputFile="$(OutDir)/srtmchop.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
AdditionalLibraryDirectories="..\..\..\..\plib;..\..\..\..\3rdParty\lib"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\Prep\DemChop\srtmchop.cxx">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
|
@ -233,6 +233,12 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "poly2ogr", "poly2ogr\poly2o
|
||||||
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED} = {22540CD3-D3CA-4C86-A773-80AEEE3ACDED}
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED} = {22540CD3-D3CA-4C86-A773-80AEEE3ACDED}
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "srtmchop", "srtmchop\srtmchop.vcproj", "{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{322E9356-2E79-49A6-A7B6-643B35DEB67D} = {322E9356-2E79-49A6-A7B6-643B35DEB67D}
|
||||||
|
{22540CD3-D3CA-4C86-A773-80AEEE3ACDED} = {22540CD3-D3CA-4C86-A773-80AEEE3ACDED}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfiguration) = preSolution
|
GlobalSection(SolutionConfiguration) = preSolution
|
||||||
Debug = Debug
|
Debug = Debug
|
||||||
|
@ -403,6 +409,10 @@ Global
|
||||||
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Debug.Build.0 = Debug|Win32
|
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Debug.Build.0 = Debug|Win32
|
||||||
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Release.ActiveCfg = Release|Win32
|
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Release.ActiveCfg = Release|Win32
|
||||||
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Release.Build.0 = Release|Win32
|
{74F5BBD4-D669-4348-8B46-11700135CCF1}.Release.Build.0 = Release|Win32
|
||||||
|
{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}.Debug.ActiveCfg = Debug|Win32
|
||||||
|
{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}.Debug.Build.0 = Debug|Win32
|
||||||
|
{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}.Release.ActiveCfg = Release|Win32
|
||||||
|
{7490AAD8-D2A4-4F0D-8150-68DCE07F3116}.Release.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
noinst_LIBRARIES = libHGT.a
|
noinst_LIBRARIES = libHGT.a
|
||||||
|
|
||||||
libHGT_a_SOURCES = hgt.cxx hgt.hxx
|
libHGT_a_SOURCES = hgt.cxx hgt.hxx srtmbase.cxx srtmbase.hxx
|
||||||
|
|
||||||
noinst_PROGRAMS = testhgt
|
noinst_PROGRAMS = testhgt
|
||||||
|
|
||||||
|
|
|
@ -183,124 +183,9 @@ TGHgt::load( ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// write out the area of data covered by the specified bucket. Data
|
|
||||||
// is written out column by column starting at the lower left hand
|
|
||||||
// corner.
|
|
||||||
bool
|
|
||||||
TGHgt::write_area( const string& root, SGBucket& b ) {
|
|
||||||
// calculate some boundaries
|
|
||||||
double min_x = ( b.get_center_lon() - 0.5 * b.get_width() ) * 3600.0;
|
|
||||||
double max_x = ( b.get_center_lon() + 0.5 * b.get_width() ) * 3600.0;
|
|
||||||
|
|
||||||
double min_y = ( b.get_center_lat() - 0.5 * b.get_height() ) * 3600.0;
|
|
||||||
double max_y = ( b.get_center_lat() + 0.5 * b.get_height() ) * 3600.0;
|
|
||||||
|
|
||||||
cout << b << endl;
|
|
||||||
cout << "width = " << b.get_width() << " height = " << b.get_height()
|
|
||||||
<< endl;
|
|
||||||
cout << "min = " << min_x << "," << min_y
|
|
||||||
<< " max = " << max_x << "," << max_y << endl;
|
|
||||||
int start_x = (int)((min_x - originx) / col_step);
|
|
||||||
int span_x = (int)(b.get_width() * 3600.0 / col_step);
|
|
||||||
|
|
||||||
int start_y = (int)((min_y - originy) / row_step);
|
|
||||||
int span_y = (int)(b.get_height() * 3600.0 / row_step);
|
|
||||||
|
|
||||||
cout << "start_x = " << start_x << " span_x = " << span_x << endl;
|
|
||||||
cout << "start_y = " << start_y << " span_y = " << span_y << endl;
|
|
||||||
|
|
||||||
// Do a simple sanity checking. But, please, please be nice to
|
|
||||||
// this write_area() routine and feed it buckets that coincide
|
|
||||||
// well with the underlying grid structure and spacing.
|
|
||||||
|
|
||||||
if ( ( min_x < originx )
|
|
||||||
|| ( max_x > originx + cols * col_step )
|
|
||||||
|| ( min_y < originy )
|
|
||||||
|| ( max_y > originy + rows * row_step ) ) {
|
|
||||||
cout << " ERROR: bucket at least partially outside HGT data range!" <<
|
|
||||||
endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the area is all ocean, skip it.
|
|
||||||
if ( !has_non_zero_elev(start_x, span_x, start_y, span_y) ) {
|
|
||||||
cout << "Tile is all zero elevation: skipping" << endl;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// generate output file name
|
|
||||||
string base = b.gen_base_path();
|
|
||||||
string path = root + "/" + base;
|
|
||||||
SGPath sgp( path );
|
|
||||||
sgp.append( "dummy" );
|
|
||||||
sgp.create_dir( 0755 );
|
|
||||||
|
|
||||||
string array_file = path + "/" + b.gen_index_str() + ".arr.gz";
|
|
||||||
cout << "array_file = " << array_file << endl;
|
|
||||||
|
|
||||||
// write the file
|
|
||||||
gzFile fp;
|
|
||||||
if ( (fp = gzopen( array_file.c_str(), "wb9" )) == NULL ) {
|
|
||||||
cout << "ERROR: cannot open " << array_file << " for writing!" << endl;
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
gzprintf( fp, "%d %d\n", (int)min_x, (int)min_y );
|
|
||||||
gzprintf( fp, "%d %d %d %d\n", span_x + 1, (int)col_step,
|
|
||||||
span_y + 1, (int)row_step );
|
|
||||||
for ( int i = start_x; i <= start_x + span_x; ++i ) {
|
|
||||||
for ( int j = start_y; j <= start_y + span_y; ++j ) {
|
|
||||||
gzprintf( fp, "%d ", (int)data[i][j] );
|
|
||||||
}
|
|
||||||
gzprintf( fp, "\n" );
|
|
||||||
}
|
|
||||||
gzclose(fp);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// write the entire area out in a simple ascii format
|
|
||||||
bool TGHgt::write_whole_ascii( const string& file ) {
|
|
||||||
cout << "writing to " << file << endl;
|
|
||||||
// write the file
|
|
||||||
gzFile fp;
|
|
||||||
if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
|
|
||||||
cout << "ERROR: cannot open " << file << " for writing!" << endl;
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
gzprintf( fp, "%d\n%d\n", rows, cols );
|
|
||||||
for ( int row = rows - 1; row >= 0; row-- ) {
|
|
||||||
for ( int col = 0; col < cols; col++ ) {
|
|
||||||
gzprintf( fp, "%d\n", (int)data[col][row] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
gzclose(fp);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TGHgt::~TGHgt() {
|
TGHgt::~TGHgt() {
|
||||||
// printf("class TGHgt DEstructor called.\n");
|
// printf("class TGSrtmBase DEstructor called.\n");
|
||||||
delete [] data;
|
delete [] data;
|
||||||
delete [] output_data;
|
delete [] output_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
TGHgt::has_non_zero_elev (int start_x, int span_x,
|
|
||||||
int start_y, int span_y) const
|
|
||||||
{
|
|
||||||
for ( int row = start_y; row < start_y + span_y; row++ ) {
|
|
||||||
for ( int col = start_x; col < start_x + span_x; col++ ) {
|
|
||||||
if ( data[col][row] != 0 )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,8 @@
|
||||||
|
|
||||||
#include <simgear/compiler.h>
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include "srtmbase.hxx"
|
||||||
|
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -40,31 +42,19 @@
|
||||||
#define MAX_HGT_SIZE 3601
|
#define MAX_HGT_SIZE 3601
|
||||||
|
|
||||||
|
|
||||||
class TGHgt {
|
class TGHgt : public TGSrtmBase {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
// file pointer for input
|
// file pointer for input
|
||||||
gzFile fd;
|
gzFile fd;
|
||||||
|
|
||||||
// coordinates (in arc seconds) of south west corner
|
int hgt_resolution;
|
||||||
double originx, originy;
|
|
||||||
|
|
||||||
// number of columns and rows
|
|
||||||
int cols, rows;
|
|
||||||
|
|
||||||
// Distance between column and row data points (in arc seconds)
|
|
||||||
double col_step, row_step;
|
|
||||||
|
|
||||||
// pointers to the actual grid data allocated here
|
// pointers to the actual grid data allocated here
|
||||||
short int (*data)[MAX_HGT_SIZE];
|
short int (*data)[MAX_HGT_SIZE];
|
||||||
short int (*output_data)[MAX_HGT_SIZE];
|
short int (*output_data)[MAX_HGT_SIZE];
|
||||||
|
|
||||||
int hgt_resolution;
|
|
||||||
|
|
||||||
bool remove_tmp_file;
|
|
||||||
SGPath remove_file_name;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
// Constructor, _res must be either "1" for the 1arcsec data or
|
// Constructor, _res must be either "1" for the 1arcsec data or
|
||||||
|
@ -84,27 +74,7 @@ public:
|
||||||
// load an hgt file
|
// load an hgt file
|
||||||
bool load();
|
bool load();
|
||||||
|
|
||||||
// write out the area of data covered by the specified bucket.
|
virtual short height( int x, int y ) const { return data[x][y]; }
|
||||||
// Data is written out column by column starting at the lower left
|
|
||||||
// hand corner.
|
|
||||||
bool write_area( const std::string& root, SGBucket& b );
|
|
||||||
|
|
||||||
// write the entire area out in a simple ascii format
|
|
||||||
bool write_whole_ascii( const std::string& file );
|
|
||||||
|
|
||||||
// Informational methods
|
|
||||||
inline double get_originx() const { return originx; }
|
|
||||||
inline double get_originy() const { return originy; }
|
|
||||||
inline int get_cols() const { return cols; }
|
|
||||||
inline int get_rows() const { return rows; }
|
|
||||||
inline double get_col_step() const { return col_step; }
|
|
||||||
inline double get_row_step() const { return row_step; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test whether an area contains any non-zero elevations.
|
|
||||||
*/
|
|
||||||
bool has_non_zero_elev (int start_x, int span_x,
|
|
||||||
int start_y, int span_y) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
151
src/Lib/HGT/srtmbase.cxx
Normal file
151
src/Lib/HGT/srtmbase.cxx
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
// hgt.hxx -- SRTM "hgt" data management class
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started February 2003.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 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: hgt.cxx,v 1.7 2005-12-19 16:06:45 curt Exp $
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include "srtmbase.hxx"
|
||||||
|
|
||||||
|
using std::cout;
|
||||||
|
using std::endl;
|
||||||
|
|
||||||
|
|
||||||
|
// write out the area of data covered by the specified bucket. Data
|
||||||
|
// is written out column by column starting at the lower left hand
|
||||||
|
// corner.
|
||||||
|
bool
|
||||||
|
TGSrtmBase::write_area( const string& root, SGBucket& b ) {
|
||||||
|
// calculate some boundaries
|
||||||
|
double min_x = ( b.get_center_lon() - 0.5 * b.get_width() ) * 3600.0;
|
||||||
|
double max_x = ( b.get_center_lon() + 0.5 * b.get_width() ) * 3600.0;
|
||||||
|
|
||||||
|
double min_y = ( b.get_center_lat() - 0.5 * b.get_height() ) * 3600.0;
|
||||||
|
double max_y = ( b.get_center_lat() + 0.5 * b.get_height() ) * 3600.0;
|
||||||
|
|
||||||
|
cout << b << endl;
|
||||||
|
cout << "width = " << b.get_width() << " height = " << b.get_height()
|
||||||
|
<< endl;
|
||||||
|
cout << "min = " << min_x << "," << min_y
|
||||||
|
<< " max = " << max_x << "," << max_y << endl;
|
||||||
|
int start_x = (int)((min_x - originx) / col_step);
|
||||||
|
int span_x = (int)(b.get_width() * 3600.0 / col_step);
|
||||||
|
|
||||||
|
int start_y = (int)((min_y - originy) / row_step);
|
||||||
|
int span_y = (int)(b.get_height() * 3600.0 / row_step);
|
||||||
|
|
||||||
|
cout << "start_x = " << start_x << " span_x = " << span_x << endl;
|
||||||
|
cout << "start_y = " << start_y << " span_y = " << span_y << endl;
|
||||||
|
|
||||||
|
// Do a simple sanity checking. But, please, please be nice to
|
||||||
|
// this write_area() routine and feed it buckets that coincide
|
||||||
|
// well with the underlying grid structure and spacing.
|
||||||
|
|
||||||
|
if ( ( min_x < originx )
|
||||||
|
|| ( max_x > originx + cols * col_step )
|
||||||
|
|| ( min_y < originy )
|
||||||
|
|| ( max_y > originy + rows * row_step ) ) {
|
||||||
|
cout << " ERROR: bucket at least partially outside HGT data range!" <<
|
||||||
|
endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the area is all ocean, skip it.
|
||||||
|
if ( !has_non_zero_elev(start_x, span_x, start_y, span_y) ) {
|
||||||
|
cout << "Tile is all zero elevation: skipping" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate output file name
|
||||||
|
string base = b.gen_base_path();
|
||||||
|
string path = root + "/" + base;
|
||||||
|
SGPath sgp( path );
|
||||||
|
sgp.append( "dummy" );
|
||||||
|
sgp.create_dir( 0755 );
|
||||||
|
|
||||||
|
string array_file = path + "/" + b.gen_index_str() + ".arr.gz";
|
||||||
|
cout << "array_file = " << array_file << endl;
|
||||||
|
|
||||||
|
// write the file
|
||||||
|
gzFile fp;
|
||||||
|
if ( (fp = gzopen( array_file.c_str(), "wb9" )) == NULL ) {
|
||||||
|
cout << "ERROR: cannot open " << array_file << " for writing!" << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gzprintf( fp, "%d %d\n", (int)min_x, (int)min_y );
|
||||||
|
gzprintf( fp, "%d %d %d %d\n", span_x + 1, (int)col_step,
|
||||||
|
span_y + 1, (int)row_step );
|
||||||
|
for ( int i = start_x; i <= start_x + span_x; ++i ) {
|
||||||
|
for ( int j = start_y; j <= start_y + span_y; ++j ) {
|
||||||
|
gzprintf( fp, "%d ", (int)height(i,j) );
|
||||||
|
}
|
||||||
|
gzprintf( fp, "\n" );
|
||||||
|
}
|
||||||
|
gzclose(fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// write the entire area out in a simple ascii format
|
||||||
|
bool TGSrtmBase::write_whole_ascii( const string& file ) {
|
||||||
|
cout << "writing to " << file << endl;
|
||||||
|
// write the file
|
||||||
|
gzFile fp;
|
||||||
|
if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
|
||||||
|
cout << "ERROR: cannot open " << file << " for writing!" << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
gzprintf( fp, "%d\n%d\n", rows, cols );
|
||||||
|
for ( int row = rows - 1; row >= 0; row-- ) {
|
||||||
|
for ( int col = 0; col < cols; col++ ) {
|
||||||
|
gzprintf( fp, "%d\n", (int)height(col,row) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
gzclose(fp);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
TGSrtmBase::has_non_zero_elev (int start_x, int span_x,
|
||||||
|
int start_y, int span_y) const
|
||||||
|
{
|
||||||
|
for ( int row = start_y; row < start_y + span_y; row++ ) {
|
||||||
|
for ( int col = start_x; col < start_x + span_x; col++ ) {
|
||||||
|
if ( height(col,row) != 0 )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
82
src/Lib/HGT/srtmbase.hxx
Normal file
82
src/Lib/HGT/srtmbase.hxx
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
// hgt.hxx -- SRTM "hgt" data management class
|
||||||
|
//
|
||||||
|
// Written by Curtis Olson, started February 2003.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2003 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: hgt.hxx,v 1.4 2004-11-19 22:25:50 curt Exp $
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef _SRTMBASE_HXX
|
||||||
|
#define _SRTMBASE_HXX
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <simgear/bucket/newbucket.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
|
class TGSrtmBase {
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// coordinates (in arc seconds) of south west corner
|
||||||
|
double originx, originy;
|
||||||
|
|
||||||
|
// number of columns and rows
|
||||||
|
int cols, rows;
|
||||||
|
|
||||||
|
// Distance between column and row data points (in arc seconds)
|
||||||
|
double col_step, row_step;
|
||||||
|
|
||||||
|
bool remove_tmp_file;
|
||||||
|
SGPath remove_file_name;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// write out the area of data covered by the specified bucket.
|
||||||
|
// Data is written out column by column starting at the lower left
|
||||||
|
// hand corner.
|
||||||
|
bool write_area( const std::string& root, SGBucket& b );
|
||||||
|
|
||||||
|
// write the entire area out in a simple ascii format
|
||||||
|
bool write_whole_ascii( const std::string& file );
|
||||||
|
|
||||||
|
// Informational methods
|
||||||
|
inline double get_originx() const { return originx; }
|
||||||
|
inline double get_originy() const { return originy; }
|
||||||
|
inline int get_cols() const { return cols; }
|
||||||
|
inline int get_rows() const { return rows; }
|
||||||
|
inline double get_col_step() const { return col_step; }
|
||||||
|
inline double get_row_step() const { return row_step; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test whether an area contains any non-zero elevations.
|
||||||
|
*/
|
||||||
|
bool has_non_zero_elev (int start_x, int span_x,
|
||||||
|
int start_y, int span_y) const;
|
||||||
|
|
||||||
|
virtual short height( int x, int ) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _SRTMBASE_HXX
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#---------------------------------------------------------------------------
|
#---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
bin_PROGRAMS = demchop hgtchop fillvoids testassem
|
bin_PROGRAMS = demchop hgtchop srtmchop fillvoids testassem
|
||||||
|
|
||||||
demchop_SOURCES = \
|
demchop_SOURCES = \
|
||||||
demchop.cxx point2d.hxx
|
demchop.cxx point2d.hxx
|
||||||
|
@ -41,6 +41,14 @@ hgtchop_LDADD = \
|
||||||
-lsgbucket -lsgmisc -lsgdebug -lsgxml -lz
|
-lsgbucket -lsgmisc -lsgdebug -lsgxml -lz
|
||||||
$(base_LIBS)
|
$(base_LIBS)
|
||||||
|
|
||||||
|
srtmchop_SOURCES = \
|
||||||
|
srtmchop.cxx point2d.hxx
|
||||||
|
|
||||||
|
srtmchop_LDADD = \
|
||||||
|
$(top_builddir)/src/Lib/HGT/libHGT.a \
|
||||||
|
-lsgbucket -lsgmisc -lsgdebug -lsgxml -lz
|
||||||
|
$(base_LIBS)
|
||||||
|
|
||||||
fillvoids_SOURCES = \
|
fillvoids_SOURCES = \
|
||||||
fillvoids.cxx
|
fillvoids.cxx
|
||||||
|
|
||||||
|
|
420
src/Prep/DemChop/srtmchop.cxx
Normal file
420
src/Prep/DemChop/srtmchop.cxx
Normal file
|
@ -0,0 +1,420 @@
|
||||||
|
// srtmchop.cxx -- chop up a srtm tiff file into it's corresponding pieces and stuff
|
||||||
|
// them into the workspace directory
|
||||||
|
//
|
||||||
|
// Written by Frederic Bouvier, started February 2009.
|
||||||
|
//
|
||||||
|
// Copyright (C) 1997 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 <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/compiler.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# include <direct.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <simgear/bucket/newbucket.hxx>
|
||||||
|
#include <simgear/debug/logstream.hxx>
|
||||||
|
#include <simgear/misc/sg_path.hxx>
|
||||||
|
|
||||||
|
#include <tiffio.h>
|
||||||
|
|
||||||
|
#include <Polygon/point2d.hxx>
|
||||||
|
|
||||||
|
#include <plib/ul.h>
|
||||||
|
|
||||||
|
#include <zlib.h>
|
||||||
|
|
||||||
|
#include <Lib/HGT/srtmbase.hxx>
|
||||||
|
|
||||||
|
using std::cout;
|
||||||
|
using std::endl;
|
||||||
|
using std::setfill;
|
||||||
|
using std::setw;
|
||||||
|
using std::string;
|
||||||
|
using std::ifstream;
|
||||||
|
using std::ostringstream;
|
||||||
|
using std::ios;
|
||||||
|
|
||||||
|
#define MAX_HGT_SIZE 6001
|
||||||
|
class TGSrtmTiff : public TGSrtmBase {
|
||||||
|
public:
|
||||||
|
TGSrtmTiff( const SGPath &file );
|
||||||
|
~TGSrtmTiff();
|
||||||
|
bool open( const SGPath &f );
|
||||||
|
bool close();
|
||||||
|
|
||||||
|
// load an hgt file
|
||||||
|
bool load();
|
||||||
|
bool is_opened() const { return opened; }
|
||||||
|
|
||||||
|
virtual short height( int x, int y ) const { return data[x][y]; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum LoadKind { BottomLeft, BottomRight, TopLeft, TopRight };
|
||||||
|
TGSrtmTiff( const SGPath &file, LoadKind lk );
|
||||||
|
bool pos_from_name( string name, string &pfx, int &x, int &y );
|
||||||
|
|
||||||
|
TIFF* tif;
|
||||||
|
LoadKind lkind;
|
||||||
|
string prefix, ext;
|
||||||
|
SGPath dir;
|
||||||
|
bool opened;
|
||||||
|
|
||||||
|
// pointers to the actual grid data allocated here
|
||||||
|
short int (*data)[MAX_HGT_SIZE];
|
||||||
|
short int (*output_data)[MAX_HGT_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
TGSrtmTiff::TGSrtmTiff( const SGPath &file ) {
|
||||||
|
lkind = BottomLeft;
|
||||||
|
tif = 0;
|
||||||
|
remove_tmp_file = false;
|
||||||
|
data = new short int[MAX_HGT_SIZE][MAX_HGT_SIZE];
|
||||||
|
output_data = new short int[MAX_HGT_SIZE][MAX_HGT_SIZE];
|
||||||
|
opened = TGSrtmTiff::open( file );
|
||||||
|
}
|
||||||
|
|
||||||
|
TGSrtmTiff::TGSrtmTiff( const SGPath &file, LoadKind lk ) {
|
||||||
|
lkind = lk;
|
||||||
|
tif = 0;
|
||||||
|
remove_tmp_file = false;
|
||||||
|
output_data = 0;
|
||||||
|
if ( lkind == BottomLeft ) {
|
||||||
|
data = new short int[MAX_HGT_SIZE][MAX_HGT_SIZE];
|
||||||
|
output_data = new short int[MAX_HGT_SIZE][MAX_HGT_SIZE];
|
||||||
|
} else if ( lkind == TopLeft ) {
|
||||||
|
data = new short int[MAX_HGT_SIZE][MAX_HGT_SIZE];
|
||||||
|
} else if ( lkind == BottomRight ) {
|
||||||
|
data = new short int[1][MAX_HGT_SIZE];
|
||||||
|
} else /* if ( lkind == TopRight ) */ {
|
||||||
|
data = new short int[1][MAX_HGT_SIZE];
|
||||||
|
}
|
||||||
|
TGSrtmTiff::open( file );
|
||||||
|
}
|
||||||
|
|
||||||
|
TGSrtmTiff::~TGSrtmTiff() {
|
||||||
|
delete[] data;
|
||||||
|
delete[] output_data;
|
||||||
|
if ( remove_tmp_file ) {
|
||||||
|
ulDir *dir = ulOpenDir( remove_file_name.dir().c_str() );
|
||||||
|
if ( dir ) {
|
||||||
|
ulDirEnt *de;
|
||||||
|
while ( ( de = ulReadDir( dir ) ) != 0 ) {
|
||||||
|
if ( !strcmp(de->d_name,".") || !strcmp(de->d_name,"..") || de->d_isdir ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SGPath file( remove_file_name.dir() );
|
||||||
|
file.append( de->d_name );
|
||||||
|
unlink( file.c_str() );
|
||||||
|
}
|
||||||
|
ulCloseDir( dir );
|
||||||
|
}
|
||||||
|
rmdir( remove_file_name.dir().c_str() );
|
||||||
|
}
|
||||||
|
if ( tif )
|
||||||
|
TIFFClose( tif );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TGSrtmTiff::pos_from_name( string name, string &pfx, int &x, int &y ) {
|
||||||
|
size_t p = name.find( '_' );
|
||||||
|
if ( p == string::npos )
|
||||||
|
return false;
|
||||||
|
pfx = name.substr( 0, p );
|
||||||
|
name.erase( 0, p + 1 );
|
||||||
|
p = name.find( '.' );
|
||||||
|
if ( p == string::npos )
|
||||||
|
return false;
|
||||||
|
name.erase( p );
|
||||||
|
p = name.find( '_' );
|
||||||
|
if ( p == string::npos )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
x = atoi( name.substr( 0, p ).c_str() );
|
||||||
|
y = atoi( name.substr( p+1 ).c_str() );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TGSrtmTiff::open( const SGPath &f ) {
|
||||||
|
SGPath file_name = f;
|
||||||
|
ext = file_name.extension();
|
||||||
|
dir = file_name.dir();
|
||||||
|
int x, y;
|
||||||
|
pos_from_name( file_name.file(), prefix, x, y );
|
||||||
|
if ( ext == "zip" ) {
|
||||||
|
// extract the .zip file to /tmp and point the file name
|
||||||
|
// to the extracted file
|
||||||
|
SGPath tmp_dir = tempnam( 0, "hgt" );
|
||||||
|
tmp_dir.append( "dummy" );
|
||||||
|
tmp_dir.create_dir( 0700 );
|
||||||
|
cout << "Extracting " << file_name.str() << " to " << tmp_dir.dir() << endl;
|
||||||
|
string command = "unzip -d \"" + tmp_dir.dir() + "\" " + file_name.str();
|
||||||
|
system( command.c_str() );
|
||||||
|
|
||||||
|
file_name = tmp_dir.dir();
|
||||||
|
ulDir *dir = ulOpenDir( tmp_dir.dir().c_str() );
|
||||||
|
if ( dir ) {
|
||||||
|
ulDirEnt *de;
|
||||||
|
while ( ( de = ulReadDir( dir ) ) != 0 ) {
|
||||||
|
if ( !strcmp(de->d_name,".") || !strcmp(de->d_name,"..") || de->d_isdir ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
SGPath file( de->d_name );
|
||||||
|
string ext = file.extension();
|
||||||
|
if ( ext == "TIF" || ext == "tif" ) {
|
||||||
|
file_name.append( de->d_name );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ulCloseDir( dir );
|
||||||
|
}
|
||||||
|
|
||||||
|
remove_tmp_file = true;
|
||||||
|
remove_file_name = file_name.str();
|
||||||
|
|
||||||
|
cout << "Proceeding with " << file_name.str() << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
tif = TIFFOpen( file_name.c_str(), "r" );
|
||||||
|
if ( !tif ) {
|
||||||
|
cout << "ERROR: opening " << file_name.str() << " for reading!" << endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine originx/originy from file name
|
||||||
|
originx = ( double( x ) - 37.0 ) * 18000.0;
|
||||||
|
originy = ( 12.0 - double( y ) ) * 18000.0;
|
||||||
|
cout << " Origin = " << originx << ", " << originy << endl;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TGSrtmTiff::load() {
|
||||||
|
int size;
|
||||||
|
cols = rows = size = 6000;
|
||||||
|
col_step = row_step = 3;
|
||||||
|
|
||||||
|
uint32 w, h, d;
|
||||||
|
uint16 dataType;
|
||||||
|
uint16 samplesperpixel;
|
||||||
|
uint16 bitspersample;
|
||||||
|
|
||||||
|
TIFFGetField( tif, TIFFTAG_IMAGEWIDTH, &w );
|
||||||
|
TIFFGetField( tif, TIFFTAG_IMAGELENGTH, &h );
|
||||||
|
TIFFGetField( tif, TIFFTAG_IMAGEDEPTH, &d );
|
||||||
|
TIFFGetField( tif, TIFFTAG_SAMPLESPERPIXEL, &samplesperpixel );
|
||||||
|
TIFFGetField( tif, TIFFTAG_BITSPERSAMPLE, &bitspersample );
|
||||||
|
TIFFGetField( tif, TIFFTAG_DATATYPE, &dataType );
|
||||||
|
|
||||||
|
tdata_t buf = _TIFFmalloc( TIFFScanlineSize( tif ) );
|
||||||
|
if ( lkind == BottomLeft ) {
|
||||||
|
uint32 row = 0;
|
||||||
|
for ( ; row < h; row++ ) {
|
||||||
|
TIFFReadScanline( tif, buf, row );
|
||||||
|
uint32 col = 0;
|
||||||
|
for ( ; col < w; col++ ) {
|
||||||
|
int16 v = ((int16*)buf)[col];
|
||||||
|
if ( v == -32768 )
|
||||||
|
v = 0;
|
||||||
|
data[col][6000-1-row] = v;
|
||||||
|
}
|
||||||
|
for ( ; col < 6000; col++ ) {
|
||||||
|
data[col][6000-1-row] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ( ; row < 6000; row++ ) {
|
||||||
|
uint32 col = 0;
|
||||||
|
for ( ; col < 6000; col++ ) {
|
||||||
|
data[col][6000-1-row] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int x1 = int( originx / 18000.0 ) + 37,
|
||||||
|
y1 = int( 12 - ( originy / 18000.0 ) ),
|
||||||
|
x2 = x1 + 1,
|
||||||
|
y2 = y1 - 1;
|
||||||
|
if ( x2 > 72 )
|
||||||
|
x2 -= 72;
|
||||||
|
{
|
||||||
|
ostringstream name;
|
||||||
|
name << prefix << "_" << std::setfill( '0' ) << std::setw( 2 ) << x2 << "_" << std::setfill( '0' ) << std::setw( 2 ) << y1 << "." << ext;
|
||||||
|
SGPath f = dir;
|
||||||
|
f.append( name.str() );
|
||||||
|
if ( f.exists() ) {
|
||||||
|
TGSrtmTiff s( f.str(), BottomRight );
|
||||||
|
s.load();
|
||||||
|
s.close();
|
||||||
|
for ( int i = 0; i < 6000; ++i ) {
|
||||||
|
data[6000][i] = s.data[0][i];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( int i = 0; i < 6000; ++i ) {
|
||||||
|
data[6000][i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( y2 != 0 ) {
|
||||||
|
ostringstream name;
|
||||||
|
name << prefix << "_" << std::setfill( '0' ) << std::setw( 2 ) << x1 << "_" << std::setfill( '0' ) << std::setw( 2 ) << y2 << "." << ext;
|
||||||
|
SGPath f = dir;
|
||||||
|
f.append( name.str() );
|
||||||
|
if ( f.exists() ) {
|
||||||
|
TGSrtmTiff s( f.str(), TopLeft );
|
||||||
|
s.load();
|
||||||
|
s.close();
|
||||||
|
for ( int i = 0; i < 6000; ++i ) {
|
||||||
|
data[i][6000] = s.data[i][0];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( int i = 0; i < 6000; ++i ) {
|
||||||
|
data[i][6000] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for ( int i = 0; i < 6000; ++i ) {
|
||||||
|
data[i][6000] = data[i][6000-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( y2 != 0 ) {
|
||||||
|
ostringstream name;
|
||||||
|
name << prefix << "_" << std::setfill( '0' ) << std::setw( 2 ) << x2 << "_" << std::setfill( '0' ) << std::setw( 2 ) << y2 << "." << ext;
|
||||||
|
SGPath f = dir;
|
||||||
|
f.append( name.str() );
|
||||||
|
if ( f.exists() ) {
|
||||||
|
TGSrtmTiff s( f.str(), TopRight );
|
||||||
|
s.load();
|
||||||
|
s.close();
|
||||||
|
data[6000][6000] = s.data[0][0];
|
||||||
|
} else {
|
||||||
|
data[6000][6000] = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
data[6000][6000] = data[6000][6000-1];
|
||||||
|
}
|
||||||
|
} else if ( lkind == TopLeft ) {
|
||||||
|
TIFFReadScanline( tif, buf, 0 );
|
||||||
|
uint32 col = 0;
|
||||||
|
for ( ; col < w; col++ ) {
|
||||||
|
int16 v = ((int16*)buf)[col];
|
||||||
|
if ( v == -32768 )
|
||||||
|
v = 0;
|
||||||
|
data[col][0] = v;
|
||||||
|
}
|
||||||
|
for ( ; col < 6000; col++ ) {
|
||||||
|
data[col][0] = 0;
|
||||||
|
}
|
||||||
|
} else if ( lkind == BottomRight ) {
|
||||||
|
uint32 row = 0;
|
||||||
|
for ( ; row < h; row++ ) {
|
||||||
|
TIFFReadScanline( tif, buf, row );
|
||||||
|
int16 v = ((int16*)buf)[0];
|
||||||
|
if ( v == -32768 )
|
||||||
|
v = 0;
|
||||||
|
data[0][6000-1-row] = v;
|
||||||
|
}
|
||||||
|
for ( ; row < 6000; row++ ) {
|
||||||
|
data[0][6000-1-row] = 0;
|
||||||
|
}
|
||||||
|
} else /* if ( lkind == TopRight ) */ {
|
||||||
|
if ( h == 6000 ) {
|
||||||
|
TIFFReadScanline( tif, buf, h-1 );
|
||||||
|
int16 v = ((int16*)buf)[0];
|
||||||
|
if ( v == -32768 )
|
||||||
|
v = 0;
|
||||||
|
data[0][0] = v;
|
||||||
|
} else {
|
||||||
|
data[0][0] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_TIFFfree(buf);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TGSrtmTiff::close() {
|
||||||
|
if ( tif )
|
||||||
|
TIFFClose( tif );
|
||||||
|
tif = 0;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
sglog().setLogLevels( SG_ALL, SG_WARN );
|
||||||
|
|
||||||
|
if ( argc != 3 ) {
|
||||||
|
cout << "Usage " << argv[0] << " <hgt_file> <work_dir>"
|
||||||
|
<< endl;
|
||||||
|
cout << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
string hgt_name = argv[1];
|
||||||
|
string work_dir = argv[2];
|
||||||
|
|
||||||
|
SGPath sgp( work_dir );
|
||||||
|
sgp.append( "dummy" );
|
||||||
|
sgp.create_dir( 0755 );
|
||||||
|
|
||||||
|
TGSrtmTiff hgt( hgt_name );
|
||||||
|
hgt.load();
|
||||||
|
hgt.close();
|
||||||
|
|
||||||
|
point2d min, max;
|
||||||
|
min.x = hgt.get_originx() / 3600.0 + SG_HALF_BUCKET_SPAN;
|
||||||
|
min.y = hgt.get_originy() / 3600.0 + SG_HALF_BUCKET_SPAN;
|
||||||
|
SGBucket b_min( min.x, min.y );
|
||||||
|
|
||||||
|
max.x = (hgt.get_originx() + hgt.get_cols() * hgt.get_col_step()) / 3600.0
|
||||||
|
- SG_HALF_BUCKET_SPAN;
|
||||||
|
max.y = (hgt.get_originy() + hgt.get_rows() * hgt.get_row_step()) / 3600.0
|
||||||
|
- SG_HALF_BUCKET_SPAN;
|
||||||
|
SGBucket b_max( max.x, max.y );
|
||||||
|
|
||||||
|
if ( b_min == b_max ) {
|
||||||
|
hgt.write_area( work_dir, b_min );
|
||||||
|
} else {
|
||||||
|
SGBucket b_cur;
|
||||||
|
int dx, dy, i, j;
|
||||||
|
|
||||||
|
sgBucketDiff(b_min, b_max, &dx, &dy);
|
||||||
|
cout << "HGT file spans tile boundaries (ok)" << endl;
|
||||||
|
cout << " dx = " << dx << " dy = " << dy << endl;
|
||||||
|
|
||||||
|
if ( (dx > 50) || (dy > 50) ) {
|
||||||
|
cout << "somethings really wrong!!!!" << endl;
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( j = 0; j <= dy; j++ ) {
|
||||||
|
for ( i = 0; i <= dx; i++ ) {
|
||||||
|
b_cur = sgBucketOffset(min.x, min.y, i, j);
|
||||||
|
hgt.write_area( work_dir, b_cur );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue