본문 바로가기
JAVA

[JAVA] 이미지 파일 GPS정보 추출 & 주소 출력 방법

by GoodDayDeveloper 2022. 4. 5.
반응형

 

안녕하세요.

오늘은 사진 이미지 파일에서 GPS 정보를 추출하여 주소로 변환하는 방법에 대해 설명해보겠습니다.

여기서는 크게 두가지 기술로 나눠집니다.

 

  1. metadata-extractor를 통한 GPS 데이터 추출
  2. 좌표를 카카오 API를 이용한 주소 변환 작업

 

라이브러리와 API를 활용하는 만큼 활용방법만 알면 그리 어렵지 않습니다.

차례차례 정리해보겠습니다!

 

 

 


 

 

 

metadata-extractor를 통한 GPS 데이터 추출

 

 

 

metadata-extractor란

미디어 파일로부터 metadata를 읽어들이는 java 라이브러리입니다.

이 라이브러리를 이용하여 이미지의 GPS상의 좌표를 추출할 계획입니다.

 

 

 

 

 

pom.xml

 

 

1
2
3
4
5
<dependency>
    <groupId>com.drewnoakes</groupId>
    <artifactId>metadata-extractor</artifactId>
    <version>2.9.1</version>
</dependency>
cs

 

우선 라이브러리를 활용하기 위해, pom.xml에서 의존성으로 metadata-extractor를 주입시킵니다.

 

 

 

 

 

 

JAVA

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String fileScope = "/home/board/board_202204050945274080"
 
String pdsLat = "";
String pdsLon = "";
 
File file = new File(fileScope);
 
Metadata metadata = ImageMetadataReader.readMetadata(file);
GpsDirectory gpsDirectory = metadata.getFirstDirectoryOfType(GpsDirectory.class);
 
//위도,경도 호출
if(gpsDirectory.containsTag(GpsDirectory.TAG_LATITUDE) && gpsDirectory.containsTag(GpsDirectory.TAG_LONGITUDE)) {
 
pdsLat = String.valueOf(gpsDirectory.getGeoLocation().getLatitude());
pdsLon = String.valueOf(gpsDirectory.getGeoLocation().getLongitude());
 
double lat = Double.parseDouble(pdsLat);    //위도
double lon = Double.parseDouble(pdsLon);    //경도
 
String addr = convertAddr(lon,lat);
      
}
cs

 

fileScope 변수에 파일이 저장되어 있는 위치와 파일명을 작성해줍니다.

그리고 ImageMetadataReader.readMetadata를 통하여 메타데이터를 metadata에 넣어줍니다.

 

그럼 위와 같이 배열리스트 형태로 여러 정보가 담기게 됩니다.

그 중에서 GpsDirectory 객체를 활용하여 GPS 정보를 넣어주는 겁니다.

 

 

만약 위도경도 정보가 있다면

pdsLat 와 pdsLon  변수에 위도 경도 정보를 넣어준다음

계산하기위해 double 타입으로 변경하여 다시 변수에 넣어줍니다.

 

그럼 이미지와 같이 좌표정보를 얻을 수가 있습니다.

 

 

그리고 정보를 얻기 위해 convertAddr메서드를 실행시킵니다.

(convertAddr메서드는 카카오 API활용부분이기에 아래서 다루겠습니다.)

 

 

 

 

좌표를 카카오 API를 이용한 주소 변환 작업

 

 

 

카카오 API를 사용하기 위해서는 KakaoDevelopers 에서 API키를 발급받으셔야 합니다.

 

 

https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

발급받으시면 여기서 REST API키를 사용하시면 됩니다!

 

 

 

반응형

 

 

 

JAVA

 

1
2
3
4
5
6
7
8
9
10
11
public static String convertAddr(double x, double y){
    String url = "https://dapi.kakao.com/v2/local/geo/coord2address.json?x="+x+"&y="+y+"&input_coord=WGS84";
    String addr = "";
    try{
        addr = getPassingAddress(getJSONData(url));
    }catch(Exception e){
        logger.error("에러 발생", e);
        e.printStackTrace();
    }
    return addr;
}
cs

 

convertAddr 메서드는 URL에 좌표를 넣고 

getJSONData와 getPassingAddress를 활용하여 JSON 데이터를 String으로 반환 받는 부분입니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 private static String getJSONData(String apiUrl) throws Exception {
    String jsonString = new String();
    String buf;
    String apikey = "REST API 키를 입력해주세요!";
    URL url = new URL(apiUrl);
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    String auth = "KakaoAK "+apikey;
    conn.setRequestMethod("GET");
    conn.setRequestProperty("X-Requested-With""curl");
    conn.setRequestProperty("Authorization", auth);
    
    BufferedReader br = new BufferedReader(new InputStreamReader(
            conn.getInputStream(), "UTF-8"));
    while ((buf = br.readLine()) != null) {
        jsonString += buf;
    }
    return jsonString;
}
cs

 

getJSONData는 url정보에 발급받은 REST API 키 정보를 넣어줘서 데이터를 출력하는 부분입니다.

출력 데이터자체가 JSON 데이터 구조로 되어있습니다. 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 private static String getPassingAddress(String jsonString) {
    String value = "";
    JSONObject jObj = (JSONObject) JSONValue.parse(jsonString);
    JSONObject meta = (JSONObject) jObj.get("meta");
    long size = (long) meta.get("total_count");
    if(size>0){
        JSONArray jArray = (JSONArray) jObj.get("documents");
        JSONObject subJobj = (JSONObject) jArray.get(0);
        JSONObject roadAddress =  (JSONObject) subJobj.get("road_address");
        if(roadAddress == null){
            JSONObject subsubJobj = (JSONObject) subJobj.get("address");
            value = (String) subsubJobj.get("address_name");
        }else{
            value = (String) roadAddress.get("address_name");
        }
        if(value.equals(""|| value==null){
            subJobj = (JSONObject) jArray.get(1);
            subJobj = (JSONObject) subJobj.get("address");
            value =(String) subJobj.get("address_name");    
        }
    }
    return value;
}
cs

 

getPassingAddress에서는 JSON데이터를 String으로 변환하는 부분입니다.

 

 

 

 

 

아래는 주소 검색을 위한 개발가이드이니 참고해주세요~

https://developers.kakao.com/docs/latest/ko/local/dev-guide

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

 

콘솔로 찍어보면 주소가 잘 나오며,

 

 

 

게시판 상세보기 페이지에서도 변수에 담아 출력하면 잘 출력되는 것을 확인할 수 있습니다!

 

 

 

반응형

댓글