mirror of
https://gitlab.com/Trygve/contour-creator.git
synced 2024-11-21 23:00:18 +00:00
Added georeferencing
This commit is contained in:
parent
e457adf244
commit
0485253893
@ -4,13 +4,13 @@
|
|||||||
#include "contour_creator.hh"
|
#include "contour_creator.hh"
|
||||||
|
|
||||||
|
|
||||||
CellMap::CellMap(int width, int height, uint8_t* cells, OGRSpatialReference reference_system)
|
CellMap::CellMap(int width, int height, uint8_t* cells, OGRSpatialReference reference_system, double* geotransform)
|
||||||
{
|
{
|
||||||
this->width = width;
|
this->width = width;
|
||||||
this->height = height;
|
this->height = height;
|
||||||
this->cells = cells;
|
this->cells = cells;
|
||||||
this->reference_system = reference_system;
|
this->reference_system = reference_system;
|
||||||
|
this->geotransform = geotransform;
|
||||||
}
|
}
|
||||||
int CellMap::get_cell(int x, int y)
|
int CellMap::get_cell(int x, int y)
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <gdal/cpl_conv.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
@ -28,8 +29,12 @@ HeightMap::HeightMap(const char* filepath)
|
|||||||
this->height = band->GetYSize();
|
this->height = band->GetYSize();
|
||||||
this->min = band->GetMinimum();
|
this->min = band->GetMinimum();
|
||||||
this->max = band-> GetMaximum();
|
this->max = band-> GetMaximum();
|
||||||
|
//https://gdal.org/api/gdaldataset_cpp.html#_CPPv4N11GDALDataset15GetGeoTransformEPd
|
||||||
|
this->geotransform = (double *) CPLMalloc(sizeof(double)*6);
|
||||||
this->reference_system = *(file->GetSpatialRef());
|
this->reference_system = *(file->GetSpatialRef());
|
||||||
|
|
||||||
|
file->GetGeoTransform(this->geotransform);
|
||||||
|
|
||||||
this->data = (float *) CPLMalloc(sizeof(float)*width*height);
|
this->data = (float *) CPLMalloc(sizeof(float)*width*height);
|
||||||
CPLErr error = band->RasterIO( GF_Read, 0, 0, width, height,
|
CPLErr error = band->RasterIO( GF_Read, 0, 0, width, height,
|
||||||
this->data, width, height, GDT_Float32,
|
this->data, width, height, GDT_Float32,
|
||||||
|
@ -9,6 +9,8 @@ class HeightMap
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
float* data;
|
float* data;
|
||||||
|
double* geotransform; //!< Six double buffer for storing the affine transformations
|
||||||
|
// https://gdal.org/api/gdaldataset_cpp.html#_CPPv4N11GDALDataset15GetGeoTransformEPd
|
||||||
int width; //!< width of image in pixels
|
int width; //!< width of image in pixels
|
||||||
int height; //!< height of image in pixels
|
int height; //!< height of image in pixels
|
||||||
float min; //!< Minimum value in image
|
float min; //!< Minimum value in image
|
||||||
@ -26,10 +28,10 @@ class CellMap
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
uint8_t* cells; //!< pointer to the first cell in the array. uint8_t is a 8 bit unsigned integer
|
uint8_t* cells; //!< pointer to the first cell in the array. uint8_t is a 8 bit unsigned integer
|
||||||
|
double* geotransform; //!< Six double buffer for storing the affine transformations
|
||||||
int width; //!< width of image in cells
|
int width; //!< width of image in cells
|
||||||
int height; //!< height of image in cells
|
int height; //!< height of image in cells
|
||||||
OGRSpatialReference reference_system;
|
OGRSpatialReference reference_system;
|
||||||
|
CellMap(int width, int height, uint8_t* cells, OGRSpatialReference reference_system, double* geotransform);
|
||||||
CellMap(int width, int height, uint8_t* cells, OGRSpatialReference reference_system);
|
|
||||||
int get_cell(int x,int y);
|
int get_cell(int x,int y);
|
||||||
};
|
};
|
23
src/main.cpp
23
src/main.cpp
@ -24,7 +24,7 @@ CellMap produce_cellmap(HeightMap* heightmap, float z)
|
|||||||
*(cells + i) = result;
|
*(cells + i) = result;
|
||||||
}
|
}
|
||||||
|
|
||||||
return CellMap(heightmap->width-1, heightmap->height-1, cells, heightmap->reference_system);
|
return CellMap(heightmap->width-1, heightmap->height-1, cells, heightmap->reference_system, heightmap->geotransform);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -50,6 +50,16 @@ std::vector<CellMap> vector_cellmap(HeightMap* heightmap, int interval)
|
|||||||
return vector_contours;
|
return vector_contours;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::tuple<double, double> local_to_projected(double* geotransform, int x, int y)
|
||||||
|
{
|
||||||
|
return {
|
||||||
|
geotransform[1] * x + geotransform[2] * y +
|
||||||
|
geotransform[1] * 0.5 + geotransform[2] * 0.5 + geotransform[0],
|
||||||
|
geotransform[4] * x + geotransform[5] * y +
|
||||||
|
geotransform[4] * 0.5 + geotransform[5] * 0.5 + geotransform[3]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
|
void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -98,13 +108,7 @@ void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
|
|||||||
for (int i = 0; i<cellmap->height*cellmap->width; i++) {
|
for (int i = 0; i<cellmap->height*cellmap->width; i++) {
|
||||||
if (*(cellmap->cells + i) != 0 && *(cellmap->cells + i) != 15)
|
if (*(cellmap->cells + i) != 0 && *(cellmap->cells + i) != 15)
|
||||||
{
|
{
|
||||||
int x_int = i%cellmap->width;
|
|
||||||
int y_int = cellmap->height*cellmap->width - i/cellmap->width;
|
|
||||||
double x = double(x_int);
|
|
||||||
double y = double(y_int);
|
|
||||||
|
|
||||||
OGRFeature *poFeature;
|
OGRFeature *poFeature;
|
||||||
|
|
||||||
poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
|
poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );
|
||||||
poFeature->SetField( "Name", *(cellmap->cells + i) );
|
poFeature->SetField( "Name", *(cellmap->cells + i) );
|
||||||
|
|
||||||
@ -117,6 +121,11 @@ void write_output_file(std::vector<CellMap> cellmaps, const char *filepath)
|
|||||||
printf( "Transformation failed.\n" );
|
printf( "Transformation failed.\n" );
|
||||||
*/
|
*/
|
||||||
OGRPoint pt;
|
OGRPoint pt;
|
||||||
|
|
||||||
|
int x_raw = i%cellmap->width;
|
||||||
|
int y_raw = i/cellmap->width;
|
||||||
|
auto [x, y] = local_to_projected(cellmap->geotransform, x_raw, y_raw);
|
||||||
|
|
||||||
pt.setX( x );
|
pt.setX( x );
|
||||||
pt.setY( y );
|
pt.setY( y );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user