Skip to content

Instantly share code, notes, and snippets.

@crockpotveggies
Last active October 25, 2017 06:12
Show Gist options
  • Save crockpotveggies/b19a54bafba6c86a59dd690195d68b17 to your computer and use it in GitHub Desktop.
Save crockpotveggies/b19a54bafba6c86a59dd690195d68b17 to your computer and use it in GitHub Desktop.
A DataVec reduction op for averaging a list of coordinates
// our reduction op class that we will need shortly
class GeoAveragingReduction(columnOutputName: String="AveragedLatLon") extends AggregableColumnReduction {
override def reduceColumn(columnData: java.util.List[Writable]): Writable = {
val coordinates = columnData.map( d => d.toString.split(",") ).map{ case Array(lat,lon) => (lat.toDouble,lon.toDouble) }
val (lat,lon) = coordinates.reduceLeft(avgCoordinates)
new Text(s"""$lat,$lon""")
}
private def avgCoordinates(latlon1: (Double, Double), latlon2: (Double, Double)): (Double, Double) = {
var (lat1,lon1) = latlon1
var (lat2,lon2) = latlon2
var dLon = Math.toRadians(lon2 - lon1)
// convert to radians
lat1 = Math.toRadians(lat1)
lat2 = Math.toRadians(lat2)
lon1 = Math.toRadians(lon1)
val Bx = Math.cos(lat2) * Math.cos(dLon)
val By = Math.cos(lat2) * Math.sin(dLon)
val lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By))
val lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx)
(Math.toDegrees(lat3), Math.toDegrees(lon3))
}
override def getColumnOutputMetaData(x$1: String,x$2: org.datavec.api.transform.metadata.ColumnMetaData): org.datavec.api.transform.metadata.ColumnMetaData = {
new StringMetaData(outputColumnName)
}
def getColumnOutputName(columnInputName: String): String = columnOutputName
def columnName(): String = ???
def columnNames(): Array[String] = ???
def getInputSchema(): org.datavec.api.transform.schema.Schema = ???
def outputColumnName(): String = ???
def outputColumnNames(): Array[String] = ???
def setInputSchema(x$1: org.datavec.api.transform.schema.Schema): Unit = ???
def transform(x$1: org.datavec.api.transform.schema.Schema): org.datavec.api.transform.schema.Schema = ???
}
class AverageCoordinatesOp[T] extends IAggregableReduceOp[T, Writable] {
def combine[W:>IAggregableReduceOp[T, Writable]](W accu): Unit = {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment