안드로이드 스튜디오
[안드로이드 스튜디오 코틀린] 두 좌표 사이 거리 구하기
권송미
2023. 5. 23. 09:25
728x90
반응형
경도, 위도를 알 때 두 지점 사이의 거리를 구하는 공식을 적용시켜보자
우선 Object로 DistanceManager를 생성해서 아래의 코드를 추가해 준다.
import java.math.RoundingMode
import kotlin.math.*
object DistanceManager {
fun distance(preLat: Double?, preLng: Double?, postLat: Double?, postLng: Double?): String {
if (preLat == null || preLng == null || postLat == null || postLng == null) {
return ""
}
val result = (6371000 * acos(
cos(compareRadians(preLat))
* cos(compareRadians(postLat))
* cos(compareRadians(postLng) - compareRadians(preLng))
+ sin(compareRadians(preLat)) * sin(compareRadians(postLat))
)).toBigDecimal().setScale(1, RoundingMode.HALF_UP)
return "$result m"
}
private fun compareRadians(degrees: Double): Double {
return Math.toRadians(degrees)
}
}
- 6371000인 이유는 m 단위를 사용하기 위해 사용했고, km를 사용할 때는 6371만 곱해주면 된다.
다음 MainActivity에서 바인딩 설정 후, 원하는 좌표를 찍어 대입해준다.
강남역 갓덴스시부터 쉑쉑버거 까지 거리를 구해보자.
(대략적인 경도, 위도 좌표임)
import android.os.*
import android.util.Log
import androidx.appcompat.app.AppCompatActivity
import com.roadwe.emptyproject.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val lat1 = 37.498755
val lng1 = 127.029003
val lat2 = 37.502696
val lng2 = 127.025639
val distance = DistanceManager.distance(lat1, lng1, lat2, lng2)
binding.textView1.text = distance
Log.w("Distance", "두 점 사이의 거리 : $distance")
}
}
textview에 거리를 보여주게 설정하면
이렇게 거리를 구할 수 있다.
구한 공식과 거리가 유사하다
똑같지 않은 이유는 입력한 좌표 그대로 거리를 찍지 않았기 때문이다.
(구글 지도의 특성상?)
728x90
반응형