From a71d62c859850958adbc1a548f8b4fccc0fd1e53 Mon Sep 17 00:00:00 2001 From: ehofman Date: Thu, 26 Feb 2004 15:33:32 +0000 Subject: [PATCH] David Luf: The attached patches significantly quieten the output from genapts, which in it's current form resembles the universe flying by on a bad hair day Remember chaps, console output on Windows is slooowwwwww... Normal service may be resumed using --verbose or -v. I've also added a short help, obtainable with --help or -h. I've also added a couple of extra options, --airport=abcd for just generating a particular airport, and --tile=<[we]xxx[ns]xx> for generating a 1x1 degree tile. We currently have --chunk=<[we]xxx[ns]xx> for generating a 10x10 degree chunk, and I'd like to eventually add --tile as an option to all tools that take --chunk. This one adds the tile option to tgvpf. Erik Hofman: Some small code changes for IRIX. --- src/Airports/GenAirports/apt_surface.cxx | 20 +++--- src/Airports/GenAirports/build.cxx | 92 +++++++++++++----------- src/Airports/GenAirports/lights.cxx | 13 ++-- src/Airports/GenAirports/main.cxx | 73 +++++++++++++++++-- src/Airports/GenAirports/poly_extra.cxx | 6 +- src/Airports/GenAirports/rwy_visual.cxx | 2 +- src/BuildTiles/Osgb36/osgb36.hxx | 6 +- src/BuildTiles/Parallel/server.cxx | 10 +-- src/Lib/Geometry/poly_support.cxx | 77 ++++++++++---------- src/Lib/Geometry/rectangle.hxx | 2 +- src/Lib/Geometry/util.cxx | 10 ++- src/Lib/Geometry/util.hxx | 15 +++- src/Lib/Polygon/split-bin.cxx | 12 ++-- src/Prep/Photo/findcorners.cxx | 4 +- src/Prep/TGVPF/tgvpf.cxx | 24 ++++--- 15 files changed, 231 insertions(+), 135 deletions(-) diff --git a/src/Airports/GenAirports/apt_surface.cxx b/src/Airports/GenAirports/apt_surface.cxx index b15c7832..131e1611 100644 --- a/src/Airports/GenAirports/apt_surface.cxx +++ b/src/Airports/GenAirports/apt_surface.cxx @@ -28,6 +28,7 @@ #include #include +#include #include @@ -89,7 +90,7 @@ static void calc_elevations( const string &root, const string_list elev_src, + "/" + b.gen_index_str(); if ( array.open(array_path) ) { found_file = true; - cout << "Using array_path = " << array_path << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "Using array_path = " << array_path); } j++; } @@ -141,7 +142,7 @@ static void calc_elevations( const string &root, const string_list elev_src, } } double average = total / (double) count; - cout << "Average surface height = " << average << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "Average surface height = " << average); // now go through the elevations and clamp them all to within // +/-10m (33') of the average. @@ -186,7 +187,7 @@ TGAptSurface::TGAptSurface( const string& path, double x_nm = x_rad * SG_RAD_TO_NM * xfact; double x_m = x_nm * SG_NM_TO_METER; - cout << "Area size = " << x_m << " x " << y_m << " (m)" << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "Area size = " << x_m << " x " << y_m << " (m)"); int xdivs = (int)(x_m / 600.0) + 1; int ydivs = (int)(y_m / 600.0) + 1; @@ -194,7 +195,7 @@ TGAptSurface::TGAptSurface( const string& path, if ( xdivs < 3 ) { xdivs = 3; } if ( ydivs < 3 ) { ydivs = 3; } - cout << " M(" << xdivs << "," << ydivs << ")" << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, " M(" << xdivs << "," << ydivs << ")"); double dlon = x_deg / xdivs; double dlat = y_deg / ydivs; @@ -216,7 +217,7 @@ TGAptSurface::TGAptSurface( const string& path, Matrix_Point3Df Pts(xdivs + 1, ydivs + 1); for ( int i = 0; i < xdivs + 1; ++i ) { for ( int j = 0; j < ydivs + 1; ++j ) { - cout << i << "," << j << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, i << "," << j); double accum = 0.0; for ( int ii = 0; ii < mult; ++ii ) { for ( int jj = 0; jj < mult; ++jj ) { @@ -232,10 +233,10 @@ TGAptSurface::TGAptSurface( const string& path, // Create the nurbs surface - cout << "ready to create nurbs surface" << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "ready to create nurbs surface"); apt_surf = new PlNurbsSurfacef; apt_surf->globalInterp( Pts, 3, 3); - cout << " successful." << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, " successful."); } @@ -250,7 +251,7 @@ double TGAptSurface::query( double lon_deg, double lat_deg ) { if ( lon_deg < min_deg.lon() || lon_deg > max_deg.lon() || lat_deg < min_deg.lat() || lat_deg > max_deg.lat() ) { - cout << "Warning: query out of bounds for NURBS surface!" << endl; + SG_LOG(SG_GENERAL, SG_WARN, "Warning: query out of bounds for NURBS surface!"); return -9999.0; } @@ -258,9 +259,8 @@ double TGAptSurface::query( double lon_deg, double lat_deg ) { double x = (lon_deg - min_deg.lon()) / (max_deg.lon() - min_deg.lon()); double y = (lat_deg - min_deg.lat()) / (max_deg.lat() - min_deg.lat()); - cout << " querying for " << x << ", " << y << " = "; Point3Df p = apt_surf->pointAt( x, y ); - cout << p.z() << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, " querying for " << x << ", " << y << " = " << p.z()); return p.z(); } diff --git a/src/Airports/GenAirports/build.cxx b/src/Airports/GenAirports/build.cxx index a30d9ea0..267627e3 100644 --- a/src/Airports/GenAirports/build.cxx +++ b/src/Airports/GenAirports/build.cxx @@ -99,10 +99,10 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, double maxu = tp.get_maxu(); double minv = tp.get_minv(); double maxv = tp.get_maxv(); - SG_LOG( SG_GENERAL, SG_INFO, "section ref = " << ref ); - SG_LOG( SG_GENERAL, SG_INFO, " width = " << width ); - SG_LOG( SG_GENERAL, SG_INFO, " length = " << length ); - SG_LOG( SG_GENERAL, SG_INFO, " heading = " << heading ); + SG_LOG( SG_GENERAL, SG_DEBUG, "section ref = " << ref ); + SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << width ); + SG_LOG( SG_GENERAL, SG_DEBUG, " length = " << length ); + SG_LOG( SG_GENERAL, SG_DEBUG, " heading = " << heading ); Point3D p, t; double x, y, tx, ty; @@ -122,7 +122,7 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, double az1, az2, dist; geo_inverse_wgs_84( 0, ref.y(), ref.x(), p.y(), p.x(), &az1, &az2, &dist ); - SG_LOG(SG_GENERAL, SG_INFO, "basic course = " << az2); + SG_LOG(SG_GENERAL, SG_DEBUG, "basic course = " << az2); // // 2. Rotate this back into a coordinate system where Y @@ -132,7 +132,7 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, double course = az2 - heading; while ( course < -360 ) { course += 360; } while ( course > 360 ) { course -= 360; } - SG_LOG( SG_GENERAL, SG_INFO, + SG_LOG( SG_GENERAL, SG_DEBUG, " course = " << course << " dist = " << dist ); // @@ -141,7 +141,7 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, x = sin( course * SGD_DEGREES_TO_RADIANS ) * dist; y = cos( course * SGD_DEGREES_TO_RADIANS ) * dist; - SG_LOG(SG_GENERAL, SG_INFO, " x = " << x << " y = " << y); + SG_LOG(SG_GENERAL, SG_DEBUG, " x = " << x << " y = " << y); // // 4. Map x, y point into texture coordinates @@ -151,7 +151,7 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, tmp = x / width; tx = tmp * (maxu - minu) + minu; // tx = ((int)(tx * 100)) / 100.0; - SG_LOG(SG_GENERAL, SG_INFO, " (" << tx << ")"); + SG_LOG(SG_GENERAL, SG_DEBUG, " (" << tx << ")"); if ( clip_result) { if ( tx < 0.0 ) { tx = 0.0; } @@ -163,7 +163,7 @@ static TGPolygon rwy_section_tex_coords( const TGPolygon& in_poly, tmp = y / length; ty = tmp * (maxv - minv) + minv; // ty = ((int)(ty * 100)) / 100.0; - SG_LOG(SG_GENERAL, SG_INFO, " (" << ty << ")"); + SG_LOG(SG_GENERAL, SG_DEBUG, " (" << ty << ")"); if ( clip_result ) { if ( ty < 0.0 ) { ty = 0.0; } @@ -411,25 +411,25 @@ void build_airport( string airport_id, float alt_m, string rwy_stopway2 = rwy_str.substr(83, 4); rwy.stopway2 = atoi( rwy_stopway2.c_str() ); - SG_LOG( SG_GENERAL, SG_INFO, " no = " << rwy.rwy_no); - SG_LOG( SG_GENERAL, SG_INFO, " lat = " << rwy_lat << " " << rwy.lat); - SG_LOG( SG_GENERAL, SG_INFO, " lon = " << rwy_lon << " " << rwy.lon); - SG_LOG( SG_GENERAL, SG_INFO, " hdg = " << rwy_hdg << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " no = " << rwy.rwy_no); + SG_LOG( SG_GENERAL, SG_DEBUG, " lat = " << rwy_lat << " " << rwy.lat); + SG_LOG( SG_GENERAL, SG_DEBUG, " lon = " << rwy_lon << " " << rwy.lon); + SG_LOG( SG_GENERAL, SG_DEBUG, " hdg = " << rwy_hdg << " " << rwy.heading); - SG_LOG( SG_GENERAL, SG_INFO, " len = " << rwy_len << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " len = " << rwy_len << " " << rwy.length); - SG_LOG( SG_GENERAL, SG_INFO, " width = " << rwy_width << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << rwy_width << " " << rwy.width); - SG_LOG( SG_GENERAL, SG_INFO, " sfc = " << rwy.surface_flags); - SG_LOG( SG_GENERAL, SG_INFO, " end1 = " << rwy.end1_flags); - SG_LOG( SG_GENERAL, SG_INFO, " dspth1= " << rwy_disp_threshold1 + SG_LOG( SG_GENERAL, SG_DEBUG, " sfc = " << rwy.surface_flags); + SG_LOG( SG_GENERAL, SG_DEBUG, " end1 = " << rwy.end1_flags); + SG_LOG( SG_GENERAL, SG_DEBUG, " dspth1= " << rwy_disp_threshold1 << " " << rwy.disp_thresh1); - SG_LOG( SG_GENERAL, SG_INFO, " stop1 = " << rwy_stopway1 << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " stop1 = " << rwy_stopway1 << " " << rwy.stopway1); - SG_LOG( SG_GENERAL, SG_INFO, " end2 = " << rwy.end2_flags); - SG_LOG( SG_GENERAL, SG_INFO, " dspth2= " << rwy_disp_threshold2 + SG_LOG( SG_GENERAL, SG_DEBUG, " end2 = " << rwy.end2_flags); + SG_LOG( SG_GENERAL, SG_DEBUG, " dspth2= " << rwy_disp_threshold2 << " " << rwy.disp_thresh2); - SG_LOG( SG_GENERAL, SG_INFO, " stop2 = " << rwy_stopway2 << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " stop2 = " << rwy_stopway2 << " " << rwy.stopway2); runways.push_back( rwy ); @@ -472,17 +472,17 @@ void build_airport( string airport_id, float alt_m, taxi.surface_flags = taxi_str.substr(53, 5); - SG_LOG( SG_GENERAL, SG_INFO, " lat = " << taxi_lat << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " lat = " << taxi_lat << " " << taxi.lat); - SG_LOG( SG_GENERAL, SG_INFO, " lon = " << taxi_lon << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " lon = " << taxi_lon << " " << taxi.lon); - SG_LOG( SG_GENERAL, SG_INFO, " hdg = " << taxi_hdg << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " hdg = " << taxi_hdg << " " << taxi.heading); - SG_LOG( SG_GENERAL, SG_INFO, " len = " << taxi_len << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " len = " << taxi_len << " " << taxi.length); - SG_LOG( SG_GENERAL, SG_INFO, " width = " << taxi_width << " " + SG_LOG( SG_GENERAL, SG_DEBUG, " width = " << taxi_width << " " << taxi.width); - SG_LOG( SG_GENERAL, SG_INFO, " sfc = " << taxi.surface_flags); + SG_LOG( SG_GENERAL, SG_DEBUG, " sfc = " << taxi.surface_flags); taxiways.push_back( taxi ); } @@ -549,7 +549,7 @@ void build_airport( string airport_id, float alt_m, } if ( largest_idx >= 0 ) { - SG_LOG( SG_GENERAL, SG_INFO, "generating " << largest_idx ); + SG_LOG( SG_GENERAL, SG_DEBUG, "generating " << largest_idx ); build_runway( taxiways[largest_idx], alt_m, &rwy_polys, &texparams, &accum, &apt_base, &apt_clearing ); @@ -586,6 +586,7 @@ void build_airport( string airport_id, float alt_m, TGPolygon base_poly = polygon_diff( divided_base, accum ); // write_polygon( base_poly, "base-raw" ); + char buf[120]; // For debugging output // Try to remove duplicated nodes and other degeneracies for ( k = 0; k < (int)rwy_polys.size(); ++k ) { SG_LOG(SG_GENERAL, SG_DEBUG, "add nodes/remove dups section = " << k @@ -595,7 +596,8 @@ void build_airport( string airport_id, float alt_m, for ( i = 0; i < poly.contours(); ++i ) { for ( j = 0; j < poly.contour_size(i); ++j ) { Point3D tmp = poly.get_pt(i, j); - printf(" %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + snprintf(buf, 119, " %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + SG_LOG(SG_GENERAL, SG_DEBUG, buf); } } @@ -606,7 +608,8 @@ void build_airport( string airport_id, float alt_m, for ( i = 0; i < poly.contours(); ++i ) { for ( j = 0; j < poly.contour_size(i); ++j ) { Point3D tmp = poly.get_pt(i, j); - printf(" %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + snprintf(buf, 119, " %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + SG_LOG(SG_GENERAL, SG_DEBUG, buf); } } @@ -617,7 +620,8 @@ void build_airport( string airport_id, float alt_m, for ( i = 0; i < poly.contours(); ++i ) { for ( j = 0; j < poly.contour_size(i); ++j ) { Point3D tmp = poly.get_pt(i, j); - printf(" %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + snprintf(buf, 119, " %.7f %.7f %.7f\n", tmp.x(), tmp.y(), tmp.z() ); + SG_LOG(SG_GENERAL, SG_DEBUG, buf); } } @@ -649,7 +653,7 @@ void build_airport( string airport_id, float alt_m, tmp_nodes.unique_add( divided_base.get_pt(i, j) ); } } - + #if 0 // dump info for debugging purposes point_list ttt = tmp_nodes.get_node_list(); @@ -704,12 +708,12 @@ void build_airport( string airport_id, float alt_m, rwy_polys[k].set_poly( poly ); } - SG_LOG(SG_GENERAL, SG_INFO, "add nodes base "); - cout << " before: " << base_poly << endl; - cout << " tmp_nodes size = " << tmp_nodes.get_node_list().size() << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "add nodes base "); + SG_LOG(SG_GENERAL, SG_DEBUG, " before: " << base_poly); + SG_LOG(SG_GENERAL, SG_DEBUG, " tmp_nodes size = " << tmp_nodes.get_node_list().size()); base_poly = add_nodes_to_poly( base_poly, tmp_nodes ); - cout << " after adding tmp_nodes: " << base_poly << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, " after adding tmp_nodes: " << base_poly); // write_polygon( base_poly, "base-add" ); SG_LOG(SG_GENERAL, SG_DEBUG, "remove dups base "); @@ -717,12 +721,12 @@ void build_airport( string airport_id, float alt_m, SG_LOG(SG_GENERAL, SG_DEBUG, "remove bad contours base"); base_poly = remove_bad_contours( base_poly ); // write_polygon( base_poly, "base-fin" ); - cout << " after clean up: " << base_poly << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, " after clean up: " << base_poly); // tesselate the polygons and prepair them for final output for ( i = 0; i < (int)rwy_polys.size(); ++i ) { - SG_LOG(SG_GENERAL, SG_INFO, "Tesselating section = " << i); + SG_LOG(SG_GENERAL, SG_DEBUG, "Tesselating section = " << i); TGPolygon poly = rwy_polys[i].get_poly(); SG_LOG(SG_GENERAL, SG_DEBUG, "total size before = " << poly.total_size()); @@ -933,14 +937,14 @@ void build_airport( string airport_id, float alt_m, max_deg.setlat( max_deg.lat() + 0.1 * dlat ); TGAptSurface apt_surf( root, elev_src, min_deg, max_deg ); - cout << "Surface created" << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "Surface created"); // calculate node elevations point_list geod_nodes = calc_elevations( apt_surf, nodes.get_node_list(), 0.0 ); divided_base = calc_elevations( apt_surf, divided_base, 0.0 ); - cout << "DIVIDED" << endl; - cout << divided_base << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "DIVIDED"); + SG_LOG(SG_GENERAL, SG_DEBUG, divided_base); SG_LOG(SG_GENERAL, SG_DEBUG, "Done with base calc_elevations()"); @@ -1078,7 +1082,7 @@ void build_airport( string airport_id, float alt_m, } } elevation_map[flag] = max; - SG_LOG( SG_GENERAL, SG_INFO, flag << " max = " << max ); + SG_LOG( SG_GENERAL, SG_DEBUG, flag << " max = " << max ); } } @@ -1199,4 +1203,6 @@ void build_airport( string airport_id, float alt_m, // write_boundary( holepath, b, hull, poly_index ); tgSplitPolygon( holepath, HoleArea, divided_base, true ); tgSplitPolygon( holepath, AirportArea, apt_clearing, false ); + } + diff --git a/src/Airports/GenAirports/lights.cxx b/src/Airports/GenAirports/lights.cxx index 8888da9a..b6b96a3d 100644 --- a/src/Airports/GenAirports/lights.cxx +++ b/src/Airports/GenAirports/lights.cxx @@ -26,6 +26,7 @@ #include #include +#include #include "lights.hxx" @@ -59,14 +60,14 @@ static Point3D gen_runway_light_vector( const TGRunway& rwy_info, } Point3D cart1 = sgGeodToCart( end1 * SG_DEGREES_TO_RADIANS ); Point3D cart2 = sgGeodToCart( end2 * SG_DEGREES_TO_RADIANS ); - cout << "cart1 = " << cart1 << " cart2 = " << cart2 << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "cart1 = " << cart1 << " cart2 = " << cart2); Point3D up = cart1; length = up.distance3D( Point3D(0.0) ); up = up / length; Point3D rwy_vec = cart2 - cart1; - cout << "rwy_vec = " << rwy_vec << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "rwy_vec = " << rwy_vec); // angle up specified amount length = rwy_vec.distance3D( Point3D(0.0) ); @@ -2567,8 +2568,8 @@ static superpoly_list gen_malsx( const TGRunway& rwy_info, void gen_runway_lights( const TGRunway& rwy_info, float alt_m, superpoly_list &lights ) { - cout << "gen runway lights " << rwy_info.rwy_no << " " - << rwy_info.end1_flags << " " << rwy_info.end2_flags << endl;; + SG_LOG(SG_GENERAL, SG_DEBUG, "gen runway lights " << rwy_info.rwy_no << " " + << rwy_info.end1_flags << " " << rwy_info.end2_flags); unsigned int i; @@ -2895,8 +2896,8 @@ void gen_runway_lights( const TGRunway& rwy_info, float alt_m, void gen_taxiway_lights( const TGRunway& taxiway_info, float alt_m, superpoly_list &lights ) { - cout << "gen taxiway lights " << taxiway_info.rwy_no << " " - << taxiway_info.end1_flags << " " << taxiway_info.end2_flags << endl;; + SG_LOG(SG_GENERAL, SG_DEBUG, "gen taxiway lights " << taxiway_info.rwy_no << " " + << taxiway_info.end1_flags << " " << taxiway_info.end2_flags); unsigned int i; diff --git a/src/Airports/GenAirports/main.cxx b/src/Airports/GenAirports/main.cxx index 8dacb539..8d5c934c 100644 --- a/src/Airports/GenAirports/main.cxx +++ b/src/Airports/GenAirports/main.cxx @@ -61,9 +61,47 @@ int nudge = 10; static void usage( int argc, char **argv ) { SG_LOG(SG_GENERAL, SG_ALERT, "Usage " << argv[0] << " --input= " - << "--work= [ --start-id=abcd ] [ --nudge=n ]" - << "[--min-lon=] [--max-lon=] [--min-lat=] [--max-lat=]" - << "[--chunk=]"); + << "--work= [ --start-id=abcd ] [ --nudge=n ] " + << "[--min-lon=] [--max-lon=] [--min-lat=] [--max-lat=] " + << "[ --airport=abcd ] [--tile=] [--chunk=] [--verbose] [--help]"); +} + +// Display help and usage +static void help( int argc, char **argv ) { + cout << "genapts generates airports for use in generating scenery for the FlightGear flight simulator. "; + cout << "Airport, runway, and taxiway vector data and attributes are input, and generated 3D airports "; + cout << "are output for further processing by the TerraGear scenery creation tools. "; + cout << "\n\n"; + cout << "The standard input file is runways.dat.gz which is found in $FG_ROOT/Airports. "; + cout << "This file is periodically generated for the FlightGear project by Robin Peel, who "; + cout << "maintains an airport database for both the X-Plane and FlightGear simulators. "; + cout << "The format of this file is documented on the FlightGear web site. "; + cout << "Any other input file corresponding to this format may be used as input to genapts. "; + cout << "Input files may be gzipped or left as plain text as required. "; + cout << "\n\n"; + cout << "Processing all the world's airports takes a *long* time. To cut down processing time "; + cout << "when only some airports are required, you may refine the input selection either by airport "; + cout << "or by area. By airport, either one airport can be specified using --airport=abcd, where abcd is "; + cout << "a valid airport code eg. --airport-id=KORD, or a starting airport can be specified using --start-id=abcd "; + cout << "where once again abcd is a valid airport code. In this case, all airports in the file subsequent to the "; + cout << "start-id are done. This is convienient when re-starting after a previous error. "; + cout << "\nAn input area may be specified by lat and lon extent using min and max lat and lon. "; + cout << "Alternatively, you may specify a chunk (10 x 10 degrees) or tile (1 x 1 degree) using a string "; + cout << "such as eg. w080n40, e000s27. "; + cout << "\nAn input file containing only a subset of the world's "; + cout << "airports may of course be used."; + cout << "\n\n"; + cout << "It is necessary to generate the elevation data for the area of interest PRIOR TO GENERATING THE AIRPORTS. "; + cout << "Failure to do this will result in airports being generated with an elevation of zero. "; + cout << "The following subdirectories of the work-dir will be searched for elevation files:\n\n"; + cout << "SRTM-United_States-1\n"; + cout << "SRTM-North_America-3\n"; + cout << "SRTM-South_America-3\n"; + cout << "SRTM-Eurasia-3\n"; + cout << "DEM-USGS-3\n"; + cout << "SRTM-30"; + cout << "\n\n"; + usage( argc, argv ); } @@ -85,6 +123,7 @@ int main( int argc, char **argv ) { string work_dir = ""; string input_file = ""; string start_id = ""; + string airport_id = ""; int arg_pos; for (arg_pos = 1; arg_pos < argc; arg_pos++) { string arg = argv[arg_pos]; @@ -113,12 +152,27 @@ int main( int argc, char **argv ) { min_lat = rectangle.getMin().y(); max_lon = rectangle.getMax().x(); max_lat = rectangle.getMax().y(); + } else if ( arg.find("--tile=") == 0 ) { + tg::Rectangle rectangle = tg::parseTile(arg.substr(7).c_str()); + min_lon = rectangle.getMin().x(); + min_lat = rectangle.getMin().y(); + max_lon = rectangle.getMax().x(); + max_lat = rectangle.getMax().y(); + } else if ( arg.find("--airport=") == 0 ) { + airport_id = arg.substr(10).c_str(); + ready_to_go = false; + } else if ( (arg.find("--verbose") == 0) || (arg.find("-v") == 0) ) { + sglog().setLogLevels( SG_GENERAL, SG_BULK ); + } else if ( (arg.find("--help") == 0) || (arg.find("-h") == 0) ) { + help( argc, argv ); + exit(-1); } else { usage( argc, argv ); exit(-1); } } + // Please update the help near the top of this file if you update this list. elev_src.push_back( "SRTM-United_States-1" ); elev_src.push_back( "SRTM-North_America-3" ); elev_src.push_back( "SRTM-South_America-3" ); @@ -183,7 +237,7 @@ int main( int argc, char **argv ) { while ( ! in.eof() ) { in.getline(tmp, 2048); line = tmp; - SG_LOG( SG_GENERAL, SG_INFO, "-> " << line ); + SG_LOG( SG_GENERAL, SG_DEBUG, "-> " << line ); if ( line.length() == 0 ) { // empty, skip @@ -199,7 +253,7 @@ int main( int argc, char **argv ) { sscanf( line.c_str(), "%c %s %d", &ctmp, tmpid, &elev ); id = tmpid; - SG_LOG( SG_GENERAL, SG_INFO, "Airport = " << id << " " + SG_LOG( SG_GENERAL, SG_DEBUG, "Next airport = " << id << " " << elev ); if ( !last_apt_id.empty()) { @@ -211,7 +265,9 @@ int main( int argc, char **argv ) { if ( lon >= min_lon && lon <= max_lon && lat >= min_lat && lat <= max_lat ) { - if ( start_id.length() && start_id == last_apt_id ) { + if ( airport_id.length() && airport_id == last_apt_id ) { + ready_to_go = true; + } else if ( start_id.length() && start_id == last_apt_id ) { ready_to_go = true; } @@ -237,9 +293,12 @@ int main( int argc, char **argv ) { << e.getMessage() ); exit(-1); } + if(airport_id.length()) ready_to_go = false; } } else { - SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id); + if(!airport_id.length()) { + SG_LOG(SG_GENERAL, SG_INFO, "Skipping airport " << id); + } } } last_apt_id = id; diff --git a/src/Airports/GenAirports/poly_extra.cxx b/src/Airports/GenAirports/poly_extra.cxx index 81dfbda2..a5bac67d 100644 --- a/src/Airports/GenAirports/poly_extra.cxx +++ b/src/Airports/GenAirports/poly_extra.cxx @@ -41,8 +41,10 @@ void add_intermediate_nodes( int contour, const Point3D& start, point_list nodes = tmp_nodes.get_node_list(); // SG_LOG(SG_GENERAL, SG_DEBUG, " add_intermediate_nodes()"); - printf(" %.7f %.7f %.7f <=> %.7f %.7f %.7f\n", + char buf[200]; + snprintf(buf, 199, " %.7f %.7f %.7f <=> %.7f %.7f %.7f\n", start.x(), start.y(), start.z(), end.x(), end.y(), end.z() ); + SG_LOG(SG_GENERAL, SG_BULK, buf); Point3D new_pt; @@ -56,7 +58,7 @@ void add_intermediate_nodes( int contour, const Point3D& start, result ); result->add_node( contour, new_pt ); - cout << " adding = " << new_pt << endl; + SG_LOG(SG_GENERAL, SG_BULK, " adding = " << new_pt); add_intermediate_nodes( contour, new_pt, end, tmp_nodes, result ); diff --git a/src/Airports/GenAirports/rwy_visual.cxx b/src/Airports/GenAirports/rwy_visual.cxx index e9eefcc4..caa6af99 100644 --- a/src/Airports/GenAirports/rwy_visual.cxx +++ b/src/Airports/GenAirports/rwy_visual.cxx @@ -385,7 +385,7 @@ void gen_visual_rwy( const TGRunway& rwy_info, while ( end1_pct < 1.0 ) { start1_pct = end1_pct; end1_pct = start1_pct + rest1_inc; - cout << "start1 = " << start1_pct << " end1 = " << end1_pct << endl; + SG_LOG(SG_GENERAL, SG_DEBUG, "start1 = " << start1_pct << " end1 = " << end1_pct); gen_runway_section( rwy_info, runway_a, start1_pct, end1_pct, diff --git a/src/BuildTiles/Osgb36/osgb36.hxx b/src/BuildTiles/Osgb36/osgb36.hxx index 04b20470..18356701 100644 --- a/src/BuildTiles/Osgb36/osgb36.hxx +++ b/src/BuildTiles/Osgb36/osgb36.hxx @@ -19,10 +19,14 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -#include +#include + +#include STL_IOSTREAM #include #include +SG_USING_STD(cout); +SG_USING_STD(endl); //******************************************************************* // diff --git a/src/BuildTiles/Parallel/server.cxx b/src/BuildTiles/Parallel/server.cxx index 73ce5247..5914b9d6 100644 --- a/src/BuildTiles/Parallel/server.cxx +++ b/src/BuildTiles/Parallel/server.cxx @@ -5,6 +5,11 @@ #include #endif +#include + +#include STL_IOSTREAM +#include STL_STRING + #include #include #include // FD_ISSET(), etc. @@ -18,11 +23,6 @@ #include #include -#include - -#include STL_IOSTREAM -#include STL_STRING - #include SG_USING_STD( cout ); diff --git a/src/Lib/Geometry/poly_support.cxx b/src/Lib/Geometry/poly_support.cxx index b92cbb0e..59fecdf6 100644 --- a/src/Lib/Geometry/poly_support.cxx +++ b/src/Lib/Geometry/poly_support.cxx @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -140,10 +141,10 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, } } - cout << "min node index = " << min_node_index << endl; - cout << "min index = " << min_index - << " value = " << trinodes.get_node( min_index ) - << " == " << min << endl; + //cout << "min node index = " << min_node_index << endl; + //cout << "min index = " << min_index + //<< " value = " << trinodes.get_node( min_index ) + //<< " == " << min << endl; // 2. take midpoint, m, of min with neighbor having lowest // fabs(slope) @@ -175,7 +176,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, m.setx( (min.x() + ln.x()) / 2.0 ); m.sety( (min.y() + ln.y()) / 2.0 ); - cout << "low mid point = " << m << endl; + //cout << "low mid point = " << m << endl; // 3. intersect vertical line through m and all other segments of // all other contours of this polygon. save point, p3, with @@ -184,7 +185,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, p3.sety(100); for ( i = 0; i < (int)p.contours(); ++i ) { - cout << "contour = " << i << " size = " << p.contour_size( i ) << endl; + //cout << "contour = " << i << " size = " << p.contour_size( i ) << endl; for ( int j = 0; j < (int)(p.contour_size( i ) - 1); ++j ) { // cout << " p1 = " << poly[i][j] << " p2 = " // << poly[i][j+1] << endl; @@ -194,7 +195,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, p2_index = trinodes.find( p2 ); if ( intersects(p1, p2, m.x(), &result) ) { - cout << "intersection = " << result << endl; + //cout << "intersection = " << result << endl; if ( ( result.y() < p3.y() ) && ( result.y() > m.y() ) && !( base_leg == TGTriSeg(p1_index, p2_index, 0) ) ) { @@ -209,7 +210,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, p1_index = trinodes.find( p1 ); p2_index = trinodes.find( p2 ); if ( intersects(p1, p2, m.x(), &result) ) { - cout << "intersection = " << result << endl; + //cout << "intersection = " << result << endl; if ( ( result.y() < p3.y() ) && ( result.y() > m.y() ) && !( base_leg == TGTriSeg(p1_index, p2_index, 0) ) ) { @@ -218,7 +219,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, } } if ( p3.y() < 100 ) { - cout << "low intersection of other segment = " << p3 << endl; + //cout << "low intersection of other segment = " << p3 << endl; inside_pt = Point3D( (m.x() + p3.x()) / 2.0, (m.y() + p3.y()) / 2.0, 0.0 ); @@ -229,7 +230,7 @@ Point3D calc_point_inside_old( const TGPolygon& p, const int contour, // 4. take midpoint of p2 && m as an arbitrary point inside polygon - cout << "inside point = " << inside_pt << endl; + //cout << "inside point = " << inside_pt << endl; return inside_pt; } @@ -375,7 +376,7 @@ void polygon_tesselate( const TGPolygon &p, string tri_options; tri_options = "pzYYenQ"; // add multiple "V" entries for verbosity - cout << "Triangulation with options = " << tri_options << endl; + //cout << "Triangulation with options = " << tri_options << endl; triangulate( (char *)tri_options.c_str(), &in, &out, &vorout ); @@ -456,8 +457,8 @@ TGPolygon polygon_tesselate_alt( TGPolygon &p ) { // inside any other contour calc_points_inside( p ); for ( i = 0; i < p.contours(); ++i ) { - cout << "final point inside =" << p.get_point_inside( i ) - << endl; + //cout << "final point inside =" << p.get_point_inside( i ) + // << endl; } // 2. Do a final triangulation of the entire polygon @@ -501,13 +502,13 @@ static void contour_tesselate( TGContourNode *node, const TGPolygon &p, // list of points int contour_num = node->get_contour_num(); - cout << "Tesselating contour = " << contour_num << endl; + //cout << "Tesselating contour = " << contour_num << endl; point_list contour = p.get_contour( contour_num ); double max_x = contour[0].x(); int total_pts = contour.size(); - cout << "contour = " << contour_num << " nodes = " << total_pts << endl; + //cout << "contour = " << contour_num << " nodes = " << total_pts << endl; #if 0 // testing ... don't enable this if not testing @@ -654,7 +655,7 @@ static void contour_tesselate( TGContourNode *node, const TGPolygon &p, string tri_options; tri_options = "pzYYenQ"; // add multiple "V" entries for verbosity - cout << "Triangulation with options = " << tri_options << endl; + //cout << "Triangulation with options = " << tri_options << endl; triangulate( (char *)tri_options.c_str(), &in, &out, &vorout ); @@ -790,13 +791,13 @@ static Point3D point_inside_contour( TGContourNode *node, const TGPolygon &p ) { } // find center point of largest triangle - cout << "biggest = " << biggest + 1 << " out of " << elelist.size() << endl; + //cout << "biggest = " << biggest + 1 << " out of " << elelist.size() << endl; TGTriEle t = elelist[biggest]; contour_num = node->get_contour_num(); Point3D p1 = out_pts[ t.get_n1() ]; Point3D p2 = out_pts[ t.get_n2() ]; Point3D p3 = out_pts[ t.get_n3() ]; - cout << "hole tri = " << p1 << endl << " " << p2 << endl << " " << p3 << endl; + //cout << "hole tri = " << p1 << endl << " " << p2 << endl << " " << p3 << endl; // new Point3D center = ( p1 + p2 + p3 ) / 3; @@ -818,8 +819,8 @@ static void calc_point_inside( TGContourNode *node, TGPolygon &p ) { int contour_num = node->get_contour_num(); if ( contour_num >= 0 ) { Point3D pi = point_inside_contour( node, p ); - cout << endl << "point inside(" << contour_num << ") = " << pi - << endl << endl; + //cout << endl << "point inside(" << contour_num << ") = " << pi + // << endl << endl; p.set_point_inside( contour_num, pi ); } } @@ -842,8 +843,8 @@ static void build_contour_tree( TGContourNode *node, const TGPolygon &p, int_list &avail ) { - cout << "working on contour = " << node->get_contour_num() << endl; - cout << " total contours = " << p.contours() << endl; + //cout << "working on contour = " << node->get_contour_num() << endl; + //cout << " total contours = " << p.contours() << endl; TGContourNode *tmp; int i; @@ -854,12 +855,12 @@ static void build_contour_tree( TGContourNode *node, } else { flag = true; } - cout << " hole flag = " << flag << endl; + //cout << " hole flag = " << flag << endl; // add all remaining hole/non-hole contours as children of the // current node if they are inside of it. for ( i = 0; i < p.contours(); ++i ) { - cout << " testing contour = " << i << endl; + //cout << " testing contour = " << i << endl; if ( p.get_hole_flag( i ) != flag ) { // only holes can be children of non-holes and visa versa if ( avail[i] ) { @@ -868,24 +869,24 @@ static void build_contour_tree( TGContourNode *node, if ( (cur_contour < 0 ) || p.is_inside( i, cur_contour ) ) { // must be inside the parent (or if the parent is // the root, add all available non-holes. - cout << " adding contour = " << i << endl; + //cout << " adding contour = " << i << endl; avail[i] = 0; tmp = new TGContourNode( i ); node->add_kid( tmp ); } else { - cout << " not inside" << endl; + //cout << " not inside" << endl; } } else { - cout << " not available" << endl; + //cout << " not available" << endl; } } else { - cout << " wrong hole/non-hole type" << endl; + //cout << " wrong hole/non-hole type" << endl; } } // if any of the children are inside of another child, remove the // inside one - cout << "node now has num kids = " << node->get_num_kids() << endl; + //cout << "node now has num kids = " << node->get_num_kids() << endl; for ( i = 0; i < node->get_num_kids(); ++i ) { for ( int j = 0; j < node->get_num_kids(); ++j ) { @@ -901,8 +902,8 @@ static void build_contour_tree( TGContourNode *node, // need to remove contour j from the kid list avail[ node->get_kid( i ) -> get_contour_num() ] = 1; node->remove_kid( i ); - cout << "removing contour " << A - << " which is inside of contour " << B << endl; + //cout << "removing contour " << A + // << " which is inside of contour " << B << endl; continue; } } else { @@ -940,7 +941,7 @@ void calc_points_inside( TGPolygon& p ) { // recursively build the tree build_contour_tree( ct, p, avail ); - print_contour_tree( ct, "" ); + //print_contour_tree( ct, "" ); // recurse the tree and build up the point inside list for each // contour/hole @@ -1011,7 +1012,7 @@ snap (const Point3D &p, double grid_size) result.setx(snap(p.x(), grid_size)); result.sety(snap(p.y(), grid_size)); result.setz(snap(p.z(), grid_size)); - cout << result << endl; + //cout << result << endl; return result; } @@ -1167,7 +1168,7 @@ static point_list reduce_contour_degeneracy( const point_list& contour ) { while ( !done ) { // traverse the contour until we find the first bad node or // hit the end of the contour - cout << " ... not done ... " << endl; + //cout << " ... not done ... " << endl; bool bad = false; int i = 0; @@ -1231,10 +1232,10 @@ static point_list remove_contour_cycles( const point_list& contour ) { result.push_back( contour[i] ); for ( unsigned int j = i + 1; j < contour.size(); ++j ) { if ( contour[i] == contour[j] && i + 2 > j ) { - cout << "detected a small cycle: i = " - << i << " j = " << j << endl; + //cout << "detected a small cycle: i = " + // << i << " j = " << j << endl; for ( unsigned int k = i; k <= j; ++k ) { - cout << " " << contour[k] << endl; + //cout << " " << contour[k] << endl; } // i = j; } @@ -1275,7 +1276,7 @@ TGPolygon remove_bad_contours( const TGPolygon &poly ) { int flag = poly.get_hole_flag( i ); result.add_contour( contour, flag ); } else { - cout << "tossing a bad contour" << endl; + //cout << "tossing a bad contour" << endl; } } diff --git a/src/Lib/Geometry/rectangle.hxx b/src/Lib/Geometry/rectangle.hxx index d24cafb1..be79c7c3 100644 --- a/src/Lib/Geometry/rectangle.hxx +++ b/src/Lib/Geometry/rectangle.hxx @@ -19,7 +19,7 @@ namespace tg { /** - * A simple rectangle class for bounding rectanglees. + * A simple rectangle class for bounding rectangles. * * The class defines a rectangle in by the vertices of its minimum and * maximum corners, ignoring any z coordinates. There are methods to diff --git a/src/Lib/Geometry/util.cxx b/src/Lib/Geometry/util.cxx index 5f90bfb2..3447344a 100644 --- a/src/Lib/Geometry/util.cxx +++ b/src/Lib/Geometry/util.cxx @@ -175,7 +175,7 @@ makeBounds (const TGPolygon &polygon) Rectangle -parseChunk (const string &s) +parseChunk (const string &s, double delta) { Rectangle bounds; int x_factor; @@ -203,11 +203,17 @@ parseChunk (const string &s) double x = atoi(s.substr(1,3).c_str()) * x_factor; double y = atoi(s.substr(5).c_str()) * y_factor; bounds.setMin(Point3D(x, y, 0)); - bounds.setMax(Point3D(x + 10, y + 10, 0)); + bounds.setMax(Point3D(x + delta, y + delta, 0)); return bounds; } +Rectangle +parseTile (const string &s) +{ + return( parseChunk(s, 1.0) ); +} + }; // end of util.cxx diff --git a/src/Lib/Geometry/util.hxx b/src/Lib/Geometry/util.hxx index d8b49ec7..887f753f 100644 --- a/src/Lib/Geometry/util.hxx +++ b/src/Lib/Geometry/util.hxx @@ -104,12 +104,23 @@ Rectangle makeBounds (const TGPolygon &polygon); /** * Parse a chunk string (like "w080n40") into a rectangle. + * Defaults to 10 x 10 degrees. * * @param s The string. * @return A rectangle containing the bounds. */ -Rectangle parseChunk (const string &s); +Rectangle parseChunk (const string &s, double delta = 10.0); -}; + +/** + * Parse a tile string (like "w080n41") into a 1x1 degree rectangle. + * + * @param s The string. + * @return A rectangle containing the bounds. + */ +Rectangle parseTile (const string &s); + + +}; // namespace tg #endif // __UTIL_HXX diff --git a/src/Lib/Polygon/split-bin.cxx b/src/Lib/Polygon/split-bin.cxx index 424e7bf7..2da0d0e6 100644 --- a/src/Lib/Polygon/split-bin.cxx +++ b/src/Lib/Polygon/split-bin.cxx @@ -176,15 +176,15 @@ void tgSplitPolygon( const string& path, AreaType area, // get next polygon index index = poly_index_next(); - SG_LOG( SG_GENERAL, SG_INFO, " min = " << min << " max = " << max ); + SG_LOG( SG_GENERAL, SG_DEBUG, " min = " << min << " max = " << max ); // find buckets for min, and max points of convex hull. // note to self: self, you should think about checking for // polygons that span the date line SGBucket b_min( min.x(), min.y() ); SGBucket b_max( max.x(), max.y() ); - SG_LOG( SG_GENERAL, SG_INFO, " Bucket min = " << b_min ); - SG_LOG( SG_GENERAL, SG_INFO, " Bucket max = " << b_max ); + SG_LOG( SG_GENERAL, SG_DEBUG, " Bucket min = " << b_min ); + SG_LOG( SG_GENERAL, SG_DEBUG, " Bucket max = " << b_max ); if ( b_min == b_max ) { // shape entirely contained in a single bucket, write and bail @@ -198,7 +198,7 @@ void tgSplitPolygon( const string& path, AreaType area, sgBucketDiff(b_min, b_max, &dx, &dy); SG_LOG( SG_GENERAL, SG_INFO, " polygon spans tile boundaries" ); - SG_LOG( SG_GENERAL, SG_INFO, " dx = " << dx + SG_LOG( SG_GENERAL, SG_DEBUG, " dx = " << dx << " dy = " << dy ); if ( (dx > 2880) || (dy > 1440) ) @@ -245,7 +245,7 @@ void tgSplitPolygon( const string& path, AreaType area, // structures to reduce memory use) // - SG_LOG ( SG_GENERAL, SG_INFO, + SG_LOG ( SG_GENERAL, SG_DEBUG, "Generating bottom half (" << min.y() << "-" << clip_line << ")" ); @@ -274,7 +274,7 @@ void tgSplitPolygon( const string& path, AreaType area, // structures to reduce memory use) // - SG_LOG ( SG_GENERAL, SG_INFO, + SG_LOG ( SG_GENERAL, SG_DEBUG, "Generating top half (" << clip_line << "-" << max.y() << ")" ); diff --git a/src/Prep/Photo/findcorners.cxx b/src/Prep/Photo/findcorners.cxx index b6dc6e95..13885aa7 100644 --- a/src/Prep/Photo/findcorners.cxx +++ b/src/Prep/Photo/findcorners.cxx @@ -42,7 +42,7 @@ int main( int argc, char **argv ) { int dx = xrwy2 - xrwy1; int dy = yrwy2 - yrwy1; cout << "dx = " << dx << " dy = " << dy << endl; - double distp = sqrt( dx*dx + dy*dy ); + double distp = sqrt( double(dx*dx + dy*dy) ); cout << "runway distance (pixels) = " << distp << endl; // find pixel resolution @@ -52,7 +52,7 @@ int main( int argc, char **argv ) { cout << "pixel per feet = " << feet_to_pixel << endl; // find runway angle in image space - double img_angle = atan2( dy, dx ); + double img_angle = atan2( double(dy), double(dx) ); cout << "runway angle in image space = " << img_angle * SGD_RADIANS_TO_DEGREES << endl; // angle offset diff --git a/src/Prep/TGVPF/tgvpf.cxx b/src/Prep/TGVPF/tgvpf.cxx index d4c86685..9e39cc30 100644 --- a/src/Prep/TGVPF/tgvpf.cxx +++ b/src/Prep/TGVPF/tgvpf.cxx @@ -218,17 +218,18 @@ usage () << " [opts] " << endl; cerr << "Options:" << endl; - cerr << "--chunk= (default: none)" << endl; + cerr << "--tile= (default: none)" << endl; + cerr << "--chunk= (default: none)" << endl; cerr << "--min-lon= (default: -180.0)" << endl; - cerr << "--min-lat= (default: -90.0)" << endl; + cerr << "--min-lat= (default: -90.0)" << endl; cerr << "--max-lon= (default: 180.0)" << endl; - cerr << "--max-lat= (default: 90.0)" << endl; - cerr << "--min-area= (default: none)" << endl; - cerr << "--max-area= (default: none)" << endl; + cerr << "--max-lat= (default: 90.0)" << endl; + cerr << "--min-area= (default: none)" << endl; + cerr << "--max-area= (default: none)" << endl; cerr << "--material= (default: Default)" << endl; - cerr << "--width= (default: 50 line, 500 point)" << endl; - cerr << "--work-dir= (default: .)" << endl; - cerr << "--att=: (may be repeated)" << endl; + cerr << "--width= (default: 50 line, 500 point)" << endl; + cerr << "--work-dir= (default: .)" << endl; + cerr << "--att=: (may be repeated)" << endl; cerr << "--att=!: (may be repeated)" << endl; exit(2); } @@ -294,8 +295,13 @@ main (int argc, const char **argv) int argPos = 1; while (argPos < argc) { string arg = argv[argPos]; + + if (arg.find("--tile=") == 0) { + bounds = tg::parseTile(arg.substr(7)); + argPos++; + } - if (arg.find("--chunk=") == 0) { + else if (arg.find("--chunk=") == 0) { bounds = tg::parseChunk(arg.substr(8)); argPos++; }