Class GeoLocation

java.lang.Object
com.kosherjava.zmanim.util.GeoLocation
All Implemented Interfaces:
Cloneable

public class GeoLocation extends Object implements Cloneable
A class that contains location information such as latitude and longitude required for astronomical calculations. The elevation field may not be used by some calculation engines and would be ignored if set. Check the documentation for specific implementations of the AstronomicalCalculator to see if elevation is calculated as part of the algorithm.
Author:
© Eliyahu Hershfeld 2004 - 2026
  • Field Details

  • Constructor Details

    • GeoLocation

      public GeoLocation(String name, double latitude, double longitude, ZoneId zoneId)
      GeoLocation constructor with parameters for all required fields.
      Parameters:
      name - The location name for display, for example "Lakewood, NJ".
      latitude - the latitude as a double, for example 40.096 for Lakewood, NJ. Note: For latitudes south of the equator, a negative value should be used.
      longitude - the longitude as a double, for example -74.222 for Lakewood, NJ. Note: For longitudes east of the Prime Meridian (Greenwich), a negative value should be used.
      zoneId - the ZoneId for the location.
    • GeoLocation

      public GeoLocation(String name, double latitude, double longitude, double elevation, ZoneId zoneId)
      GeoLocation constructor with parameters for all required fields.
      Parameters:
      name - The location name for display, for example "Lakewood, NJ".
      latitude - the latitude as a double, for example 40.096 for Lakewood, NJ. Note: For latitudes south of the equator, a negative value should be used.
      longitude - double the longitude as a double, for example -74.222 for Lakewood, NJ. Note: For longitudes east of the Prime Meridian (Greenwich), a negative value should be used.
      elevation - the elevation above sea level in Meters.
      zoneId - the ZoneId for the location.
    • GeoLocation

      public GeoLocation()
      Default GeoLocation constructor will set location to the Prime Meridian at Greenwich, England and a ZoneId of GMT. The longitude will be set to 0 and the latitude will be 51.4772 to match the location of the Royal Observatory, Greenwich. No daylight savings time will be used.
  • Method Details

    • getElevation

      public double getElevation()
      Method to return the elevation in Meters above sea level.
      Returns:
      Returns the elevation in Meters.
      See Also:
    • setElevation

      public void setElevation(double elevation)
      Method to set the elevation in Meters above sea level.
      Parameters:
      elevation - The elevation to set in Meters. An IllegalArgumentException will be thrown if the value is a negative, NaN or infinite.
    • setLatitude

      public void setLatitude(double latitude)
      Method to set the latitude as a double, for example 40.096 for Lakewood, NJ.
      Parameters:
      latitude - The degrees of latitude to set. The values should be between -90° and 90°. For example 40.096 would be used for Lakewood, NJ. Note: For latitudes south of the equator, a negative value should be used. An IllegalArgumentException will be thrown if the value exceeds the limits.
    • setLatitude

      public void setLatitude(int degrees, int minutes, double seconds, String direction)
      Method to set the latitude in degrees, minutes and seconds. For example, set the degrees to 40, minutes to 5, seconds to 45.6 and direction to "N" for Lakewood, NJ.
      Parameters:
      degrees - The degrees of latitude to set between 0° and 90°, for example 40 would be used for Lakewood, NJ. An IllegalArgumentException will be thrown if the value exceeds the limit.
      minutes - minutes of arc, for example 5 would be used for Lakewood, NJ.
      seconds - seconds of arc, for example 45.6 would be used for Lakewood, NJ.
      direction - "N" for north and "S" for south, for example "N" would be used for Lakewood, NJ. An IllegalArgumentException will be thrown if the value is not "S" or "N".
    • getLatitude

      public double getLatitude()
      Method to return the latitude as a double, for example 40.096 for Lakewood, NJ.
      Returns:
      Returns the latitude.
    • setLongitude

      public void setLongitude(double longitude)
      Method to set the longitude as a double, for example -74.222 for Lakewood, NJ
      Parameters:
      longitude - The degrees of longitude to set as a double between -180.0° and 180.0°. For example -74.222 would be used for Lakewood, NJ. Note: for longitudes east of the Prime Meridian (Greenwich) a negative value should be used.An IllegalArgumentException will be thrown if the value exceeds the limit.
    • setLongitude

      public void setLongitude(int degrees, int minutes, double seconds, String direction)
      Method to set the longitude in degrees, minutes and seconds. For example, set the degrees to 74, minutes to 13, seconds to 19.2 and direction to "W" for Lakewood, NJ.
      Parameters:
      degrees - The degrees of longitude to set between 0° and 180°. For example 74 would be set for Lakewood, NJ. An IllegalArgumentException will be thrown if the value exceeds the limits.
      minutes - minutes of arc. For example 13 would be set for Lakewood, NJ.
      seconds - seconds of arc. For example 19.2 would be set for Lakewood, NJ.
      direction - "E" for east of the Prime Meridian or "W"for west of it. For example, "W" would be set for Lakewood, NJ. An IllegalArgumentException will be thrown if the value is not E or W.
    • getLongitude

      public double getLongitude()
      Method to return the longitude as a double, for example -74.222 for Lakewood, NJ.
      Returns:
      Returns the longitude.
    • getLocationName

      Method to return the location name (for display), for example "Lakewood, NJ".
      Returns:
      Returns the location name.
    • setLocationName

      public void setLocationName(String name)
      Setter for the location name (for display), for example "Lakewood, NJ".
      Parameters:
      name - The setter method for the display name.
    • getZoneId

      public ZoneId getZoneId()
      Method to return the ZoneId.
      Returns:
      Returns the zoneId.
    • setZoneId

      public void setZoneId(ZoneId zoneId)
      Method to set the zoneId. If this is ever set after the GeoLocation is set in the AstronomicalCalendar, it is critical that #setZoneId(ZoneId) setZoneId(ZoneId) be called in order for the AstronomicalCalendar to output times in the expected offset. This situation will arise if the AstronomicalCalendar is ever cloned.
      Parameters:
      zoneId - The zoneId to set.
    • getLocalMeanTimeOffset

      public long getLocalMeanTimeOffset(Instant instant)
      A method that will return the location's local mean time offset in milliseconds from the local clock time defined by the time zone offset in effect for the supplied Instant. The globe is split into 360°, with 15° per hour of the day. For a local that is at a longitude that is evenly divisible by 15 (longitude % 15 == 0), at solar noon (with adjustment for the equation of time) the sun should be directly overhead, so a user who is 1° west of this will have noon at 4 minutes after local clock noon, and conversely, a user who is 1° east of the 15° longitude will have noon at 11:56 AM local clock time. Lakewood, N.J., whose longitude is -74.222, is 0.778 away from the closest multiple of 15 at -75°. This is multiplied by 4 to yield 3 minutes and 10 seconds earlier than the local clock time derived from the zone offset in effect for the supplied instant, including any applicable Daylight saving time adjustment.
      Parameters:
      instant - the Instant used to claculate the local mean offset for the date in question.
      Returns:
      the offset in milliseconds relative to the time zone offset in effect at the supplied instant. A positive value will be returned East of the 15° timezone line, and a negative value West of it.
    • getAntimeridianAdjustment

      public int getAntimeridianAdjustment(Instant instant)
      Adjust the date for antimeridian crossover. This is needed to deal with edge cases such as Samoa that use a different calendar date than expected based on their geographic location. The actual Time Zone offset may deviate from the expected offset based on the longitude. Since the 'absolute time' calculations are always based on longitudinal offset from UTC for a given date, the date is presumed to only increase East of the Prime Meridian, and to only decrease West of it. For Time Zones that cross the antimeridian, the date will be artificially adjusted before calculation to conform with this presumption. For example, Apia, Samoa with a longitude of -171.75 uses a local offset of +14:00. When calculating sunrise for 2018-02-03, the calculator should operate using 2018-02-02 since the expected zone is -11. After determining the UTC time, the local DST offset of UTC+14:00 should be applied to bring the date back to 2018-02-03.
      Parameters:
      instant - the Instant required for the local mean time offset calculation
      Returns:
      the number of days to adjust the date This will typically be 0 unless the date crosses the antimeridian
    • getGeodesicInitialBearing

      public double getGeodesicInitialBearing(GeoLocation location)
      Calculate the initial geodesic bearing between this Object and a second Object passed to this method using Thaddeus Vincenty's inverse formula See T Vincenty, "Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975
      Parameters:
      location - the destination location
      Returns:
      the initial bearing
    • getGeodesicFinalBearing

      public double getGeodesicFinalBearing(GeoLocation location)
      Calculate the final geodesic bearing between this Object and a second Object passed to this method using Thaddeus Vincenty's inverse formula See T Vincenty, "Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975
      Parameters:
      location - the destination location
      Returns:
      the final bearing
    • getGeodesicDistance

      public double getGeodesicDistance(GeoLocation location)
      Calculate geodesic distance in Meters between this Object and a second Object passed to this method using Thaddeus Vincenty's inverse formula See T Vincenty, "Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975
      Parameters:
      location - the destination location
      Returns:
      the geodesic distance in Meters
      See Also:
    • vincentyInverseFormula

      private double vincentyInverseFormula(GeoLocation location, int formula)
      Calculate geodesic distance in Meters between this Object and a second Object passed to this method using Thaddeus Vincenty's inverse formula See T Vincenty, "Direct and Inverse Solutions of Geodesics on the Ellipsoid with application of nested equations", Survey Review, vol XXII no 176, 1975
      Parameters:
      location - the destination location
      formula - This formula calculates initial bearing (INITIAL_BEARING), final bearing ( FINAL_BEARING) and distance (DISTANCE).
      Returns:
      geodesic distance in Meters
    • getRhumbLineBearing

      public double getRhumbLineBearing(GeoLocation location)
      Returns the rhumb line bearing from the current location to the GeoLocation passed in.
      Parameters:
      location - destination location
      Returns:
      the bearing in degrees
    • getRhumbLineDistance

      public double getRhumbLineDistance(GeoLocation location)
      Returns the rhumb line distance from the current location to the GeoLocation passed in.
      Parameters:
      location - the destination location
      Returns:
      the distance in Meters
    • toXML

      public String toXML()
      A method that returns an XML formatted String representing the serialized Object. Very similar to the toString method but the return value is in an xml format. The format currently used (subject to change) is:
        <GeoLocation>
               <LocationName>Lakewood, NJ</LocationName>
               <Latitude>40.096&deg</Latitude>
               <Longitude>-74.222amp;deg</Longitude>
               <Elevation>0 Meters</Elevation>
               <TimezoneName>America/New_York</TimezoneName>
               <TimeZoneDisplayName>Eastern Standard Time</TimeZoneDisplayName>
        </GeoLocation>
      
      Returns:
      The XML formatted String.
    • equals

      public boolean equals(Object object)
      Overrides:
      equals in class Object
      See Also:
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
      See Also:
    • toString

      public String toString()
      Overrides:
      toString in class Object
      See Also:
    • clone

      public Object clone()
      An implementation of the Object.clone() method that creates a deep copy of the object.
      Overrides:
      clone in class Object
      See Also: