From 1dcfb0e737e796943d928cf809e7ce8e86e6cdb3 Mon Sep 17 00:00:00 2001 From: Trygve Date: Tue, 30 Apr 2024 15:09:18 +0200 Subject: [PATCH] Changed file wrriting to use list of points --- src/main.cpp | 75 +++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 33 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 503d81f..5a917e0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -86,7 +86,7 @@ constexpr std::tuple marching_squares_lookup(int case 14: return {0, 0.5, 0.5, 0}; }; } -void write_output_file(std::vector cellmaps, const char *filepath) +void write_output_file(std::vector> all_points, const char *filepath, HeightMap* heightmap) { const char *pszDriverName = "GeoJSON"; @@ -112,7 +112,7 @@ void write_output_file(std::vector cellmaps, const char *filepath) OGRLayer *poLayer; - poLayer = poDS->CreateLayer( "contours", &(cellmaps[0]).reference_system, wkbLineString, NULL ); + poLayer = poDS->CreateLayer( "contours", /*&(cellmaps[0]).reference_system*/ NULL, wkbLineString, NULL ); if( poLayer == NULL ) { printf( "Layer creation failed.\n" ); @@ -128,42 +128,51 @@ void write_output_file(std::vector cellmaps, const char *filepath) printf( "Creating Name field failed.\n" ); exit( 1 ); } - for (int j = 0; j < cellmaps.size(); j++) + int width = heightmap->width -1; + int height = heightmap->height -1; + int size = width * height; + + for (int j = 0; j < all_points.size(); j++) { - CellMap* cellmap = &cellmaps[j]; + OGRFeature *feature; + OGRLineString *geometry = new OGRLineString(); + feature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() ); + feature->SetField( "Name", j ); - for (int i = 0; i < cellmap->height*cellmap->width; i++) + + std::vector points = all_points[j]; + + for (int i = 0; i < points.size(); i++) { - if (*(cellmap->cells + i) != 0 && *(cellmap->cells + i) != 15) - { - OGRFeature *feature; - OGRLineString *geometry = new OGRLineString(); - feature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() ); - feature->SetField( "Name", j ); - int x_raw = i%cellmap->width; - int y_raw = i/cellmap->width; - auto [x, y] = local_to_projected(cellmap->geotransform, x_raw, y_raw); - auto [x_bl, y_bl, x_tr, y_tr] = marching_squares_lookup(*(cellmap->cells + i) ); - //std::cout << x << ", " << y << " "; - geometry->setPoint( geometry->getNumPoints(), x+x_tr*0.25, y+y_tr*0.25 ); - geometry->setPoint( geometry->getNumPoints(), x+x_bl*0.25, y+y_bl*0.25 ); - - if ( feature->SetGeometry(geometry) != OGRERR_NONE) - { - printf( "Failed to set geometry.\n" ); - exit( 1 ); - } - OGRGeometryFactory::destroyGeometry(geometry); - if( poLayer->CreateFeature( feature ) != OGRERR_NONE ) - { - printf( "Failed to create feature in shapefile.\n" ); - exit( 1 ); - } - OGRFeature::DestroyFeature( feature ); - } + //int x_raw = i%width; + //int y_raw = i/height; + int x_raw = points[i].x; + int y_raw = points[i].y; + auto [x, y] = local_to_projected(heightmap->geotransform, x_raw, y_raw); + //auto [x_bl, y_bl, x_tr, y_tr] = marching_squares_lookup(*(cellmap->cells + i) ); + //std::cout << x << ", " << y << " "; + //geometry->setPoint( geometry->getNumPoints(), x+x_tr*0.25, y+y_tr*0.25 ); + //geometry->setPoint( geometry->getNumPoints(), x+x_bl*0.25, y+y_bl*0.25 ); + geometry->setPoint(geometry->getNumPoints(),x ,y ); + + + } + + if ( feature->SetGeometry(geometry) != OGRERR_NONE) + { + printf( "Failed to set geometry.\n" ); + exit( 1 ); + } + OGRGeometryFactory::destroyGeometry(geometry); + if( poLayer->CreateFeature( feature ) != OGRERR_NONE ) + { + printf( "Failed to create feature in shapefile.\n" ); + exit( 1 ); + } + OGRFeature::DestroyFeature( feature ); } @@ -184,5 +193,5 @@ int main(int argc, const char* argv[]) auto cellmap = produce_cellmap(&map, 40); auto cellmaps = vector_cellmap(&map, 5); - //write_output_file(cellmaps, "out.geojson"); + write_output_file(cellmaps, "out.geojson", &map); } \ No newline at end of file