forked from foursquare/twofishes
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Helpers.scala
61 lines (53 loc) · 1.66 KB
/
Helpers.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Copyright 2012 Foursquare Labs Inc. All Rights Reserved.
package com.foursquare.twofishes
import java.text.Normalizer
import java.util.regex.Pattern
object Helpers {
def tryo[T](f: => T): Option[T] = {
try {
Some(f)
} catch {
case _ => None
}
}
def flattryo[T](f: => Option[T]): Option[T] = {
try {
f
} catch {
case _ => None
}
}
}
object NameNormalizer {
def tokenize(s: String): List[String] = {
s.split(" ").filterNot(_.isEmpty).toList
}
def normalize(s: String): String = {
var n = s.toLowerCase
// remove periods and quotes
n = n.replaceAll("['\u2018\u2019\\.]", "")
// change all other punctuation to spaces
n = n.replaceAll("\\p{Punct}", " ")
n
}
def deaccent(s: String): String = {
val temp = Normalizer.normalize(s, Normalizer.Form.NFD);
val pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
pattern.matcher(temp).replaceAll("");
}
}
object GeoTools {
val MetersPerMile: Double = 1609.344
val RadiusInMeters: Int = 6378100 // Approximately a little less than the Earth's polar radius
val MetersPerDegreeLatitude: Double = 111111.0
val MetersPerDegreeLongitude: Double = 110540.0 // I'm assuming this as at the Equator
/**
* @return distance in meters
*/
def getDistance(geolat1: Double, geolong1: Double, geolat2: Double, geolong2: Double): Int = {
val theta = geolong1 - geolong2
val dist = math.sin(math.toRadians(geolat1)) * math.sin(math.toRadians(geolat2)) +
math.cos(math.toRadians(geolat1)) * math.cos(math.toRadians(geolat2)) * math.cos(math.toRadians(theta))
(RadiusInMeters * math.acos(dist)).toInt
}
}