/** * Given a distance and a center lat,lon this will return the bounding lat,lon * rect. * * The distance is the distance across the entire rectangle (i.e. width and * height). */ QRectF MosaicAreaTool::calcLatLonRange(QPointF centerLatLon, Distance size) { Distance distanceFromCenter = size / 2.0; QRectF latLonBoundingBox; Angle centerLat(centerLatLon.y(), Angle::Degrees); Angle centerLon(centerLatLon.x(), Angle::Degrees); TProjection *tproj = (TProjection *) getWidget()->getProjection(); if (tproj) { bool longitudeWraps = false; Distance radius(tproj->LocalRadius(centerLat.degrees()), Distance::Meters); // First we can get the angle between the latitudes... // d = arcsin ( movementDistance / radiusDistance ) Angle deltaLat(asin( distanceFromCenter / radius ), Angle::Radians); latLonBoundingBox.setTop( (centerLat - deltaLat).degrees() ); if (latLonBoundingBox.top() < -90 && centerLatLon.y() != -90) { // Block infinite recursion if (centerLatLon.y() != 90) { qWarning("The pole is included in the area but not centered"); centerLatLon.setY(-90); return calcLatLonRange(centerLatLon, size); } else return QRectF(); } else if (centerLatLon.y() == -90) { longitudeWraps = true; } latLonBoundingBox.setBottom( (centerLat + deltaLat).degrees() ); if (latLonBoundingBox.bottom() > 90 && centerLatLon.y() != 90) { // Block infinite recursion if (centerLatLon.y() != -90) { qWarning("The pole is included in the area but not centered"); centerLatLon.setY(90); return calcLatLonRange(centerLatLon, size); } else return QRectF(); } else if (centerLatLon.y() == 90) { longitudeWraps = true; } // Now let's do lons... Angle widestLat( asin( sin(centerLat.radians()) / cos( distanceFromCenter / radius ) ), Angle::Radians); double valueToASin = sin(distanceFromCenter / radius) / cos(widestLat.radians()); if(valueToASin < -1 || valueToASin > 1) longitudeWraps = true; // Longitude wraps if (longitudeWraps) { if (tproj->Has360Domain()) { latLonBoundingBox.setLeft( 0 ); latLonBoundingBox.setRight( 360 ); } else { latLonBoundingBox.setLeft( -180 ); latLonBoundingBox.setRight( 180 ); } } else { Angle deltaLon( asin( sin(distanceFromCenter / radius) / cos(widestLat.radians())), Angle::Radians); latLonBoundingBox.setLeft( (centerLon - deltaLon).degrees() ); latLonBoundingBox.setRight( (centerLon + deltaLon).degrees() ); } } return latLonBoundingBox; }
void proj15::setParamNames( const int projNumber ) { projName m_name; setName( m_name.projectionName( projNumber ) ); setTrueName( m_projName ); switch( projNumber ) { case 0: //"Geographic:" case 2: // "State Plane": break; case 1: //"UTM": setParamName( 0, lonZ( 0 ) ); setParamName( 1, latZ( 1 ) ); break; case 3: //"Albers Equal Area:" case 4: //"Lambert Conformal Conic": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 2, stdPR1() ); setParamName( 3, stdPR2() ); setParamName( 4, centMer() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 5: //"Mercator": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 4, centMer() ); setParamName( 5, trueScale() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 6: //"Polar Stereographic": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 4, longPol() ); setParamName( 5, trueScale() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 7: //"Polyconic": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 4, centMer() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 8: //"Equidistant Conic A\\B": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 4, centMer() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); if( getParamValue( 8 ) == 1 ) { setTrueName( "Equidistant Conic B" ); setParamName( 2, stdPR1() ); setParamName( 3, stdPR2() ); } else { setTrueName( "Equidistant Conic A" ); setParamName( 2, stdPAR() ); } break; case 9: //"Transverse Mercator": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 2, factor() ); setParamName( 4, centMer() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 10: //"Stereographic": setParamName( 0, sphere( 0 ) ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 11: //"Lambert Azimuthal": setParamName( 0, sphere( 0 ) ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 12: //"Azimuthal": setParamName( 0, sphere( 0 ) ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 13: //"Gnomonic": setParamName( 0, sphere( 0 ) ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 14: //"Orthographic": setParamName( 0, sphere( 0 ) ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 15: //"Gen. Vert. Near Per": setParamName( 0, sphere( 0 ) ); setParamName( 2, height() ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 16: //"Sinusiodal": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 17: //"Equirectangular": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 5, trueScale() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 18: //"Miller Cylindrical": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 19: //"Van der Grinten": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 20: //"Hotine Oblique Merc A\\B": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 2, factor() ); setParamName( 5, originLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); if( getParamValue( 12 ) == 1 ) { setTrueName( "Hotine Oblique Merc B" ); setParamName( 3, aziAng() ); setParamName( 4, azmthPt() ); } else { setTrueName( "Hotine Oblique Merc A" ); setParamName( 8, long1() ); setParamName( 9, lat1() ); setParamName( 10, long2() ); setParamName( 11, lat2() ); } break; case 21: //"Robinson": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 22: //"Space Oblique Merc A\\B": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 6, FE() ); setParamName( 7, FN() ); if( getParamValue( 12 ) == 1 ) { setTrueName( "Space Oblique Merc B" ); setParamName( 2, satNum() ); setParamName( 3, path( 3 ) ); } else { setTrueName( "Space Oblique Merc A" ); setParamName( 3, incAng() ); setParamName( 4, ascLong() ); setParamName( 8, psRev() ); setParamName( 9, lRat() ); setParamName( 10, pFlag( 10 ) ); } break; case 23: //"Alaska Conformal": setParamName( 0, semiMajor( 0 ) ); setParamName( 1, semiMinor( 1 ) ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 24: //"Interrupted Goode": setParamName( 0, sphere( 0 ) ); break; case 25: //"Mollweide": setParamName( 0, sphere( 0 ) ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 26: //"Interrupted Mollweide": setParamName( 0, sphere( 0 ) ); break; case 27: //"Hammer": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 28: //"Wagner IV": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 29: //"Wagner VII": setParamName( 0, sphere( 0 ) ); setParamName( 4, centMer() ); setParamName( 6, FE() ); setParamName( 7, FN() ); break; case 30: //"Oblated Equal Area": setParamName( 0, sphere( 0 ) ); setParamName( 2, shapeM() ); setParamName( 3, shapeN() ); setParamName( 4, centLon() ); setParamName( 5, centerLat() ); setParamName( 6, FE() ); setParamName( 7, FN() ); setParamName( 8, angle() ); break; default: setInvalid(); break; } return; }