mirror of
https://github.com/google/sandboxed-api.git
synced 2024-03-22 13:11:30 +08:00
Initial version of raster GeoTIFF workflow
This commit is contained in:
parent
9331eabd7e
commit
93e30c724b
BIN
oss-internship-2020/gdal/CANYrelief1-geo.tif
Normal file
BIN
oss-internship-2020/gdal/CANYrelief1-geo.tif
Normal file
Binary file not shown.
56
oss-internship-2020/gdal/CMakeLists.txt
Normal file
56
oss-internship-2020/gdal/CMakeLists.txt
Normal file
|
@ -0,0 +1,56 @@
|
|||
cmake_minimum_required(VERSION 3.10)
|
||||
|
||||
project(test CXX C)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||||
|
||||
set(SAPI_ROOT "/usr/local/google/home/inach/work/sandboxed-api" CACHE PATH "Path to the Sandboxed API source tree")
|
||||
# cmake .. -G Ninja -DSAPI_ROOT=$HOME/sapi_root
|
||||
|
||||
set(SAPI_ENABLE_EXAMPLES OFF CACHE BOOL "")
|
||||
set(SAPI_ENABLE_TESTS OFF CACHE BOOL "")
|
||||
add_subdirectory("${SAPI_ROOT}"
|
||||
"${CMAKE_BINARY_DIR}/sandboxed-api-build"
|
||||
# Omit this to have the full Sandboxed API in IDE
|
||||
EXCLUDE_FROM_ALL)
|
||||
|
||||
add_library(libgdal STATIC IMPORTED)
|
||||
set_property(TARGET libgdal PROPERTY IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/lib/libgdal.a")
|
||||
|
||||
find_package(PNG REQUIRED)
|
||||
|
||||
target_link_libraries(libgdal INTERFACE
|
||||
crypto expat jpeg
|
||||
/usr/lib/x86_64-linux-gnu/libproj.so
|
||||
/usr/lib/x86_64-linux-gnu/libpcre.so
|
||||
sqlite3 tiff z pthread m rt dl curl
|
||||
PNG::PNG)
|
||||
|
||||
add_sapi_library(gdal_sapi
|
||||
FUNCTIONS GDALOpen GDALAllRegister GDALGetDatasetDriver
|
||||
GDALGetDriverShortName GDALGetDriverLongName GDALGetRasterXSize
|
||||
GDALGetRasterYSize GDALGetRasterCount GDALGetProjectionRef
|
||||
GDALOpenEx GDALGetGeoTransform GDALGetRasterBand GDALGetBlockSize
|
||||
GDALGetRasterMinimum GDALGetRasterMaximum GDALGetRasterBandXSize
|
||||
GDALGetRasterBandYSize GDALRasterIO
|
||||
|
||||
INPUTS "/usr/include/gdal/gdal.h"
|
||||
LIBRARY libgdal
|
||||
LIBRARY_NAME gdal
|
||||
|
||||
NAMESPACE ""
|
||||
)
|
||||
|
||||
target_include_directories(gdal_sapi INTERFACE
|
||||
"${PROJECT_BINARY_DIR}"
|
||||
)
|
||||
|
||||
add_executable(raster
|
||||
raster.cc
|
||||
)
|
||||
|
||||
target_link_libraries(raster
|
||||
gdal_sapi
|
||||
sapi::sapi
|
||||
)
|
53
oss-internship-2020/gdal/README.md
Normal file
53
oss-internship-2020/gdal/README.md
Normal file
|
@ -0,0 +1,53 @@
|
|||
# GDAL Raster GeoTIFF Workflow
|
||||
|
||||
```
|
||||
Build Tools: CMake/Ninja
|
||||
OS: Linux
|
||||
```
|
||||
|
||||
### For testing:
|
||||
`mkdir build && cd build`
|
||||
|
||||
`cmake .. -G Ninja`
|
||||
|
||||
`ninja`
|
||||
|
||||
`./raster`
|
||||
|
||||
## About the project
|
||||
GDAL is a translator library for raster and vector
|
||||
geospatial data format.
|
||||
The project consist in rastering a GeoTIFF file format
|
||||
using GDAL functionalities and sandboxed methods.
|
||||
|
||||
## Implementation
|
||||
|
||||
*Sandboxing...*
|
||||
|
||||
The purpose of sandboxing is to limit the permissions
|
||||
and capabilities of library’s methods, in order to
|
||||
secure the usage of them. After obtaining the sandbox,
|
||||
the functions will be called through an Sandbox API
|
||||
(being called api in the current test) and so, the
|
||||
operations, system calls or namspaces access may be
|
||||
controlled.
|
||||
|
||||
*Raster process...*
|
||||
|
||||
From gdal.h header useful methods are added to sapi
|
||||
library builded with CMake.
|
||||
|
||||
One .tiff file is manipulated with GDALOpen
|
||||
functionality, which extracts a pointer to the data set
|
||||
containg a list of raster bands, all pertaining to the
|
||||
same area.
|
||||
Metadata, a coordinate system, a georeferencing
|
||||
transform, size of raster and various other information
|
||||
are kept into the data set that corresponds to the image.
|
||||
|
||||
To create an array containing the image information, the
|
||||
dimentions needed are extracted using some specific
|
||||
GDAL(X/Y)Size functions applied to the block.
|
||||
GDALRasterBand function takes care of data type conversion, one more step following: placing the
|
||||
converted data (with RasterIO method) into the created
|
||||
and well allocated structure.
|
115
oss-internship-2020/gdal/raster.cc
Normal file
115
oss-internship-2020/gdal/raster.cc
Normal file
|
@ -0,0 +1,115 @@
|
|||
#include <gflags/gflags.h>
|
||||
#include <glog/logging.h>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "gdal_sapi.sapi.h"
|
||||
#include "sandboxed_api/sandbox2/util/fileops.h"
|
||||
|
||||
class GdalSapiSandbox : public gdalSandbox {
|
||||
public:
|
||||
std::unique_ptr<sandbox2::Policy> ModifyPolicy(
|
||||
sandbox2::PolicyBuilder*) override {
|
||||
return sandbox2::PolicyBuilder()
|
||||
.DangerDefaultAllowAll()
|
||||
.DisableNamespaces()
|
||||
.BuildOrDie();
|
||||
}
|
||||
};
|
||||
|
||||
int main() {
|
||||
GdalSapiSandbox sandbox;
|
||||
sandbox.Init().IgnoreError();
|
||||
gdalApi api(&sandbox);
|
||||
|
||||
// Reading GDALDataset from a (local, specific) file.
|
||||
std::string filename = "CANYrelief1-geo.tif";
|
||||
sapi::v::CStr s(filename.data());
|
||||
|
||||
api.GDALAllRegister().IgnoreError();
|
||||
auto open = api.GDALOpen(s.PtrBefore(), GDALAccess::GA_ReadOnly);
|
||||
sapi::v::RemotePtr ptrDataset(open.value());
|
||||
|
||||
LOG(INFO) << "Dataset pointer adress: " << open.value() << std::endl;
|
||||
LOG(INFO) << ptrDataset.ToString() << std::endl;
|
||||
if (!open.value()) {
|
||||
printf("NULL pointer for Dataset.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Printing some general information about the dataset.
|
||||
auto driver = api.GDALGetDatasetDriver(&ptrDataset);
|
||||
sapi::v::RemotePtr ptrDriver(driver.value());
|
||||
|
||||
auto driverShortName = api.GDALGetDriverShortName(&ptrDriver);
|
||||
auto driverLongName = api.GDALGetDriverLongName(&ptrDriver);
|
||||
|
||||
sapi::v::RemotePtr ptrDriverShortName(driverShortName.value());
|
||||
sapi::v::RemotePtr ptrDriverLongName(driverLongName.value());
|
||||
|
||||
LOG(INFO) << "Driver short name: "
|
||||
<< sandbox.GetCString(ptrDriverShortName).value().c_str();
|
||||
LOG(INFO) << "Driver long name: "
|
||||
<< sandbox.GetCString(ptrDriverLongName).value().c_str();
|
||||
|
||||
// Checking that GetGeoTransform is valid.
|
||||
std::vector<double> adfGeoTransform(6);
|
||||
sapi::v::Array<double> adfGeoTransformArray(&adfGeoTransform[0],
|
||||
adfGeoTransform.size());
|
||||
|
||||
api.GDALGetGeoTransform(&ptrDataset, adfGeoTransformArray.PtrBoth())
|
||||
.IgnoreError();
|
||||
|
||||
LOG(INFO) << "Origin = (" << adfGeoTransform[0] << ", " << adfGeoTransform[3]
|
||||
<< ")" << std::endl;
|
||||
LOG(INFO) << "Pixel Size = (" << adfGeoTransform[0] << ", "
|
||||
<< adfGeoTransform[3] << ")" << std::endl;
|
||||
|
||||
std::vector<int> nBlockXSize(1);
|
||||
std::vector<int> nBlockYSize(1);
|
||||
|
||||
sapi::v::Array<int> nBlockXSizeArray(&nBlockXSize[0], nBlockXSize.size());
|
||||
sapi::v::Array<int> nBlockYSizeArray(&nBlockYSize[0], nBlockYSize.size());
|
||||
|
||||
auto band = api.GDALGetRasterBand(&ptrDataset, 1);
|
||||
LOG(INFO) << "Band pointer adress: " << band.value() << std::endl;
|
||||
if (!band.value()) {
|
||||
printf("NULL pointer for Band.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
sapi::v::RemotePtr ptrBand(band.value());
|
||||
api.GDALGetBlockSize(&ptrBand, nBlockXSizeArray.PtrBoth(),
|
||||
nBlockYSizeArray.PtrBoth())
|
||||
.IgnoreError();
|
||||
|
||||
LOG(INFO) << "Block = " << nBlockXSize[0] << " x " << nBlockYSize[0]
|
||||
<< std::endl;
|
||||
|
||||
std::vector<int> bGotMin(1);
|
||||
std::vector<int> bGotMax(1);
|
||||
|
||||
sapi::v::Array<int> bGotMinArray(&bGotMin[0], bGotMin.size());
|
||||
sapi::v::Array<int> bGotMaxArray(&bGotMax[0], bGotMax.size());
|
||||
|
||||
auto adfMin = api.GDALGetRasterMinimum(&ptrBand, bGotMinArray.PtrBoth());
|
||||
auto adfMax = api.GDALGetRasterMaximum(&ptrBand, bGotMaxArray.PtrBoth());
|
||||
|
||||
auto nXSize = api.GDALGetRasterBandXSize(&ptrBand);
|
||||
auto nYSize = api.GDALGetRasterBandYSize(&ptrBand);
|
||||
|
||||
std::vector<int8_t> rasterData(nXSize.value() * nYSize.value(), -1);
|
||||
sapi::v::Array<int8_t> rasterDataArray(&rasterData[0], rasterData.size());
|
||||
|
||||
api.GDALRasterIO(&ptrBand, GF_Read, 0, 0, nXSize.value(), nYSize.value(),
|
||||
rasterDataArray.PtrBoth(), nXSize.value(), nYSize.value(),
|
||||
GDT_Byte, 0, 0)
|
||||
.IgnoreError();
|
||||
|
||||
std::cout << "Raster data info: " << rasterDataArray.ToString() << std::endl;
|
||||
|
||||
// To print the data content: `std::cout << rasterDataArray.GetData() <<
|
||||
// std::endl;`
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user