안녕하세요.
오늘은 사진 이미지 파일에서 GPS 정보를 추출하여 주소로 변환하는 방법에 대해 설명해보겠습니다.
여기서는 크게 두가지 기술로 나눠집니다.
- metadata-extractor를 통한 GPS 데이터 추출
- 좌표를 카카오 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키를 발급받으셔야 합니다.
발급받으시면 여기서 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
콘솔로 찍어보면 주소가 잘 나오며,
게시판 상세보기 페이지에서도 변수에 담아 출력하면 잘 출력되는 것을 확인할 수 있습니다!
'JAVA' 카테고리의 다른 글
[Java] 텍스트 내용을 엑셀로 전환 방법 (영상) (0) | 2022.05.31 |
---|---|
[JAVA] VO객체의 변수와 변수의 값 출력 방법 (0) | 2022.05.20 |
[JAVA] HTML 태그 변환 방법!! (>,<,", ,&) (0) | 2022.03.10 |
[Linux] Unzip 설치 및 사용방법!! (0) | 2022.03.10 |
[JAVA] 엑셀파일 업로드 및 DB insert 방법!! (영상 有) (16) | 2022.01.26 |
댓글