前提・実現したいこと
djangoを使って、投稿した写真のEXIF情報をもとにGoogleMap上にその写真を撮影した位置をマーキングするWebアプリを開発しております。
発生している問題・エラーメッセージ
実際に作ってみたところ、スマホで撮影した写真を一旦PCに移動させて、PCから投稿した場合は正しく位置が表示されているのですが、スマホから直接投稿した場合には位置情報が消えているのか正しく表示できません。
色々調べたところ、Webブラウザに写真を直接アップするとEXIF情報が消えることがあるようなのですが、PCに移行せずとも、スマホから直接アップしてもEXIF情報を消さずに参照できる方法はありませんでしょうか?
該当のソースコード
views
1def post(request): 2 if request.method == 'POST': 3 4 image = request.FILES['images'] #画像の取得 5 6 msg = Message() #メッセージに格納 7 msg.upimage = image 8 9 #写真のEXIF情報から緯度、経度を取得 10 lat,lon = get_exif_of_image(image) 11 msg.latitude = lat 12 msg.longitude = lon 13 14 msg.save() 15 16 messages.success(request,'新しいメッセージを投稿しました') 17 18 return redirect(to='/maptest') 19 20 else: 21 form = PostForm(request.user,request.FILES) 22 23 params={ 24 'login_user':request.user, 25 'form':form, 26 } 27 return render(request,'maptest/post.html',params) 28 29 30#画像から位置情報を取得する関数 31def get_exif_of_image(fname): 32 im = Image.open(fname) 33 exif = im._getexif() 34 35 lat = 0 36 lon = 0 37 38 for id,value in exif.items(): 39 if id==34853: 40 N1 = value[2][0][0] 41 N2 = value[2][1][0] 42 N3 = value[2][2][0] 43 E1 = value[4][0][0] 44 E2 = value[4][1][0] 45 E3 = value[4][2][0] 46 lat = N1+(N2*60+N3)/3600 47 lon = E1+(E2*60+E3)/3600 48 49 return lat,lon
models
1from django.contrib.gis.db import models 2from django.contrib.auth.models import User 3 4class Message(models.Model): 5 owner = models.ForeignKey(User,on_delete=models.CASCADE,related_name='message_owner') 6 latitude = models.DecimalField(max_digits=9, decimal_places=6) 7 longitude = models.DecimalField(max_digits=9, decimal_places=6) 8 mes_title = models.CharField(max_length=50,default='non title') 9 upimage = models.ImageField(upload_to='images/',null=True, blank=True) 10 pub_date = models.DateTimeField(auto_now_add=True) 11 12 def __str__(self): 13 return str(self.content) + '(' + str(self.owner) + ')' 14 15 class Meta: 16 ordering = ('-pub_date',) 17
試したこと
当初、get_exif_of_image関数内でlatとlonの初期値を設定してなかったので、スマホから直接アップするとEXIF情報がとれずにエラーがでてました。
djnagoの管理ページから投稿した内容を見ると、緯度と経度に初期値が入っていたので、スマホから直接アップした場合はEXIFが消えてる、もしくは参照できてないのでは、と想定しました。
追記:
スマホはiphoneでOSはiOS13.5.1です。カメラの位置情報サービスはオンにしています。
位置情報サービス以外にも変更しないといけない設定などもあるのか調べてみます。
補足情報(FW/ツールのバージョンなど)
python3.7
django2.1
centOS7
VPS:さくらVPS
スマホOS:iOS13.5.1
写真はVPSにアップされるようになっています。
あなたの回答
tips
プレビュー