/* * $Header: /cvs/CVS_LEBA/common/jmap7cs/src/java/com/obrctm/jmap7cs/openmap/JMap7CsMercator.java,v 1.8 2003/07/21 08:29:28 piokub Exp $ * * Copyright 2003 OBR Centrum Techniki Morskiej, All rights reserved. */ package com.obrctm.jmap7cs.openmap; import java.awt.Point; import com.bbn.openmap.LatLonPoint; import com.bbn.openmap.proj.Cylindrical; import com.bbn.openmap.proj.ProjMath; import com.bbn.openmap.util.Debug; import com.obrctm.jmap7cs.View; /** Implementuje klasę projekcji OpenMapy. * Jest to projekcja Mercator, z tym, że celem obliczeń LatLon->XY i XY->LatLon * wywołuje funkcje mapy ECDIS. * * @version $Header: /cvs/CVS_LEBA/common/jmap7cs/src/java/com/obrctm/jmap7cs/openmap/JMap7CsMercator.java,v 1.8 2003/07/21 08:29:28 piokub Exp $ * @author pitek * @author pawkub */ public class JMap7CsMercator extends Cylindrical { /** Nazwa projekcji JMap7CsMercator. */ public final static transient String JMap7CsMercatorName = "JMap7CsMercator"; /** * Typ projekcji JMap7CsMercator. * Mam nadzieję że kiedyś inna projekcja dodana do OpenMapy * nie będzie kolidować z takim akurat typem. */ public final static transient int JMap7CsMercatorType = 666; // HACK epsilon: skirt the edge of the infinite. If this is too small // then we get too close to +-INFINITY when we forward project. Tweak // this if you start getting Infinity or NaN's for forward(). /** * Stała wykorzystywana przy normalizacji szerokości geograficznej. Zapobiega * pojawieniu się +-INF lub NaN'a. */ protected static float epsilon = 0.01f; /** Konstruktor projekcji JMap7CsMercator. * @param center Centrum projekcji. * @param scale Skala projecji. * @param width Szerokość pixmapy. * @param height Wysokość pixmapy. */ public JMap7CsMercator(JMap7CsMapBean mapBean, LatLonPoint center, float scale, int width, int height) { super(center, scale, width, height, JMap7CsMercatorType); this.mapBean = mapBean; } /** Metoda do pobrania opisu projekcji. * @return ciąg znaków opisujących obiekt. */ public String toString() { return "JMap7CsMercator[" + super.toString(); } /** Metoda wywoływana w przypadku zmian parametrów projekcji. */ protected void computeParameters() { Debug.message("JMap7CsMercator", "JMap7CsMercator.computeParameters()"); super.computeParameters(); } /** Metoda normalizująca szerokość geograficzną. * @param lat szerokość geograficzna w radianach. * @return szerokość geograficzna w zakresie (-PI/2 ; PI/2). */ public float normalize_latitude(float lat) { if (lat > NORTH_POLE - epsilon) { return NORTH_POLE - epsilon; } else if (lat < SOUTH_POLE + epsilon) { return SOUTH_POLE + epsilon; } return lat; } /** Każdy punkt jest rysowalny, nawet bieguny, bo normalizujemy szerokość geograficzną. * @param lat Szerokość geograficzna. * @param lon Długość geograficzna. * @return zawsze true. */ public boolean isPlotable(float lat, float lon) { return true; } /** Metoda przelicza punkt o współrzędnych geograficznych na współrzędne pixmapy. * @param pt Punkt, współrzędne geograficzne. * @param p Punkt, zwrot współrzędnych na pixmapie. * @return p Punkt, współrzędne na pixmapie. */ public Point forward(LatLonPoint pt, Point p) { // first convert to radians, and handle infinity float phi = normalize_latitude(pt.radlat_); float lambda = pt.radlon_; // already wrapped assert getView() != null; boolean ret = getView().latLonToXy(phi*RAD_TO_DEG, lambda*RAD_TO_DEG, p); assert ret == true; return p; } /** Metoda przelicza punkt o współrzędnych geograficznych na współrzędne pixmapy. * @param lat Szerokość geograficzna. * @param lon Długość geograficzna. * @param p Punkt, zwrot współrzędnych na pixmapie. * @return p Punkt, współrzędne na pixmapie. */ public Point forward(float lat, float lon, Point p) { // first convert to radians, and normalize float phi = normalize_latitude(ProjMath.degToRad(lat)); float lambda = wrap_longitude(ProjMath.degToRad(lon)); assert getView() != null; boolean ret = getView().latLonToXy(phi*RAD_TO_DEG, lambda*RAD_TO_DEG, p); assert ret == true; return p; } /** Metoda przelicza punkt o współrzędnych geograficznych na współrzędne pixmapy. * @param lat Szerokość geograficzna. * @param lon Długość geograficzna. * @param isRadian Gdy true, wartości współrzędnych geograficznych podane są w radianach. * @param p Punkt, zwrot współrzędnych na pixmapie. * @return p Punkt, współrzędne na pixmapie. */ public Point forward(float lat, float lon, Point p, boolean isRadian) { // first normalize float phi = normalize_latitude(lat); float lambda = wrap_longitude(lon); assert getView() != null; boolean ret = getView().latLonToXy(phi*RAD_TO_DEG, lambda*RAD_TO_DEG, p); assert ret == true; return p; } /** Metoda przelicza wpółrzędne pixmapy na współrzędne geograficzne. * @param pt Punkt (współrzędne na pixmapie). * @param llp Punkt (współrzędne geograficzne). * @return Punkt (współrzędne geograficzne). */ public LatLonPoint inverse(Point pt, LatLonPoint llp) { double[] latlon = new double[2]; assert getView() != null; boolean ret = getView().xyToLatLon(pt.x, pt.y, latlon); assert ret == true; llp.setLatitude((float)latlon[0]); llp.setLongitude((float)latlon[1]); return llp; } /** Metoda przelicza wpółrzędne pixmapy na współrzędne geograficzne. * @param x Wpółrzędna pixmapy. * @param y Wpółrzędna pixmapy. * @param llp Punkt (współrzędne geograficzne). * @return Punkt (współrzędne geograficzne). */ public LatLonPoint inverse(int x, int y, LatLonPoint llp) { double [] latlon = new double[2]; assert getView() != null; boolean ret = getView().xyToLatLon(x, y, latlon); assert ret == true; llp.setLatitude((float)latlon[0]); llp.setLongitude((float)latlon[1]); return llp; } /** Metoda do pobrania nazwy projekcji. * @return nazwa projekcji. */ public String getName() { return JMap7CsMercatorName; } /** @todo co robi? */ private View getView() { return mapBean.getView(); } /** Stała do zamiany radianów na stopnie.*/ private final double RAD_TO_DEG = 180.0/3.14159265358; /** Referencja na JMap7CsMapBean. */ private JMap7CsMapBean mapBean = null; }