Changeset 9559 in josm


Ignore:
Timestamp:
2016-01-21T17:20:12+01:00 (8 years ago)
Author:
bastiK
Message:

auto-detect poles in view (see #12186)

Location:
trunk/src/org/openstreetmap/josm/data/projection
Files:
1 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java

    r9532 r9559  
    55
    66import java.util.ArrayList;
     7import java.util.EnumMap;
    78import java.util.HashMap;
    89import java.util.List;
     
    1112import java.util.regex.Matcher;
    1213import java.util.regex.Pattern;
    13 
    1414import org.openstreetmap.josm.Main;
    1515import org.openstreetmap.josm.data.Bounds;
     
    2626import org.openstreetmap.josm.data.projection.datum.WGS84Datum;
    2727import org.openstreetmap.josm.data.projection.proj.ICentralMeridianProvider;
    28 import org.openstreetmap.josm.data.projection.proj.IPolar;
    2928import org.openstreetmap.josm.data.projection.proj.Mercator;
    3029import org.openstreetmap.josm.data.projection.proj.Proj;
     
    156155    }
    157156
     157    private enum Polarity { NORTH, SOUTH }
     158
     159    private EnumMap<Polarity, EastNorth> polesEN;
     160    private EnumMap<Polarity, LatLon> polesLL;
     161    {
     162        polesLL = new EnumMap<>(Polarity.class);
     163        polesLL.put(Polarity.NORTH, LatLon.NORTH_POLE);
     164        polesLL.put(Polarity.SOUTH, LatLon.SOUTH_POLE);
     165    }
     166
    158167    /**
    159168     * Constructs a new empty {@code CustomProjection}.
     
    761770    }
    762771
     772    private EastNorth getPole(Polarity whichPole) {
     773        if (polesEN == null) {
     774            polesEN = new EnumMap<>(Polarity.class);
     775            for (Polarity p : Polarity.values()) {
     776                polesEN.put(p, null);
     777                LatLon ll = polesLL.get(p);
     778                try {
     779                    EastNorth enPole = latlon2eastNorth(ll);
     780                    if (enPole.isValid()) {
     781                        // project back and check if the result is somewhat reasonable
     782                        LatLon llBack = eastNorth2latlon(enPole);
     783                        if (llBack.isValid() && ll.greatCircleDistance(llBack) < 1000) {
     784                            polesEN.put(p, enPole);
     785                        }
     786                    }
     787                } catch (Exception e) {}
     788            }
     789        }
     790        return polesEN.get(whichPole);
     791    }
     792
    763793    @Override
    764794    public Bounds getLatLonBoundsBox(ProjectionBounds r) {
     
    788818        // if the box contains one of the poles, the above method did not get
    789819        // correct min/max latitude value
    790         if (proj instanceof IPolar) {
    791             IPolar polarProj = (IPolar) proj;
    792             if (polarProj.hasPole(false)) {
    793                 EastNorth enNorthPole = latlon2eastNorth(LatLon.NORTH_POLE);
    794                 if (r.contains(enNorthPole)) {
    795                     result.extend(LatLon.NORTH_POLE);
    796                 }
    797             }
    798             if (polarProj.hasPole(true)) {
    799                 EastNorth enSouthPole = latlon2eastNorth(LatLon.SOUTH_POLE);
    800                 if (r.contains(enSouthPole)) {
    801                     result.extend(LatLon.SOUTH_POLE);
    802                 }
     820        for (Polarity p : Polarity.values()) {
     821            EastNorth pole = getPole(p);
     822            if (pole != null && r.contains(pole)) {
     823                result.extend(polesLL.get(p));
    803824            }
    804825        }
  • trunk/src/org/openstreetmap/josm/data/projection/proj/PolarStereographic.java

    r9428 r9559  
    5757 * @since 9419
    5858 */
    59 public class PolarStereographic extends AbstractProj implements IPolar {
     59public class PolarStereographic extends AbstractProj {
    6060    /**
    6161     * Maximum number of iterations for iterative computations.
     
    181181        }
    182182    }
    183 
    184     @Override
    185     public boolean hasPole(boolean south) {
    186         return south == southPole;
    187     }
    188183}
Note: See TracChangeset for help on using the changeset viewer.