애플의 아이폰은 일반적인 디지털카메라나 핸드폰과 다르게 GPS모듈을 담고 있기 때문에 사진을 찍으면 노출정보, 색상프로필, 찍은 날짜, 기종, 모델 등의 정보외에 위도/경도/고도정보를 JPG의 EXIF정보에 담아 저장합니다. 즉, 사진을 찍으면 언제, 어디서 찍었는지를 JPG안에 담아 두는 것이지요. 물론 ACDSee 등에서 이 JPG를 가공하더라도 특별히 이 메타정보를 지우지 않는한 계속유지됩니다. 그래서 사생활 보호에 민감한 이슈가 되는 것이고, 방송통신위원회에서 애플의 위치정보사업자 허가를 고민했던 것입니다. 가령, 어떤 여학생이 "우리집에서 찍은 내얼굴" 이란 사진을 공개된 카페 등에 업로드했는데 변태남이 이 사진에서 위치정보를 추출하여 위도/경도를 기초로 이 여학생이 사는 집의 위치, 주소를 쉽게 파악하여 스토킹을 할 수 있는 다소 위험(?)한 상황도 나올 수 있는 것이죠.
그래서 아이폰에서 찍은 사진은 반드시 인터넷에 공개하기 전에 이미지 편집소프트웨어, 뷰어 등으로 이런 위치정보를 반드시 제거하길 적극 권해 드립니다. 그렇지만 잘만 활용하면 다양한 재미있는 서비스를 할 수 있는데 오늘은 아이폰으로 찍은 사진에서 위치정보를 추출하여, 구글지도에 위치를 찍어보도록 하겠습니다. 물론 코드는 ColdFusion코드입니다. ㅋ
ColdFusion은 ImageGetEXIFMetaData()을 지원하여 다른 언어보다 쉽게 JPG의 EXIF정보를 추출할 수 있도록 제공합니다. 이 메타정보중에 필요한 것이 위도, 경도 정보인데 제가 지리학을 잘 몰라서 고등학교때 배운지식으로만 접근하다보니 난관이 있었습니다. ImageGetEXIFMetaData() 함수를 이용해서 위도 35도10분55초 와 같은 정보를 추출하는 것은 두어줄의 코드면 끝나지만, 구글맵은 이런 좌표를 사용하지 않더군요. 이 관계를 이해하는데 꼬박 하루가 걸렸습니다. 아무리 검색을 해봐도 이와같은 고민을 하는 분은 대한민국에는 없는듯.. ㅠㅠ;(엄마 나 똘아인가봐 ㅠㅠ;)
어찌되었든 도/분/초 단위를 도/도 단위로 변경해야 하는 것은 지리전문 웹사이트에서 알았고, 간단한 변환유틸도 받아 테스트 해 보았습니다. (첨부파일안에 실행파일로 있습니다.) 우선 금강산도 식후경이라고 일단 데모 샘플을 한 번 보시죠.
Demo View
Source Code Download
위 샘플에서 보시면 사무실 옥상에서 제가 촬영한 리사이즈된 이미지가 있는데 이 이미지의 EXIF정보중에서 기종, 모델, 날짜, 위치 등을 추출하여 보여주고 있습니다. 저희 사무실 주소가 광주광역시 동구 남동 44번지 인데 오차범위인 5M이내에서 정확하게 위치를 찍어줍니다. 아이폰 너무 무섭습니다.ㅋㅋ

