์๋๋ก์ด๋๋ก ๋ฉ๋ชจ์ฅ์ ๊ตฌํ ์ค์ด๋ค.
์ ๋ชฉ, ๋ด์ฉ๊ณผ ํจ๊ป ์ฅ์๋ ์ถ๊ฐํ ์ ์๋ค. (์ํ๋ ์ฅ์)
๊ตฌ๊ธ ์ฅ์ ๊ฒ์ api๋ฅผ ์ฌ์ฉํ์ฌ, ๋ด๊ฐ ๊ฒ์ํ ์ฅ์์ ํค์๋์ ์ฃผ์๋ฅผ ๊ฐ์ด ์ ์ฅํ ์ ์๊ฒ ๋ง๋ค์๋ค.
๋ํ ์๋๋ก์ด๋ notification ๊ธฐ๋ฅ์ ์ฌ์ฉํด ๋ด๊ฐ ์ ์ฅํ ์ฅ์๋ค๋ก๋ถํฐ
์ฌ์ฉ์๊ฐ ์ผ์ ๋ฒ์ ์ด๋ด๋ก ๋ค์ด์ค๋ฉด, ์๋์ด ์ธ๋ฆฌ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ค.
๋จผ์ ๋ด ์์น์ ์ ์ฅ๋ ์ฅ์๋ค์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ณด๋๋ก ํ๋ค.
GPS์ ๊ตฌ๊ธ API๋ก๋ถํฐ ์๋, ๊ฒฝ๋ ๊ฐ์ ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ด์ฉํด ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋๋ก ํ๋ค.
์๋ฎฌ๋ ์ดํฐ์ ์์น, ์ฆ ์ฌ์ฉ์์ ํ์ฌ ์์น๋ GPS ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ๋ฐ์์๋ค.
๋ฉ๋ชจ์ฅ์ ์์ฑํ๋ฉฐ ์ฅ์๋ฅผ ์ถ๊ฐํ ๋, ํด๋น ์ฅ์์ ์๋, ๊ฒฝ๋๊ฐ๋ ํจ๊ป ๋ฐ์์ ์์ด๋ ํ๋ฆฌํผ๋ฐ์ค์
๋ฐ๋ก ์ ์ฅ์ ์์ผฐ๋ค.
์ด ๊ฒ์๊ธ์ ์ฒจ๋ถํ ์ฝ๋๋ ์์์
์๋, ๊ฒฝ๋ ๊ฐ์ ํ์ฉํ์ฌ ๋ ์ง์ ๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์์ ๋ด์ฉ์ด๋ค.
๋ฌด์์๋ก ๋ ์ฅ์๋ฅผ ๊ณจ๋ผ์ ์๋, ๊ฒฝ๋ ๊ฐ์ ๋ฃ์ด๋ณด์๋ค !
package com.example.distanceexample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
double lat1 ;
double lat2 ;
double lon1;
double lon2;
TextView dist;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lat1 = 37.48593340000001; // ๋์๊ตฌ ์ด๋๊ฐ
lon1 = 126.9687783; // ๋์๊ตฌ ์ด๋๊ฐ . . .
lat2 = 37.73753610000001; // ๊ฒฝ๊ธฐ๋ ์์ฃผ
lon2 = 127.0462942; // ๊ฒฝ๊ธฐ๋ ์์ฃผ
String unit="K";
double howFar = distance(lat1, lon1, lat2, lon2,unit);
dist = findViewById(R.id.distance);
dist.setText("๋ ์ฅ์์ ๊ฑฐ๋ฆฌ๋ "+howFar + "km ์
๋๋ค.");
}
private static double distance(double lat1, double lon1, double lat2, double lon2, String unit) {
if ((lat1 == lat2) && (lon1 == lon2)) {
return 0;
}
else {
double theta = lon1 - lon2;
double dist = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta));
dist = Math.acos(dist);
dist = Math.toDegrees(dist);
dist = dist * 60 * 1.1515;
if (unit.equals("K")) {
dist = dist * 1.609344;
} else if (unit.equals("N")) {
dist = dist * 0.8684;
}
return (dist);
}
}
}
์ด์ ๋ ์ง์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํด๋ณด์. (์ง์ ๊ฑฐ๋ฆฌ)
๋์ง์ ์ ์๋(latitude)์ ๊ฒฝ๋(longitude) ๋ฅผ double ํ์ผ๋ก
๊ทธ๋ฆฌ๊ณ ๋ฐํ๋ฐ๊ณ ์ ํ๋ ๊ฑฐ๋ฆฌ์ ๋จ์ (Km ํฌ๋ก๋ฏธํฐ, M ๋ง์ผ, N ํด๋ฆฌ )๋ฅผ String ๊ฐ์ผ๋ก unit ์ ๋ด์์ double ๊ฐ์ ๋ฐํํ๋ distance ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋๋ค.
๋ฉ์๋ ์์๋
Haversine ๊ณต์์์ ์ฌ์ฉ๋๋ ์ผ๊ฐํจ์๋ฅผ ๊ณ์ฐํ๋ ๋ด์ฉ์ด ๋ด๊ฒจ ์๋ค !
๋ด๊ฐ ์์ฑํ ๋ด์ฉ์ ์๋๊ณ ์์ฃผ ๊น๋ํ๊ณ ์น์ ํ ์คํ ์์ค๊ฐ ์์ด์ ์ฐธ๊ณ ํ๋ค.
Geo Data Souce ๋ผ๋ ์ฌ์ดํธ์ธ๋ฐ, ์ ์ธ๊ณ ๋ค์ํ ๊ตญ๊ฐ ๋์์ ๋ํ ์งํ, ์ง์ญ ์ ๋ณด๋ค์ ์จ๋ผ์ธ ๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ฅผ ์ ๊ณตํ๋ ์ฌ์ดํธ๋ผ๊ณ ํ๋ค. developer ๋ฉ๋ด๊ฐ ๋ฐ๋ก ์์ด์ ์ด๋ ๊ฒ ์์ ์ฝ๋๋ ์ ๊ณตํ๋ ๋ฏ.
์๋ฐ ๋ฟ๋ง ์๋๋ผ PHP, C ๋ฑ๋ฑ ๋ค์ํ๊ฒ ์์ ๊ฐ ์์.
https://www.geodatasource.com/developers/java
์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ง์ ๊ฑฐ๋ฆฌ๊ฐ ๊ณ์ฐ๋๊ธฐ ๋๋ฌธ์ ๋ค๋น๊ฒ์ด์
์์ ๋งํ๋ ๊ฑฐ๋ฆฌ์๋ ๋น์ฐํ ๋ค๋ฅด๋ค.
์ ๊ฒฐ๊ณผ ๊ฐ์ ์ซ์๊ฐ ๋งค์ฐ ๊ธธ๊ฒ ๋์จ๋ค.
๋ณดํต ๊ฑฐ๋ฆฌ๋ฅผ ๋ฐ์ง ๋์๋ ์์์ ์ฒซ์งธ, ํน์ ๋์งธ ์๋ฆฌ๊น์ง๋ง ๋ณด์ฌ์ค๋ ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์
return ๊ฐ์ ๋ฐํํ๊ธฐ ์ ์ ์ค์๋ฅผ ๊ณ์ฐํ๋ ์ฝ๋๋ฅผ ํ ์ค ์ถ๊ฐํด๋ณธ๋ค.
private static double distance(double lat1, double lon1, double lat2, double lon2, String unit) {
if ((lat1 == lat2) && (lon1 == lon2)) {
return 0;
}
else {
double theta = lon1 - lon2;
double dist = Math.sin(Math.toRadians(lat1)) * Math.sin(Math.toRadians(lat2)) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(theta));
dist = Math.acos(dist);
dist = Math.toDegrees(dist);
dist = dist * 60 * 1.1515;
if (unit.equals("K")) {
dist = dist * 1.609344;
} else if (unit.equals("N")) {
dist = dist * 0.8684;
}
dist = Math.round(dist * 10.0) / 10.0; // ์์์ ์ฒซ์งธ์๋ฆฌ๊น์ง๋ง ๋์ค๊ฒ ํ๋ ๊ณต์
// ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ Math ์ ์๋ round ๋ฉ์๋
// ๋ง์ฝ ์์์ ๋์งธ์๋ฆฌ ๊น์ง ํ์ํ๋ค๋ฉด 100.0
return dist;
}
}
์ง์ ~!
์์์ ๋๋ฒ์งธ ์๋ฆฌ๊ฐ ๋ฐ์ฌ๋ฆผ๋์ด 28.8 km ๋ผ๊ณ ๋์จ๋ค !
๋