Пример #1
0
  /**
   * 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;
  }
Пример #2
0
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;
}