728x90
반응형
JAVA를 이용하여 주소 좌표를 구한 후 거리 측정하는 모듈
먼저 주소를 좌표로 변경해주는 API를 찾는다.
- 공간정보 오픈플랫폼의 Geocoder Api 2.0을 사용했다.
주소 : http://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do
- 주소를 좌표로 변환하는 서비스를 제공하며 일일 요청건수는 최대 30,000건임.
public static void main(String args[]){
String apiURL = "http://api.vworld.kr/req/address";
try{
int responseCode = 0;
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setRequestMethod("POST");
String keyword = "서울 영등포구 영중로 134-1 문성빌딩 704호";
String text_content = URLEncoder.encode(keyword.toString(), "utf-8");
//String text_content = URLEncoder.encode(keyword.toString());
// post request
String postParams = "service=address";
postParams += "&request=getcoord";
postParams += "&version=2.0";
postParams += "&crs=EPSG:4326";
postParams += "&address="+text_content;
postParams += "&arefine=true";
postParams += "&simple=false";
postParams += "&format=json";
postParams += "&type=road";
postParams += "&errorFormat=json";
postParams += "&key=발급받으신 키를 입력";
con.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
wr.writeBytes(postParams);
wr.flush();
wr.close();
responseCode = con.getResponseCode();
BufferedReader br;
if(responseCode==200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
}else{ // 에러 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
System.out.println("response : " + response);
br.close();
con.disconnect();
}catch(Exception e){
e.printStackTrace();
}
}
위의 좌표를 구한 후 아래의 주소를 통해서 거리 측정
public static void main(String args[]){
double distanceMile = distance(37.533748117, 126.901166019, 37.528296499, 126.906114115, "mile"); //y,x
// 미터(Meter) 단위
double distanceMeter = distance(37.533748117, 126.901166019, 37.528296499, 126.906114115, "meter");
// 킬로미터(Kilo Meter) 단위
double distanceKiloMeter = distance(37.533748117, 126.901166019, 37.528296499, 126.906114115, "kilo");
}
/**
* 두 지점간의 거리 계산
*
* @param lat1 지점 1 위도
* @param lon1 지점 1 경도
* @param lat2 지점 2 위도
* @param lon2 지점 2 경도
* @param unit 거리 표출단위
* @return
*/
private static double distance(double lat1, double lon1, double lat2, double lon2, String unit) {
double theta = lon1 - lon2;
double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta));
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
if (unit == "kilo") {
dist = dist * 1.609344;
} else if(unit == "meter"){
dist = dist * 1609.344;
}
return (dist);
}
// This function converts decimal degrees to radians
private static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
// This function converts radians to decimal degrees
private static double rad2deg(double rad) {
return (rad * 180 / Math.PI);
}
단 거리 측정은 직선거리 기준으로 측정이 된다.
728x90
반응형
'Dev > JAVA' 카테고리의 다른 글
JAVA-String 숫자여부 Check (0) | 2020.07.24 |
---|---|
java-openCSV를 이용해서 CSV 읽기 (0) | 2020.07.24 |
java-Json Return Array or Object구분 (0) | 2020.07.22 |
Request Header 정보 조회 (0) | 2020.07.09 |
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException (0) | 2020.07.01 |