Last active
October 25, 2017 06:12
-
-
Save crockpotveggies/b19a54bafba6c86a59dd690195d68b17 to your computer and use it in GitHub Desktop.
A DataVec reduction op for averaging a list of coordinates
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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