Exemple #1
0
  /**
   * This is used to convert an image'x x,y location into lonLat values.
   *
   * @param x x pixel of user click on image
   * @param y y pixel of user click on image
   * @param intWESN is the WESN of the graph on the image. Note that S will be numerically greater
   *     than N.
   * @param doubleWESN is the lon lat WESN of the graph on the image
   * @param extentWESN is the maximum extent allowed (so center not shifted too far)
   * @return double[2] 0=lon 1=lat. or null if trouble (e.g., intWESN is null)
   */
  public static double[] xyToLonLat(
      int x, int y, int[] intWESN, double[] doubleWESN, double[] extentWESN) {
    if (intWESN == null
        || doubleWESN == null
        || intWESN[0] >= intWESN[1]
        || intWESN[2] <= intWESN[3]) return null;

    double xRange = doubleWESN[1] - doubleWESN[0];
    double yRange = doubleWESN[3] - doubleWESN[2];
    double newX, newY;

    if (x < intWESN[0] || x > intWESN[1]) {
      // a click outside of graph shifts center to (theoretical) adjacent panel
      newX = x < intWESN[0] ? doubleWESN[0] - xRange / 2 : doubleWESN[1] + xRange / 2;
      newY =
          y < intWESN[3]
              ? doubleWESN[3] + yRange / 2
              : // N
              y > intWESN[2]
                  ? doubleWESN[2] - yRange / 2
                  : // S
                  doubleWESN[2] + yRange / 2;

      // ensure not too far
      newX = Math.max(newX, extentWESN[0] + xRange / 2);
      newX = Math.min(newX, extentWESN[1] - xRange / 2);
      newY = Math.max(newY, extentWESN[2] + yRange / 2);
      newY = Math.min(newY, extentWESN[3] - yRange / 2);

    } else if (y < intWESN[3] || y > intWESN[2]) {
      // y is outside of graph, but x must be within graph
      newX = doubleWESN[0] + xRange / 2;
      newY = y < intWESN[3] ? doubleWESN[3] + yRange / 2 : doubleWESN[2] - yRange / 2;

      // ensure not too far
      newX = Math.max(newX, extentWESN[0] + xRange / 2);
      newX = Math.min(newX, extentWESN[1] - xRange / 2);
      newY = Math.max(newY, extentWESN[2] + yRange / 2);
      newY = Math.min(newY, extentWESN[3] - yRange / 2);

    } else {
      // click within the graph
      newX = doubleWESN[0] + (x - intWESN[0]) * xRange / (intWESN[1] - intWESN[0]);
      newY = doubleWESN[2] + (y - intWESN[2]) * yRange / (intWESN[3] - intWESN[2]);
    }

    return new double[] {newX, newY};
  }