[위도,경도,시간]비전공자도 가능한 파이썬으로 사진 위도,경도 시간 알아내기

리냥·2023년 7월 23일
0

안녕하세요!

오늘은 비전공자도 가능한 파이썬으로 사진 위도, 경도 시간을 알아내려고 합니다.



[정리 전]

KakaoTalk_2022-05-06 14-58-50.jpg

[정리 후]

시흥시_은행동_2022-06-04 14-06-00.jpg


이렇게 위도경도, 시간을 알아낸 후 사진 이름을 변경하려고 하는데요


<개발 프로세스>

  1. 사진에서 정보 추출
  • 위도, 경도(GPS 정보 추출) 추출
  • 시간
  1. 위도, 경도 -> 주소로 변환
  2. 파일이름 변경
  • 변경 전:KakaoTalk_2022-05-20 14-22-57.jpg
  • 변경후:아산시_구령리_2022-05-20 14-22-57.jpg

로 지정했습니다.



1. 사진 정보 추출


먼저 사진 정보를 추출하려고 합니다.


from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS

image = Image.open(r'./사진/KakaoTalk_2022-06-04 14-06-00.jpg')
info = image._getexif() #이미지 메타정보
info


이미지 처리를 위해서 **'Pillow'**라이브러리를 사용합니다.

Pillow란 파이썬 이미지 처리 라이브로 아래 코드를 통해 설치합니다.

!pip install pillow

이후 pillow를 불러오려는데요, 코드는 아래처럼 사용됩니다.

from PIL import Image

이어 이미지 메타정보를 읽을 수 있는 (Exif) 코드를 작성합니다.

from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS

이후 사용할 사진과 사진의 정보를 불러옵니다.

image = Image.open(r'./사진/KakaoTalk_2022-06-04 14-06-00.jpg')
info = image._getexif() #이미지 메타정보
info

그럼 이렇게 사진에 대한 값이 출력됩니다.


2. 파일 속성 정보 디코딩


이제 파일 속성 정보를 디코딩하려 합니다.

from PIL.ExifTags import TAGS
for tag,value in info.items():
    # print(value)
    decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
    print(tag,decoded,value)

방금보다 훨씬 낫죠?


3. GPS 정보 추출


이제 GPS 정보를 불러오려 합니다.

# GPSInfo 정보 추출

from PIL.ExifTags import TAGS
for tag,value in info.items():
    # print(value)
    decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
    # print(tag,decoded,value)

    if decoded == 'GPSInfo':
        print(f'{decoded}:{value}')

이런 식으로 GPSInfo가 출력됩니다.

좀 더 깨끗하게 보기 위해서 위도와 경도를 분리합니다.

# GPSInfo 정보 추출(위도, 경도)
from PIL.ExifTags import TAGS
for tag,value in info.items():
    # print(value)
    decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
    # print(tag,decoded,value)

    if decoded == 'GPSInfo':
        # print(f'{decoded}:{value}')
        gps_lat =  value.get(2) #위도
        gps_lon =  value.get(4) #경도


print(gps_lat,gps_lon)

마지막으로 위도와 경도 값을 보정해줍니다.


# 위도 경도 값 보정 (도,분,초) 1도는 60분이며, 1분은 60초이다. 1도 = 60분 = 3600초

lat = (((gps_lat[2] / 60.0 ) +  gps_lat[1]) / 60.0) + gps_lat[0]
lon = (((gps_lon[2] / 60.0 ) +  gps_lon[1]) / 60.0) + gps_lon[0]


4. 지오코드 사용


이제 위도, 경도에서 주소로 변환시키려 합니다.

이를 위해 먼저 지오코드 설치가 필요합니다.

https://pypi.org/project/geopy/


%pip install geopy

먼저 이 코드를 이용해서 설치해 준 다음,

링크의 이 부분을 이용하려고 합니다.

# 지오코드 사용법 살펴보기
# 주소를 위도 경도로 변환

from geopy.geocoders import Nominatim

# test = '구로구 디지털로 27'
test = '강남구 학동로 346'
geolocator = Nominatim(user_agent='South Korea') # user_agent는 식별가능 문자열(아무 문자열)
location = geolocator.geocode(test)

latitude = location.latitude #위도
longitude = location.longitude #경도

print(latitude,longitude )

를 하면 아래 값이 추출됩니다.


lat_lng_str = f'{latitude},{longitude}' #위도 경도 문자열
loc = geolocator.reverse(lat_lng_str)
loc.address

한번 더 정제하면 이렇게 값이 추출됩니다.


5. Datetime 활용


위도와 경도 값도 추출했으니, 이제 시간 정보를 얻으려 합니다.
날짜 정보는 datetime을 이용합니다.

datetime 모듈은 날짜, 시간을 다루며 별도의 설치 과정이 필요 없습니다. 단순히 import를 하면 됩니다.

import datetime

그중에서 datetime.datetime.strptime()은 문자열로 되어 있는 날짜 또는 시간을 데이터 타임으로 변환합니다.


datetime.datetime.strftime()은 datetime 객체를 원하는 형식의 문자열로 표현할 수 있도록 돕습니다.


# 2022-06-04 14-06-00
import datetime
from PIL.ExifTags import TAGS
for tag,value in info.items():
    # print(value)
    decoded = TAGS.get(tag,tag) #태그숫자를 디코딩
    # print(tag,decoded,value)

    if decoded == 'DateTime':
        # print(f'{decoded}:{value}')
        print(value)
        dt = datetime.datetime.strptime(value,"%Y:%m:%d %H:%M:%S")
        dtime = dt.strftime("%Y-%m-%d %H-%M-%S")
        print(dtime)


6. 종합코드

from PIL import Image #파이썬 이미지 라이브러리(Python Image Library)
from PIL.ExifTags import TAGS
from geopy.geocoders import Nominatim

import datetime
from glob import glob
import os

flist = glob(r'사진\*.jpg')

for fname in flist:

    lat, lon, pictime = getPicInfo(fname)
    si,do = getAddress(lat,lon)
    # print(lat, lon, pictime)
    # print(si,do)
    newfname = f'사진\\{si}_{do}_{pictime}.jpg'
    # print(newfname)

    os.rename(fname,newfname)

감사합니다!

profile
안녕하세요. 일로 인해 잠시 쉽니다 :)

0개의 댓글