자, 이제 코드를 보도록 하죠. 코드는 간단합니다. 이미지를 서버상에서 읽어와 EXIF정보를 추출한 다음, 위도/경도 정보를 DMS형식에서 DD형식으로 변환하여 구글맵의 URL정보로 던져주는 코드입니다. DMS정보와 DD정보의 관계는 첨부된 위/경도 좌표변환기gkdtcc-kgrz.exe를 참조해 보세요.
<!--- Unicode환경으로 설정 --->
<cfprocessingdirective pageencoding="utf-8">
<cfcontent type="text/html; charset=utf-8">
<cfset setEncoding("URL", "utf-8")>
<cfset setEncoding("Form", "utf-8")>
<!--- 이미지경로에서 이미지 불러오기 --->
<cfimage action="read" source="#ExpandPath("./images/sample.jpg")#" name="sample_img">
<!--- ImageGetEXIFMetaData 함수로 이미지정보 추출--->
<cfset exifinfo = ImageGetEXIFMetaData(#sample_img#)>
<!--- ImageGetEXIFMetaData 함수로 추출한 정보 덤프 --->
<cfdump var="#exifinfo#">
<br />
<!--- ImageGetEXIFMetaData 함수에서 GPS정보만 따로 추출 --->
<cfset latitude="#ImageGetExifTag(sample_img, "GPS Latitude")#">
<cfset longitude="#ImageGetExifTag(sample_img, "GPS Longitude")#">
<br />
<!--- 카메라 제조사 정보출력 --->
<strong>카메라 제조사</strong> :
<cfif #exifinfo.Make# NEQ ""><cfoutput>#exifinfo.Make#</cfoutput><cfelse>정보없음</cfif>
<br />
<!--- 카메라 모델 정보출력 --->
<strong>카메라 모델</strong> :
<cfif #exifinfo.Model# NEQ ""><cfoutput>#exifinfo.Model#</cfoutput><cfelse>정보없음</cfif>
<br />
<!--- 실제 촬영일자 정보출력 --->
<strong>찍은 날짜</strong> :
<cfif #ImageGetExifTag(sample_img, "Date/Time Original")# NEQ "">
<cfoutput>#ImageGetExifTag(sample_img, "Date/Time Original")#</cfoutput>
<cfelse>
정보없음
</cfif>
</br>
<!--- 찍은 위치의 고도(Altitude) 정보출력 --->
<strong>찍은 고도</strong> :
<cfif #ImageGetExifTag(sample_img, "GPS Altitude")# NEQ "">
<cfoutput>해발 #ImageGetExifTag(sample_img, "GPS Altitude")#</cfoutput>
<cfelse>
정보없음
</cfif>
<br />
<!--- 찍은 위치의 위도(Latitude) 정보출력 --->
<strong>위도</strong> :
<cfif #lat# NEQ ""><cfoutput>#latitude#</cfoutput><cfelse>정보없음</cfif>
</br>
<!--- 찍은 위치의 경도(Longitude) 정보출력 --->
<strong>경도</strong> :
<cfif #lng# NEQ ""><cfoutput>#longitude#</cfoutput><cfelse>정보없음</cfif>
</br>
<!--- DMS(도, 분, 초 단위)의 위/경도 정보를 구글맵스가 인식하는 DD(도/도) 정보로 변환 --->
<cfset GPSLatitude = (listlast(latitude, chr(34)&chr(39))/60 + listgetat(latitude, 2, chr(34)&chr(39)))/60 + listfirst(latitude, chr(34)&chr(39))>
<cfset GPSLongitude = (listlast(longitude, chr(34)&chr(39))/60 + listgetat(longitude, 2, chr(34)&chr(39)))/60 + listfirst(longitude, chr(34)&chr(39))>
<!--- 변환된 좌표값을 구글지도의 좌표URL변수에 할당 --->
<strong>지도에서 찍은 위치 보기</strong> : <a href="http://maps.google.com/maps?q=<cfoutput>#GPSLatitude#</cfoutput>,+<cfoutput>#GPSLongitude#</cfoutput>+%28%BB%E7%C1%F8%C0%BB%20%C2%EF%C0%BA%20%B0%F7%20%C0%D4%B4%CF%B4%D9%29&iwloc=A&hl=ko" target="_blank">새창</a>
<br />
<br />
<!--- 원본 이미지 출력 --->
<img src="./images/sample.jpg" />
<br />
<br />