fix segmentation fault in gdalchop
- it still isn't working - it produces output files, but after fir / construct - terrain isn't right
This commit is contained in:
parent
0fa30fdcab
commit
41e65fe6fa
1 changed files with 53 additions and 45 deletions
|
@ -104,44 +104,43 @@ int SimpleRasterTransformer(void *pTransformerArg,
|
||||||
|
|
||||||
class ImageInfo {
|
class ImageInfo {
|
||||||
public:
|
public:
|
||||||
ImageInfo(GDALDataset *dataset);
|
ImageInfo(GDALDataset *dataset);
|
||||||
|
|
||||||
void GetBounds(double &n, double &s, double &e, double &w) const
|
void GetBounds(double &n, double &s, double &e, double &w) const {
|
||||||
{
|
n = north;
|
||||||
n = north;
|
s = south;
|
||||||
s = south;
|
e = east;
|
||||||
e = east;
|
w = west;
|
||||||
w = west;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const char* GetDescription() const
|
const char* GetDescription() const {
|
||||||
{
|
return dataset->GetDescription();
|
||||||
return dataset->GetDescription();
|
}
|
||||||
}
|
|
||||||
|
void GetDataChunk(int *buffer,
|
||||||
|
double x, double y,
|
||||||
|
double colstep, double rowstep,
|
||||||
|
int w, int h,
|
||||||
|
int srcband = 1, int nodata = -32768);
|
||||||
|
|
||||||
void GetDataChunk(int *buffer,
|
|
||||||
double x, double y,
|
|
||||||
double colstep, double rowstep,
|
|
||||||
int w, int h,
|
|
||||||
int srcband = 1, int nodata = -32768);
|
|
||||||
protected:
|
protected:
|
||||||
/* The dataset */
|
/* The dataset */
|
||||||
GDALDataset *dataset;
|
GDALDataset *dataset;
|
||||||
|
|
||||||
/* Source spatial reference system */
|
/* Source spatial reference system */
|
||||||
OGRSpatialReference srs;
|
OGRSpatialReference srs;
|
||||||
|
|
||||||
/* Coordinate transformation pixel -> geographic */
|
/* Coordinate transformation pixel -> geographic */
|
||||||
double geoXfrm[6];
|
double geoXfrm[6];
|
||||||
|
|
||||||
/* Coordinate transformation to WGS84 */
|
/* Coordinate transformation to WGS84 */
|
||||||
OGRCoordinateTransformation *wgs84xform;
|
OGRCoordinateTransformation *wgs84xform;
|
||||||
|
|
||||||
/* geographical edge coordinates in CCW order, WGS84 */
|
/* geographical edge coordinates in CCW order, WGS84 */
|
||||||
double geoX[4], geoY[4];
|
double geoX[4], geoY[4];
|
||||||
|
|
||||||
/* bounding box in WGS84 */
|
/* bounding box in WGS84 */
|
||||||
double north, south, east, west;
|
double north, south, east, west;
|
||||||
};
|
};
|
||||||
|
|
||||||
ImageInfo::ImageInfo(GDALDataset *dataset) :
|
ImageInfo::ImageInfo(GDALDataset *dataset) :
|
||||||
|
@ -150,8 +149,12 @@ ImageInfo::ImageInfo(GDALDataset *dataset) :
|
||||||
{
|
{
|
||||||
OGRSpatialReference wgs84SRS;
|
OGRSpatialReference wgs84SRS;
|
||||||
|
|
||||||
|
// NOTE : This is equivelent to WGS84 - just using th formal EPSG db.
|
||||||
|
// GDAL knows this well known projection already
|
||||||
|
// wgs84SRS.SetWellKnownGeogCS( "WGS84" );
|
||||||
wgs84SRS.SetWellKnownGeogCS( "EPSG:4326" );
|
wgs84SRS.SetWellKnownGeogCS( "EPSG:4326" );
|
||||||
|
|
||||||
|
wgs84SRS.SetWellKnownGeogCS( "EPSG:4326" );
|
||||||
|
|
||||||
/* Determine the bounds of the input file in WGS84 */
|
/* Determine the bounds of the input file in WGS84 */
|
||||||
int w = dataset->GetRasterXSize();
|
int w = dataset->GetRasterXSize();
|
||||||
|
@ -216,7 +219,6 @@ void ImageInfo::GetDataChunk(int *buffer,
|
||||||
wgs84SRS.SetWellKnownGeogCS( "EPSG:4326" );
|
wgs84SRS.SetWellKnownGeogCS( "EPSG:4326" );
|
||||||
|
|
||||||
char* wgs84WKT;
|
char* wgs84WKT;
|
||||||
|
|
||||||
wgs84SRS.exportToWkt(&wgs84WKT);
|
wgs84SRS.exportToWkt(&wgs84WKT);
|
||||||
|
|
||||||
/* Setup a raster transformation from WGS84 to raster coordinates of the array files */
|
/* Setup a raster transformation from WGS84 to raster coordinates of the array files */
|
||||||
|
@ -227,6 +229,7 @@ void ImageInfo::GetDataChunk(int *buffer,
|
||||||
FALSE,
|
FALSE,
|
||||||
0.0,
|
0.0,
|
||||||
1);
|
1);
|
||||||
|
|
||||||
xformData.pfnTransformer = GDALGenImgProjTransform;
|
xformData.pfnTransformer = GDALGenImgProjTransform;
|
||||||
xformData.x0 = x;
|
xformData.x0 = x;
|
||||||
xformData.y0 = y;
|
xformData.y0 = y;
|
||||||
|
@ -240,12 +243,13 @@ void ImageInfo::GetDataChunk(int *buffer,
|
||||||
|
|
||||||
int srcBandNumbers[] = { srcband };
|
int srcBandNumbers[] = { srcband };
|
||||||
int dstBandNumbers[] = { 1 };
|
int dstBandNumbers[] = { 1 };
|
||||||
double dstNodata[] = { nodata };
|
|
||||||
double srcNodataReal[1];
|
|
||||||
double srcNodataImag[] = { 0.0 };
|
|
||||||
int srcHasNodataValue;
|
|
||||||
|
|
||||||
srcNodataReal[0] = dataset->GetRasterBand(srcband)->GetNoDataValue(&srcHasNodataValue);
|
double dstNodata = (double)nodata;
|
||||||
|
double srcNodataReal;
|
||||||
|
double srcNodataImag = 0.0;
|
||||||
|
int srcHasNodataValue;
|
||||||
|
|
||||||
|
srcNodataReal = dataset->GetRasterBand(srcband)->GetNoDataValue(&srcHasNodataValue);
|
||||||
|
|
||||||
psWarpOptions->hSrcDS = dataset;
|
psWarpOptions->hSrcDS = dataset;
|
||||||
psWarpOptions->hDstDS = NULL;
|
psWarpOptions->hDstDS = NULL;
|
||||||
|
@ -254,9 +258,10 @@ void ImageInfo::GetDataChunk(int *buffer,
|
||||||
psWarpOptions->panDstBands = dstBandNumbers;
|
psWarpOptions->panDstBands = dstBandNumbers;
|
||||||
psWarpOptions->nSrcAlphaBand = 0;
|
psWarpOptions->nSrcAlphaBand = 0;
|
||||||
psWarpOptions->nDstAlphaBand = 0;
|
psWarpOptions->nDstAlphaBand = 0;
|
||||||
psWarpOptions->padfSrcNoDataReal = (srcHasNodataValue ? srcNodataReal : NULL);
|
psWarpOptions->padfSrcNoDataReal = (srcHasNodataValue ? &srcNodataReal : NULL);
|
||||||
psWarpOptions->padfSrcNoDataImag = (srcHasNodataValue ? srcNodataImag : NULL);
|
psWarpOptions->padfSrcNoDataImag = (srcHasNodataValue ? &srcNodataImag : NULL);
|
||||||
psWarpOptions->padfDstNoDataReal = dstNodata;
|
psWarpOptions->padfDstNoDataReal = &dstNodata;
|
||||||
|
psWarpOptions->padfDstNoDataReal = NULL;
|
||||||
psWarpOptions->eResampleAlg = GRA_Bilinear;
|
psWarpOptions->eResampleAlg = GRA_Bilinear;
|
||||||
psWarpOptions->eWorkingDataType = GDT_Int32;
|
psWarpOptions->eWorkingDataType = GDT_Int32;
|
||||||
|
|
||||||
|
@ -264,7 +269,6 @@ void ImageInfo::GetDataChunk(int *buffer,
|
||||||
psWarpOptions->pTransformerArg = &xformData;
|
psWarpOptions->pTransformerArg = &xformData;
|
||||||
|
|
||||||
GDALWarpOperation oOperation;
|
GDALWarpOperation oOperation;
|
||||||
|
|
||||||
oOperation.Initialize( psWarpOptions );
|
oOperation.Initialize( psWarpOptions );
|
||||||
|
|
||||||
/* do the warp */
|
/* do the warp */
|
||||||
|
@ -291,12 +295,14 @@ void write_bucket(const std::string& work_dir, SGBucket bucket,
|
||||||
int span_x, int span_y,
|
int span_x, int span_y,
|
||||||
int col_step, int row_step)
|
int col_step, int row_step)
|
||||||
{
|
{
|
||||||
SGPath path(work_dir);
|
// generate output file name
|
||||||
|
std::string base = bucket.gen_base_path();
|
||||||
|
std::string path = work_dir + "/" + base;
|
||||||
|
SGPath sgp( path );
|
||||||
|
sgp.append( "dummy" );
|
||||||
|
sgp.create_dir( 0755 );
|
||||||
|
|
||||||
path.append(bucket.gen_base_path());
|
std::string array_file = path + "/" + bucket.gen_index_str() + ".arr.gz";
|
||||||
path.create_dir( 0755 );
|
|
||||||
|
|
||||||
std::string array_file = path.str() + "/" + bucket.gen_index_str() + ".arr.gz";
|
|
||||||
|
|
||||||
gzFile fp;
|
gzFile fp;
|
||||||
if ( (fp = gzopen(array_file.c_str(), "wb9")) == NULL ) {
|
if ( (fp = gzopen(array_file.c_str(), "wb9")) == NULL ) {
|
||||||
|
@ -370,8 +376,10 @@ void process_bucket(const std::string& work_dir, SGBucket bucket,
|
||||||
const double nodataPercLimit = 5.0;
|
const double nodataPercLimit = 5.0;
|
||||||
double nodataPerc = 100.0 * nodataCellCount / cellcount;
|
double nodataPerc = 100.0 * nodataCellCount / cellcount;
|
||||||
|
|
||||||
if (nodataCellCount > 0)
|
if (nodataCellCount > 0) {
|
||||||
SG_LOG(SG_GENERAL, SG_INFO, " " << nodataCellCount << " cells are not covered with data (" << nodataPerc << "% of cells)");
|
SG_LOG(SG_GENERAL, SG_INFO, " " << nodataCellCount << " cells are not covered with data (" << nodataPerc << "% of cells)");
|
||||||
|
}
|
||||||
|
|
||||||
if (nodataPerc > nodataPercLimit) {
|
if (nodataPerc > nodataPercLimit) {
|
||||||
SG_LOG(SG_GENERAL, SG_INFO, " there is not enough data available to cover this cell (limit for non-covered cells is " << nodataPercLimit << "%)");
|
SG_LOG(SG_GENERAL, SG_INFO, " there is not enough data available to cover this cell (limit for non-covered cells is " << nodataPercLimit << "%)");
|
||||||
/* don't write out if not forced to */
|
/* don't write out if not forced to */
|
||||||
|
|
Loading…
Reference in a new issue