1
0
Fork 0

additional fix for TNCM - handle western longitude and souther latitude rounding

This commit is contained in:
Peter Sadrozinski 2014-01-11 20:10:38 -05:00
parent 733f9347ab
commit c5d6c20998
6 changed files with 114 additions and 44 deletions

View file

@ -41,8 +41,8 @@ bool TGConstruct::ClipLandclassPolys( void ) {
tgcontour_list slivers;
SGGeod p;
bool debug_area, debug_shape;
static int accum_idx = 0;
tgAccumulator accum;
unsigned int accum_idx = 0;
// set up clipping tile : and remember to add the nodes!
p = bucket.get_corner( SG_BUCKET_SW );
@ -129,9 +129,11 @@ bool TGConstruct::ClipLandclassPolys( void ) {
sprintf(layer, "pre_clip_%d", polys_in.get_poly( i, j ).GetId() );
sprintf(name, "shape %d,%d", i,j);
tgShapefile::FromPolygon( tmp, ds_name, layer, name );
tgPolygon::ToClipperFile( tmp, ds_name, layer );
sprintf(layer, "pre_clip_accum_%d_%d", accum_idx, polys_in.get_poly( i, j ).GetId() );
sprintf(layer, "pre_clip_accum_%d", polys_in.get_poly( i, j ).GetId() );
accum.ToShapefiles( ds_name, layer, false );
//accum.ToClipperFile( ds_name, layer, false );
}
clipped = accum.Diff( tmp );
@ -163,16 +165,21 @@ bool TGConstruct::ClipLandclassPolys( void ) {
}
}
}
if ( debug_area || debug_shape ) {
char layer[32];
sprintf(layer, "pre2_clip_accum_%d", polys_in.get_poly( i, j ).GetId() );
accum.ToShapefiles( ds_name, layer, false );
accum.ToClipperfiles( ds_name, layer, false );
}
accum.Add( tmp );
if ( debug_area || debug_shape ) {
char layer[32];
sprintf(layer, "post_clip_accum_%d_%d", accum_idx, polys_in.get_poly( i, j ).GetId() );
sprintf(layer, "post_clip_accum_%d_%d", accum_idx++, polys_in.get_poly( i, j ).GetId() );
accum.ToShapefiles( ds_name, layer, false );
accum.ToClipperfiles( ds_name, layer, false );
}
accum_idx++;
}
}
@ -197,8 +204,7 @@ bool TGConstruct::ClipLandclassPolys( void ) {
slivers.clear();
if ( debug_shapes.size() )
{
if ( debug_all || debug_shapes.size() || debug_areas.size() ) {
char layer[32];
char name[32];
@ -206,14 +212,13 @@ bool TGConstruct::ClipLandclassPolys( void ) {
sprintf(name, "shape");
tgShapefile::FromPolygon( safety_base, ds_name, layer, name );
tgPolygon::ToClipperFile( safety_base, ds_name, layer );
//tgPolygon::ToClipperFile( safety_base, ds_name, layer );
}
// finally, what ever is left over goes to ocean
remains = accum.Diff( safety_base );
if ( debug_shapes.size() )
{
if ( debug_all || debug_shapes.size() || debug_areas.size() ) {
char layer[32];
char name[32];
@ -227,8 +232,7 @@ bool TGConstruct::ClipLandclassPolys( void ) {
remains = tgPolygon::RemoveDups( remains );
remains = tgPolygon::RemoveCycles( remains );
if ( debug_shapes.size() )
{
if ( debug_all || debug_shapes.size() || debug_areas.size() ) {
char layer[32];
char name[32];

View file

@ -237,7 +237,10 @@ void TGConstruct::WriteBtgFile( void )
}
if (debug_all || debug_shapes.size())
{
lock->lock();
result = obj.write_ascii( base, txtname, bucket );
lock->unlock();
if ( !result )
{
throw sg_exception("error writing file. :-(");

View file

@ -1,3 +1,7 @@
#include <iostream>
#include <fstream>
#include <sstream>
#include <simgear/debug/logstream.hxx>
#include "tg_accumulator.hxx"
@ -128,14 +132,19 @@ void tgAccumulator::Add( const tgContour& subject )
void tgAccumulator::Add( const tgPolygon& subject )
{
if ( subject.Contours() ) {
ClipperLib::Paths clipper_subject = tgPolygon::ToClipper( subject );
for ( unsigned int i = 0; i < subject.Contours(); ++i ) {
for ( unsigned int j = 0; j < subject.ContourSize( i ); ++j ) {
nodes.add( subject.GetNode(i, j) );
}
}
ClipperLib::Paths clipper_subject = tgPolygon::ToClipper( subject );
accum.push_back( clipper_subject );
} else {
SG_LOG(SG_GENERAL, SG_ALERT, "tgAccumulator::Add() - Adding poly with " << subject.Contours() << " contours " );
}
}
void tgAccumulator::ToShapefiles( const std::string& path, const std::string& layer_prefix, bool individual )
@ -143,6 +152,7 @@ void tgAccumulator::ToShapefiles( const std::string& path, const std::string& la
char shapefile[32];
char layer[32];
if ( accum.size() ) {
if ( individual ) {
for (unsigned int i=0; i < accum.size(); i++) {
sprintf( layer, "%s_%d", layer_prefix.c_str(), i );
@ -157,8 +167,48 @@ void tgAccumulator::ToShapefiles( const std::string& path, const std::string& la
for ( unsigned int i=0; i<accum.size(); i++ ) {
c.AddPaths(accum[i], ClipperLib::ptSubject, true);
}
c.Execute( ClipperLib::ctUnion, clipper_result, ClipperLib::pftNonZero, ClipperLib::pftNonZero);
if ( c.Execute( ClipperLib::ctUnion, clipper_result, ClipperLib::pftNonZero, ClipperLib::pftNonZero) ) {
tgShapefile::FromClipper( clipper_result, path, layer_prefix, "accum" );
} else {
SG_LOG(SG_GENERAL, SG_ALERT, "Clipper Failure in tgAccumulator::ToShapefiles()" );
}
}
}
}
void tgAccumulator::ToClipperfiles( const std::string& path, const std::string& layer_prefix, bool individual )
{
std::ofstream file;
char filename[256];
if ( accum.size() ) {
if ( individual ) {
for (unsigned int i=0; i < accum.size(); i++) {
sprintf( filename, "%s/%s_%d", path.c_str(), layer_prefix.c_str(), i );
file.open (filename);
file << accum[i];
file.close();
}
} else {
ClipperLib::Paths clipper_result;
ClipperLib::Clipper c;
c.Clear();
for ( unsigned int i=0; i<accum.size(); i++ ) {
c.AddPaths(accum[i], ClipperLib::ptSubject, true);
}
if ( c.Execute( ClipperLib::ctUnion, clipper_result, ClipperLib::pftNonZero, ClipperLib::pftNonZero) ) {
sprintf( filename, "%s/%s", path.c_str(), layer_prefix.c_str() );
file.open (filename);
file << clipper_result;
file.close();
} else {
SG_LOG(SG_GENERAL, SG_ALERT, "Clipper Failure in tgAccumulator::ToClipperFiles()" );
}
}
}
}

View file

@ -15,6 +15,7 @@ public:
void Add( const tgPolygon& subject );
void ToShapefiles( const std::string& path, const std::string& layer, bool individual );
void ToClipperfiles( const std::string& path, const std::string& layer_prefix, bool individual );
private:
typedef std::vector < ClipperLib::Paths > clipper_polygons_list;

View file

@ -10,8 +10,13 @@
const double isEqual2D_Epsilon = 0.000001;
#if 0
#define CLIPPER_FIXEDPT (1000000000000)
#define CLIPPER_METERS_PER_DEGREE (111000)
#else
#define CLIPPER_FIXEDPT (10000000000000000)
#define CLIPPER_METERS_PER_DEGREE (1110000000)
#endif
SGGeod SGGeod_snap( const SGGeod& in, double grid )
{
@ -72,8 +77,17 @@ ClipperLib::IntPoint SGGeod_ToClipper( const SGGeod& p )
{
ClipperLib::cUInt x, y;
if ( p.getLongitudeDeg() > 0 ) {
x = (ClipperLib::cUInt)( (p.getLongitudeDeg() * CLIPPER_FIXEDPT) + 0.5 );
} else {
x = (ClipperLib::cUInt)( (p.getLongitudeDeg() * CLIPPER_FIXEDPT) - 0.5 );
}
if ( p.getLatitudeDeg() > 0 ) {
y = (ClipperLib::cUInt)( (p.getLatitudeDeg() * CLIPPER_FIXEDPT) + 0.5 );
} else {
y = (ClipperLib::cUInt)( (p.getLatitudeDeg() * CLIPPER_FIXEDPT) - 0.5 );
}
return ClipperLib::IntPoint( x, y );
}

View file

@ -405,8 +405,6 @@ public:
static tgPolygon FromClipper( const ClipperLib::Paths& subject );
static void ToClipperFile( const tgPolygon& subject, const std::string& path, const std::string& filename );
static void ToShapefile( const tgPolygon& subject, const std::string& datasource, const std::string& layer, const std::string& feature );
// T-Junctions and segment search
static tgPolygon AddColinearNodes( const tgPolygon& subject, UniqueSGGeodSet& nodes );
static tgPolygon AddColinearNodes( const tgPolygon& subject, std::vector<SGGeod>& nodes );