From 7962874f57b8df324926c259554a931f1537c8bf Mon Sep 17 00:00:00 2001 From: James Hogan Date: Thu, 5 Mar 2009 00:34:44 +0000 Subject: [PATCH] Added void insertion to arctohgt --- arctohgt/arcToHgt.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/arctohgt/arcToHgt.cpp b/arctohgt/arcToHgt.cpp index 6ce5052..1321b68 100644 --- a/arctohgt/arcToHgt.cpp +++ b/arctohgt/arcToHgt.cpp @@ -53,13 +53,16 @@ int readInt(QFile& file) } } -int arcToHgt(const QString filename) +int arcToHgt(const QString filename, char* voids) { qDebug() << "Reading" << filename; // first open arcinfo file QFile af(filename); - af.open(QIODevice::ReadOnly); + if (!af.open(QIODevice::ReadOnly)) + { + return 1; + } // and read the header info int ncols = readInt(af); @@ -77,6 +80,11 @@ int arcToHgt(const QString filename) int tilesX = 1+lonMax-lonMin; int tilesY = 1+latMax-latMin; QFile* srtm = new QFile[tilesX*tilesY]; + QFile* voidfs = 0; + if (0 != voids) + { + voidfs = new QFile[tilesX*tilesY]; + } for (int lon = lonMin; lon <= lonMax; ++lon) { for (int lat = latMin; lat <= latMax; ++lat) @@ -89,6 +97,11 @@ int arcToHgt(const QString filename) int index = tilesX*(lat-latMin) + lon-lonMin; srtm[index].setFileName(filename); srtm[index].open(QIODevice::ReadWrite); + if (0 != voids) + { + voidfs[index].setFileName(QString("%1/%2").arg(voids).arg(filename)); + voidfs[index].open(QIODevice::ReadOnly); + } // if it doesn't exist, initialize with void if (srtm[index].atEnd()) { @@ -114,7 +127,7 @@ int arcToHgt(const QString filename) // go through the rows for (int row = nrows-1; row >= 0; --row) { - int y = (int)floor(0.5 + yllcorner/cellsize - latMin/cellsize + nrows-1-row); + int y = (int)floor(0.5 + yllcorner/cellsize - latMin/cellsize + row); int latDiv = y/1200; int latMod = y%1200; for (int col = 0; col < ncols; ++col) @@ -135,6 +148,19 @@ int arcToHgt(const QString filename) if (inX && inY) { int index = latDiv*tilesX + lonDiv; + // if void flag is set, adjust sample + if (0 != voidfs && voidfs[index].isOpen()) + { + QDataStream stream(&voidfs[index]); + stream.setByteOrder(QDataStream::BigEndian); + voidfs[index].seek(FILEPOS(lonMod, latMod)); + uint16_t mask; + stream >> mask; + if (mask & 0x8000) + { + sample |= 0x8000; + } + } QDataStream stream(&srtm[index]); stream.setByteOrder(QDataStream::BigEndian); srtm[index].seek(FILEPOS(lonMod, latMod)); @@ -170,6 +196,12 @@ int arcToHgt(const QString filename) } delete [] srtm; + if (0 != voidfs) + { + delete [] voidfs; + } + + return 0; } int main(int argc, char** argv) @@ -177,9 +209,22 @@ int main(int argc, char** argv) qDebug() << "Welcome to arcToHgt"; int error = 0; // Convert the file in each argument to HGT, overwriting any existing data + char * voids = 0; for (int i = 1; i < argc; ++i) { - error |= arcToHgt(argv[i]); + if (0 == strcmp(argv[i], "--voids")) + { + // next argument is voids directory + if (++i < argc) + { + voids = argv[i]; + qDebug() << "Using voids from " << voids; + } + } + else + { + error |= arcToHgt(argv[i], voids); + } } return error; } -- 2.11.4.GIT