[gdal-dev] Need code review obtaining elev data in CPP Class (GDAL beginner)
Hans Kurscheidt
lve0200 at gmail.com
Sun Oct 24 08:59:52 PDT 2021
I came to realize that I apparently sent HTML. I try now send text only.
hk
Am 24.10.2021 um 17:42 schrieb Hans Kurscheidt:
>
> Dears, excuse in my very 1st post here, a bloody beginner's question
> and probably behavior. I need every now and then an elevation value
> from WGS84 coordinates _in my application_. What does
>
> gdallocationinfo -valonly -wgs84 /home/hk/eu_dem_v11_E30N20.TIF -1.0
> 44.0 at console level.
>
> I did read the source code and large parts of the GDAL documentation
> and the best Class initialization I was able to come up with is this:
> (I made few vars static to avoid compiler optimization)
>
> class GDALRasterImage {
> public:
> GDALRasterImage(const char* filename);
> ~GDALRasterImage();
> int valueAt(double lat, double lon);
>
> private:
> GDALDatasetH dataset;
> GDALRasterBandH band;
> char *pszSourceSRS = nullptr;
> double inverseTransform[6];
> double datasetTransform[6];
> };
> GDALRasterImage::GDALRasterImage(const char* filename) {
>
> double llon = -1, llat = 44; static bool rv;
> GDALAllRegister();
>
> // SanitizeSRS to WGS84
> CPLErrorReset();
> OGRSpatialReferenceH hSRS = OSRNewSpatialReference(nullptr);
> CPLFree(pszSourceSRS);
> if (OSRSetFromUserInput(hSRS, "WGS84") == OGRERR_NONE)
> OSRExportToWkt(hSRS, &pszSourceSRS);
> OSRDestroySpatialReference(hSRS);
>
> this->dataset = GDALOpenEx(filename, GDAL_OF_RASTER, nullptr,
> nullptr, nullptr);
> assert(dataset != nullptr);
>
> // Assume there is only one band in the raster source and use that
> assert(GDALGetRasterCount(dataset) == 1);
> this->band = GDALGetRasterBand(dataset, 1);
>
> // Setup coordinate transformation
> static OGRSpatialReferenceH hSrcSRS = nullptr, hTrgSRS = nullptr;
> static OGRCoordinateTransformationH hCT = nullptr;
> hSrcSRS = OSRNewSpatialReference(pszSourceSRS);
> hTrgSRS = OSRNewSpatialReference(GDALGetProjectionRef(dataset));
>
> hCT = OCTNewCoordinateTransformation(hSrcSRS, hTrgSRS);
> if (hCT == nullptr) exit(1);
> rv= OCTTransform(hCT, 1, &llon, &llat, nullptr);
>
> // Get the inverse geo transform to map from geo location -> pixel
> location
> if (GDALGetGeoTransform(dataset, datasetTransform) != CE_None)
> exit (1);
> if (!GDALInvGeoTransform(datasetTransform, inverseTransform)) exit(1);
> }
> The init runs w/out obvious code failures, but when I call
>
> int GDALRasterImage::valueAt(double lat, double lon) {
> int x = static_cast<int>(floor(inverseTransform[0] +
> inverseTransform[1] * lon + inverseTransform[2] * lat));
> int y = static_cast<int>(floor(inverseTransform[3] +
> inverseTransform[4] * lon + inverseTransform[5] * lat));
>
> int32_t pixelValue;
> GDALRasterIO(band, GF_Read, x, y, 1, 1, &pixelValue, 1, 1,
> GDT_Int32, 0, 0);
> return pixelValue;
> }
>
> with Lon=-1.0 and Lat=44.0 I receive a run time error:
>
> ERROR 5: /home/hk/eu_dem_v11_E30N20.TIF, band 1: Access window out of
> range in RasterIO(). Requested
> (-120001,119998) of size 1x1 on raster of 40000x40000.
>
> I guess it has to do with the inverse transformation, but for the life
> of me, I have not the slightest idea, where to search from here.
>
> gdalinfo /home/hk/eu_dem_v11_E30N20.TIF
> Driver: GTiff/GeoTIFF
> Files: /home/hk/eu_dem_v11_E30N20.TIF
> Size is 40000, 40000
> Coordinate System is:
> PROJCS["ETRS89_ETRS_LAEA",
> GEOGCS["ETRS89",
> DATUM["European_Terrestrial_Reference_System_1989",
> SPHEROID["GRS 1980",6378137,298.2572221010042,
> AUTHORITY["EPSG","7019"]],
> AUTHORITY["EPSG","6258"]],
> PRIMEM["Greenwich",0],
> UNIT["degree",0.0174532925199433],
> AUTHORITY["EPSG","4258"]],
> PROJECTION["Lambert_Azimuthal_Equal_Area"],
> PARAMETER["latitude_of_center",52],
> PARAMETER["longitude_of_center",10],
> PARAMETER["false_easting",4321000],
> PARAMETER["false_northing",3210000],
> UNIT["metre",1,
> AUTHORITY["EPSG","9001"]]]
> Origin = (3000000.000000000000000,3000000.000000000000000)
> Pixel Size = (25.000000000000000,-25.000000000000000)
> Metadata:
> AREA_OR_POINT=Area
> DataType=Elevation
> Image Structure Metadata:
> COMPRESSION=LZW
> INTERLEAVE=BAND
> Corner Coordinates:
> Upper Left ( 3000000.000, 3000000.000) ( 8d 7'39.52"W, 48d38'23.47"N)
> Lower Left ( 3000000.000, 2000000.000) ( 5d28'46.07"W, 39d52'33.70"N)
> Upper Right ( 4000000.000, 3000000.000) ( 5d31' 4.07"E, 50d 1'26.83"N)
> Lower Right ( 4000000.000, 2000000.000) ( 6d11'52.97"E, 41d 1'36.49"N)
> Center ( 3500000.000, 2500000.000) ( 0d27' 3.13"W, 45d 5'35.85"N)
> Band 1 Block=128x128 Type=Float32, ColorInterp=Gray
> NoData Value=-3.4028234663852886e+38
> Metadata:
> BandName=Band_1
> RepresentationType=ATHEMATIC
>
> The transformation data I have are:
>
> datasetTransform[6] contains: 3000000, 25, 0, 3000000, -25
>
> inverseTransform[6] contains: -120000, 0.04, 0, 12000, -0.04, 0
>
>
> Thanks for your help!
>
> hans
>
More information about the gdal-dev
mailing list