45 #pragma GCC diagnostic push 46 #pragma GCC diagnostic ignored "-Wpedantic" 48 #include <ogrsf_frmts.h> 50 #include <gdal_priv.h> 52 #pragma GCC diagnostic pop 67 myRTree(&
Triangle::addSelf), myRaster(0) {
91 WRITE_WARNING(
"Cannot supply height since no height data was loaded");
101 corners.push_back(
Position(floor(normX) + 0.5, floor(normY) + 0.5,
myRaster[(
int)normY * xSize + (
int)normX]));
102 if (normX - floor(normX) > 0.5) {
103 corners.push_back(
Position(floor(normX) + 1.5, floor(normY) + 0.5,
myRaster[(
int)normY * xSize + (
int)normX + 1]));
105 corners.push_back(
Position(floor(normX) - 0.5, floor(normY) + 0.5,
myRaster[(
int)normY * xSize + (
int)normX - 1]));
107 if (normY - floor(normY) > 0.5) {
108 corners.push_back(
Position(floor(normX) + 0.5, floor(normY) + 1.5,
myRaster[((
int)normY + 1) * xSize + (
int)normX]));
110 corners.push_back(
Position(floor(normX) + 0.5, floor(normY) - 0.5,
myRaster[((
int)normY - 1) * xSize + (
int)normX]));
114 if (result > -1e5 && result < 1e5) {
121 minB[0] = (float)geo.
x() - 0.00001f;
122 minB[1] = (float)geo.
y() - 0.00001f;
123 maxB[0] = (float)geo.
x() + 0.00001f;
124 maxB[1] = (float)geo.
y() + 0.00001f;
126 int hits =
myRTree.Search(minB, maxB, queryResult);
128 assert(hits == (
int)result.size());
131 for (Triangles::iterator it = result.begin(); it != result.end(); it++) {
134 return triangle->
getZ(geo);
147 const float cmin[2] = {(float) b.
xmin(), (float) b.
ymin()};
148 const float cmax[2] = {(float) b.
xmax(), (float) b.
ymax()};
149 myRTree.Insert(cmin, cmax, triangle);
155 if (oc.
isSet(
"heightmap.geotiff")) {
157 std::vector<std::string> files = oc.
getStringVector(
"heightmap.geotiff");
158 for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
162 " done (parsed " +
toString(numFeatures) +
166 if (oc.
isSet(
"heightmap.shapefiles")) {
168 std::vector<std::string> files = oc.
getStringVector(
"heightmap.shapefiles");
169 for (std::vector<std::string>::const_iterator file = files.begin(); file != files.end(); ++file) {
173 " done (parsed " +
toString(numFeatures) +
183 #if GDAL_VERSION_MAJOR < 2 185 OGRDataSource* ds = OGRSFDriverRegistrar::Open(file.c_str(), FALSE);
188 GDALDataset* ds = (GDALDataset*)GDALOpenEx(file.c_str(), GDAL_OF_VECTOR | GA_ReadOnly, NULL, NULL, NULL);
191 throw ProcessError(
"Could not open shape file '" + file +
"'.");
195 OGRLayer* layer = ds->GetLayer(0);
196 layer->ResetReading();
200 OGRSpatialReference* sr_src = layer->GetSpatialRef();
201 OGRSpatialReference sr_dest;
202 sr_dest.SetWellKnownGeogCS(
"WGS84");
203 OGRCoordinateTransformation* toWGS84 = OGRCreateCoordinateTransformation(sr_src, &sr_dest);
205 WRITE_WARNING(
"Could not create geocoordinates converter; check whether proj.4 is installed.");
210 layer->ResetReading();
211 while ((feature = layer->GetNextFeature()) != NULL) {
212 OGRGeometry* geom = feature->GetGeometryRef();
216 assert(std::string(geom->getGeometryName()) == std::string(
"POLYGON"));
218 geom->transform(toWGS84);
219 OGRLinearRing* cgeom = ((OGRPolygon*) geom)->getExteriorRing();
221 assert(cgeom->getNumPoints() == 4);
223 for (
int j = 0; j < 3; j++) {
224 Position pos((
double) cgeom->getX(j), (double) cgeom->getY(j), (double) cgeom->getZ(j));
225 corners.push_back(pos);
262 OGRFeature::DestroyFeature(feature);
264 #if GDAL_VERSION_MAJOR < 2 265 OGRDataSource::DestroyDataSource(ds);
269 OCTDestroyCoordinateTransformation(toWGS84);
273 WRITE_ERROR(
"Cannot load shape file since SUMO was compiled without GDAL support.");
283 GDALDataset* poDataset = (GDALDataset*)GDALOpen(file.c_str(), GA_ReadOnly);
284 if (poDataset == 0) {
288 const int xSize = poDataset->GetRasterXSize();
289 const int ySize = poDataset->GetRasterYSize();
290 double adfGeoTransform[6];
291 if (poDataset->GetGeoTransform(adfGeoTransform) == CE_None) {
292 Position topLeft(adfGeoTransform[0], adfGeoTransform[3]);
297 myBoundary.
add(topLeft.
x() + horizontalSize, topLeft.
y() + verticalSize);
299 WRITE_ERROR(
"Could not parse geo information from " + file +
".");
302 const int picSize = xSize * ySize;
304 for (
int i = 1; i <= poDataset->GetRasterCount(); i++) {
305 GDALRasterBand* poBand = poDataset->GetRasterBand(i);
306 if (poBand->GetColorInterpretation() != GCI_GrayIndex) {
307 WRITE_ERROR(
"Unknown color band in " + file +
".");
311 if (poBand->GetRasterDataType() != GDT_Int16) {
316 assert(xSize == poBand->GetXSize() && ySize == poBand->GetYSize());
317 if (poBand->RasterIO(GF_Read, 0, 0, xSize, ySize,
myRaster, xSize, ySize, GDT_Int16, 0, 0) == CE_Failure) {
323 GDALClose(poDataset);
326 WRITE_ERROR(
"Cannot load GeoTIFF file since SUMO was compiled without GDAL support.");
385 Position side2 = myCorners[2] - myCorners[0];
double xmax() const
Returns maximum x-coordinate.
std::vector< std::string > getStringVector(const std::string &name) const
Returns the list of string-vector-value of the named option (only for Option_String) ...
bool ready() const
returns whether the NBHeightMapper has data
Position normalVector() const
returns the normal vector for this triangles plane
int loadShapeFile(const std::string &file)
load height data from Arcgis-shape file and returns the number of parsed features ...
bool around(const Position &p, double offset=0) const
Returns the information whether the position vector describes a polygon lying around the given point...
double ymax() const
Returns maximum y-coordinate.
double x() const
Returns the x-position.
Triangle(const PositionVector &corners)
double getZ(const Position &geo) const
returns the projection of the give geoCoordinate (WGS84) onto triangle plane
void addTriangle(PositionVector corners)
adds one triangles worth of height data
void clearData()
clears loaded data
static NBHeightMapper Singleton
the singleton instance
void set(double x, double y)
set positions x and y
NBHeightMapper()
private constructor and destructor (Singleton)
#define UNUSED_PARAMETER(x)
A class that stores a 2D geometrical boundary.
#define WRITE_WARNING(msg)
int loadTiff(const std::string &file)
load height data from GeoTIFF file and returns the number of non void pixels
static const NBHeightMapper & get()
return the singleton instance (maybe 0)
class for cirumventing the const-restriction of RTree::Search-context
static void loadIfSet(OptionsCont &oc)
loads heigh map data if any loading options are set
TRIANGLE_RTREE_QUAL myRTree
The RTree for spatial queries.
Position crossProduct(const Position &pos)
returns the cross product between this point and the second one
std::string toString(const T &t, std::streamsize accuracy=gPrecision)
A point in 2D or 3D with translation and scaling methods.
double y() const
Returns the y-position.
std::vector< const Triangle * > Triangles
#define PROGRESS_BEGIN_MESSAGE(msg)
static MsgHandler * getMessageInstance()
Returns the instance to add normal messages to.
int16_t * myRaster
raster height information in m
bool contains(const Position &pos) const
checks whether pos lies within triangle (only checks x,y)
Position mySizeOfPixel
dimensions of one pixel in raster data
Boundary myBoundary
convex boundary of all known triangles;
bool around(const Position &p, double offset=0) const
Returns whether the boundary contains the given coordinate.
void reset()
Resets the boundary.
double xmin() const
Returns minimum x-coordinate.
double dotProduct(const Position &pos)
returns the dot product (scalar product) between this point and the second one
PositionVector myCorners
the corners of the triangle
A storage for options typed value containers)
void addSelf(const QueryResult &queryResult) const
callback for RTree search
double ymin() const
Returns minimum y-coordinate.
double getZ(const Position &geo) const
returns height for the given geo coordinate (WGS84)
void add(double x, double y, double z=0)
Makes the boundary include the given coordinate.
const Boundary & getBoundary()
returns the convex boundary of all known triangles
Boundary getBoxBoundary() const
Returns a boundary enclosing this list of lines.
Set z-values for all network positions based on data from a height map.
bool isSet(const std::string &name, bool failOnNonExistant=true) const
Returns the information whether the named option is set.
void sub(double dx, double dy)
Substracts the given position from this one.
void endProcessMsg(std::string msg)
Ends a process information.