chaotic3quilibrium

Leveraging squants library for Geospatial methods

Nov 20th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.35 KB | None | 0 0
  1. import squants.space.{Radians, Meters}
  2. import squants.{Angle, Length}
  3.  
  4. object Geospatial {
  5.   case class Longitude(angle: Angle) {
  6.     require(
  7.       (Radians(-Math.PI) <= angle) && (angle < Radians(Math.PI)),
  8.       "angle.inRadians must be greater than or equal to -Math.PI and less than Math.PI"
  9.     )
  10.   }
  11.   case class Latitude(angle: Angle) {
  12.     require(
  13.       (Radians(-(Math.PI * 0.5d)) <= angle) && (angle < Radians(Math.PI * 0.5d)),
  14.       "angle.inRadians must be greater than or equal to -(Math.PI * 0.5d) and less than (Math.PI * 0.5d)"
  15.     )
  16.   }
  17.   case class Distance(length: Length) {
  18.     require(
  19.       Meters(0.0d) <= length,
  20.       "length.inMeters must be greater than or equal to 0.0d"
  21.     )
  22.   }
  23.   case class Bearing(angle: Angle) {
  24.     require(
  25.       (Radians(0.0d) <= angle) && (angle < Radians(Math.PI * 2.0d)),
  26.       "angle.inRadians must be greater than or equal to 0.0d and less than (Math.PI * 2.0d)"
  27.     )
  28.   }
  29.  
  30.   case class Coordinate(longitude: Longitude, latitude: Latitude)
  31.  
  32.   def calculateDistance(
  33.     coordinate1: Coordinate,
  34.     coordinate2: Coordinate
  35.   ): (Distance, Bearing, Bearing) = {
  36.     def calculateDistanceUsingLegacyCodeRifeWithDoubles(
  37.       coordinate1LongitudeInRadians: Double,
  38.       coordinate1LatitudeInRadians: Double,
  39.       coordinate2LongitudeInRadians: Double,
  40.       coordinate2LatitudeInRadians: Double
  41.     ): (Double, Double, Double) = {
  42.       //Legacy code encapsulated here only works with meters and radians
  43.       //returns (distance, initial bearing, final bearing)
  44.       (1.0d, 1.0d, 2.0d) //TODO: replace with real calculation results
  45.     }
  46.     val (coordinate1InRadians, coordinate2InRadians) = (
  47.       (coordinate1.longitude.angle.toRadians, coordinate1.latitude.angle.toRadians),
  48.       (coordinate2.longitude.angle.toRadians, coordinate2.latitude.angle.toRadians)
  49.     )
  50.     val (distanceInMeters, bearingInitialInRadians, bearingFinalInRadians) =
  51.       calculateDistanceUsingLegacyCodeRifeWithDoubles(
  52.         coordinate1InRadians._1,
  53.         coordinate1InRadians._2,
  54.         coordinate2InRadians._1,
  55.         coordinate2InRadians._2
  56.       )
  57.     (
  58.       Distance(Meters(distanceInMeters)),
  59.       Bearing(Radians(bearingInitialInRadians)),
  60.       Bearing(Radians(bearingFinalInRadians))
  61.     )
  62.   }
  63.  
  64.   def calculateCoordinate(
  65.     coordinate1: Coordinate,
  66.     bearingInitial: Bearing,
  67.     distance: Distance
  68.   ): Coordinate = {
  69.     def calculateCoordinateUsingLegacyCodeRifeWithDoubles(
  70.       coordinate1Longitude: Double,
  71.       coordinate1Latitude: Double,
  72.       bearingInitialInRadians: Double,
  73.       distanceInMeters: Double
  74.     ): (Double, Double) = {
  75.       //Legacy code encapsulated here only works with meters and radians
  76.       //returns (longitude, latitude)
  77.       (-1.0d, 1.0d) //TODO: replace with real calculation results
  78.     }
  79.     val (coordinate1InRadians, bearingInitialInRadians, distanceInMeters) = (
  80.       (coordinate1.longitude.angle.toRadians, coordinate1.latitude.angle.toRadians),
  81.       bearingInitial.angle.toRadians,
  82.       distance.length.toMeters
  83.     )
  84.     val (longitude, latitude) =
  85.       calculateCoordinateUsingLegacyCodeRifeWithDoubles(
  86.         coordinate1InRadians._1,
  87.         coordinate1InRadians._2,
  88.         bearingInitialInRadians,
  89.         distanceInMeters
  90.       )
  91.     Coordinate(Longitude(Radians(longitude)), Latitude(Radians(latitude)))
  92.   }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment