From 58ea1d59b1ec71d61a088a7b9a87da7ae28279dd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?France=CC=81=20Wilke?= <francewilke@gmail.com>
Date: Wed, 19 Apr 2023 12:28:23 +0200
Subject: [PATCH] Add GetDistanceInKmBetweenCoordinates and Concat functions

---
 address_utils/address_utils.go | 21 +++++++++++++++++++++
 string_utils/string_utils.go   | 14 ++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/address_utils/address_utils.go b/address_utils/address_utils.go
index a1f2730..b90563d 100644
--- a/address_utils/address_utils.go
+++ b/address_utils/address_utils.go
@@ -3,6 +3,7 @@ package address_utils
 import (
 	"crypto/md5"
 	"fmt"
+	"math"
 	"regexp"
 	"strings"
 
@@ -275,3 +276,23 @@ func GetZoneDisplayName(zone string) string {
 
 	return zone
 }
+
+func GetDistanceInKmBetweenCoordinates(lat1 float64, lng1 float64, lat2 float64, lng2 float64) float64 {
+	radlat1 := float64(math.Pi * lat1 / 180)
+	radlat2 := float64(math.Pi * lat2 / 180)
+
+	theta := float64(lng1 - lng2)
+	radtheta := float64(math.Pi * theta / 180)
+
+	dist := math.Sin(radlat1)*math.Sin(radlat2) + math.Cos(radlat1)*math.Cos(radlat2)*math.Cos(radtheta)
+	if dist > 1 {
+		dist = 1
+	}
+
+	dist = math.Acos(dist)
+	dist = dist * 180 / math.Pi
+	dist = dist * 60 * 1.1515
+
+	// Return in kilometers
+	return dist * 1.609344
+}
diff --git a/string_utils/string_utils.go b/string_utils/string_utils.go
index b649cc2..9b4cafe 100644
--- a/string_utils/string_utils.go
+++ b/string_utils/string_utils.go
@@ -151,6 +151,20 @@ func ConcatP(args ...*string) string {
 	return s
 }
 
+// Concat concatenates all specified non-empty strings with ", " separators
+func Concat(args []string, separator string) string {
+	s := ""
+	for _, arg := range args {
+		if arg != "" {
+			if s != "" {
+				s += separator
+			}
+			s += arg
+		}
+	}
+	return s
+}
+
 func ToJSONString(object interface{}) (string, error) {
 	jsonBytes, err := json.Marshal(&object)
 	if err != nil {
-- 
GitLab