Python 获取 IOS/Iphone/Ipad等设备拍摄的HEIC图片的拍摄地址/坐标/位置以及python的googleEarth的xml文件绘制初步

这篇具有很好参考价值的文章主要介绍了Python 获取 IOS/Iphone/Ipad等设备拍摄的HEIC图片的拍摄地址/坐标/位置以及python的googleEarth的xml文件绘制初步。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

出去旅游,用iphone拍了非常多的照片,心想这些照片都有位置信息和拍摄时间信息,那能不能用python制作一个程序,输入所有照片,然后读取这些信息,最后输出一个xml路径文件,打开在googleEarth看。虽然最近逐步奉行“不讨论意义主义”,但我觉得此举的意义,首先是折腾python的乐趣,其次对于超长途旅行路线,能够结合更为宏观的视角来回顾本次旅行,譬如我发现原来我拍摄的地方,是甘肃和新疆的接壤,原来重庆在兰州的正下方偏东,原来我这次横跨了三个阶梯等等,能够带来许多乐趣。

csdn是程序员为主的博客平台,所以本文也会聚焦于这个程序,这个程序的功能在前言中已经有所概述,并且功能将会更丰富。定位是google Earth的小插件吧。能够输入照片,输出googleEarth使用的xml路径文件。

设计蓝图

主程序代码

主流程

参考文献:
How to extract GPS coordinates from Images in Python
How to extract GPS location from HEIC files?
一、获取单个HEIC文件的位置信息:
1.pillow库读取HEIC文件
2.获得照片拍摄的坐标,格式是Degrees, minutes, and seconds (DMS)
e.g.

(11.0, 53.0, 7.42199999)

3.将(DMS)格式坐标转化为 Decimal degrees (DD)格式。
e.g.

(43.46715666666389, 11.885394999997223)

4.坐标纠偏
5.难点:如何获得HEIC文件的拍摄时间?
根据如下这篇文章《python exif不能找到heic的“date taken”也就是拍摄时间,但是在windows资源管理器下却是可见的》
Python EXIF can’t find HEIC file date taken, but it’s visible in other tools
采用了如下方法:

import exifread

with open(filename, 'rb') as image:
  exif = exifread.process_file(image)

但是报错,报错如下,并找到了解决方案也如下
exifread.process_file() throws “KeyError: ‘hdlr’” and “NoParser: hdlr Output is truncated.” for a HEIC image even though exifread can deal with HEIC
解决方案如原文:

This is just to share what I found on the net to fix this. Check HEIC processing error: hdlr on Apple Silicon #4.

Thus, you should downgrade to a version below 3.0.0:
也就是要将exifread降级到3以下,3以下最新的就是pip install exifread==2.3.2

然后不再报错

最终程序:文章来源地址https://www.toymoban.com/news/detail-832866.html

import simplekml
import exifread
import os
from PIL import Image
from pillow_heif import register_heif_opener
register_heif_opener()

list2 = [('1', 51.500152, -0.126236), ('2', 1.500152, -50.126236)]
img_path = r'F:\trippicProject\pic\IMG_4563.HEIC'
HEICpath = r'F:\trippicProject\pic'

# 该函数用于将pillow获取的gps tag(DMS格式)转化为Decimal degrees (DD)(x,y)的格式
# you will get the coordinates in Degrees, minutes, and seconds (DMS). We will soon convert this format to Decimal degrees (DD) format.
def decimal_coords(coords, ref):
    decimal_degrees = float(coords[0]) + float(coords[1]) / 60 + float(coords[2]) / 3600
    if ref == 'S' or ref == 'W':
        decimal_degrees = -decimal_degrees
    return decimal_degrees


def get_heicGeoCoords(heicPath):
    image = Image.open(heicPath)
    image.verify()

    exif = image.getexif().get_ifd(0x8825)
    geo_tagging_info = {}
    if not exif:
        raise ValueError("No EXIF metadata found")
    else:
        gps_keys = ['GPSVersionID', 'GPSLatitudeRef', 'GPSLatitude', 'GPSLongitudeRef', 'GPSLongitude',
                    'GPSAltitudeRef', 'GPSAltitude', 'GPSTimeStamp', 'GPSSatellites', 'GPSStatus', 'GPSMeasureMode',
                    'GPSDOP', 'GPSSpeedRef', 'GPSSpeed', 'GPSTrackRef', 'GPSTrack', 'GPSImgDirectionRef',
                    'GPSImgDirection', 'GPSMapDatum', 'GPSDestLatitudeRef', 'GPSDestLatitude', 'GPSDestLongitudeRef',
                    'GPSDestLongitude', 'GPSDestBearingRef', 'GPSDestBearing', 'GPSDestDistanceRef', 'GPSDestDistance',
                    'GPSProcessingMethod', 'GPSAreaInformation', 'GPSDateStamp', 'GPSDifferential']

        for k, v in exif.items():
            try:
                geo_tagging_info[gps_keys[k]] = v
            except IndexError:
                pass
        coords = (decimal_coords(geo_tagging_info['GPSLatitude'], geo_tagging_info['GPSLatitudeRef']), decimal_coords(geo_tagging_info['GPSLongitude'], geo_tagging_info['GPSLongitudeRef']))
        return coords


def get_heicTime(heicPath):
    pic_data = exifread.process_file(open(heicPath, 'rb'))
    time = pic_data['Image DateTime']
    time_stamp = str(time)[2:4] + str(time)[5:7] + str(time)[8:10] + str(time)[11:13] + str(time)[14:16] + str(time)[17:19]
    return time_stamp


if __name__ == '__main__':

    imgs = os.listdir(r'F:\trippicProject\pic')

    dateDatas = []
    date2Details = {}
    for imgName in imgs:
        if imgName[-4:] == 'HEIC':
            try:
                img_path = HEICpath + '\\' + imgName

                thisTime = get_heicTime(img_path)
                thisCoords = get_heicGeoCoords(img_path)

                dateDatas.append(int(thisTime))
                date2Details[thisTime] = [thisCoords, imgName]
                print("Done=>"+imgName)
            except ValueError:
                print("No EXIF metadata found=>"+imgName)
    dateDatas.sort()


    kml = simplekml.Kml()
    lin = kml.newlinestring(name="trip")
    lin.extrude = 1
    lin.altitudemode = simplekml.AltitudeMode.clamptoground
    lin.style.linestyle.width = 5
    lin.style.linestyle.color = simplekml.Color.blue

    for date in dateDatas:
        coords = date2Details[str(date)][0]
        pnt = kml.newpoint(description='test', coords=[(coords[1], coords[0])])
        description = '<![CDATA[<img style="max-width:500px;" src="file:///F:/trippicProject/jpg/' + date2Details[str(date)][1][:-5] +'.jpg">]]>'
        pnt.description = description
        lin.coords.addcoordinates([(coords[1], coords[0])])
    kml.save("test.kml")



到了这里,关于Python 获取 IOS/Iphone/Ipad等设备拍摄的HEIC图片的拍摄地址/坐标/位置以及python的googleEarth的xml文件绘制初步的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【iOS】Mac M1安装iPhone及iPad的app时设置问题

    由于 苹果M1芯片的Mac可用安装iPhone以及iPad应用,因为开发者并没有适配Mac,因此产生了很多奇怪问题,这里总结归纳Mac M1安装iPhone和iPad应用时遇到的问题。 1, Mac M1安装的app后,用除了苹果鼠标及触控板之外的鼠标操作app时tableviewcell无法拖动侧滑问题 1,首先打开app 2,co

    2024年02月07日
    浏览(48)
  • uniapp:蓝牙设备ios与安卓端deviceId不一致问题及ios端获取蓝牙mac地址方法

    在uniapp开发项目中,主要是指APP端,使用API接口: uni.getBluetoothDevices 或者 uni.onBluetoothDeviceFound 查找到的蓝牙设备数据里deviceId值不一样: 在安卓中deviceId即mac地址 在ios中deviceId即uuid 如何在ios端也能获取到mac地址? 通常情况下,蓝牙设备必定是有独一无二的mac地址,只是在

    2024年02月09日
    浏览(48)
  • 高效学习之anki新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、相关资料

    最近在使用Anki刷题(开源社区软件,不用有停更的,后顾之忧)备考,自己主要在移动端(ipad、iphone)使用,但是网上很多资料都是电脑端或安卓端的,不能直接拿来使用,所以随笔记录和总结了一些自己使用Anki的一些最基本的使用方法(基本功能会用就可以了,不需要太

    2024年02月08日
    浏览(50)
  • 高效学习工具之AnkiMobile新手入门指南(ios端,包括ipad、ihpone设备)————创建、使用、备份、设置参数、相关资料

    最近在使用Anki刷题(开源社区软件,不用有停更的,后顾之忧)备考,自己主要在移动端(ipad、iphone)使用,但是网上很多资料都是电脑端或安卓端的,不能直接拿来使用,所以随笔记录和总结了一些自己使用Anki的一些最基本的使用方法(基本功能会用就可以了,不需要太

    2024年02月06日
    浏览(63)
  • heic图片转换

    问题: heic图片在微信小程序端不能回显也不能上传成功。 Heic格式是苹果专门为iOS11开发的照片格式。Heic是苹果iOS和macOS的一种文件格式,用于处理图像和视频。Heic是H.264和JEP格式,取代了IOS 11系统中的原始视频和照片。Heic格式不仅可以节省内存,还可以保留原始图像质量。

    2024年02月09日
    浏览(25)
  • 在微信小程序使用fixed布局固定input 输入框,iPhone ios系统无法获取焦点问题解决。

    问题 微信小程序 是fixed布局后 ios版本 input 输入框 无法选中 但是长按可以获取焦点 。 解决 查看微信小程序开发文档 对input的介绍 https://developers.weixin.qq.com/miniprogram/dev/component/input.html 发现了 always-embed 属性 强制 input 处于同层状态,默认 focus 时 input 会切到非同层状态 (仅在

    2024年02月12日
    浏览(56)
  • 【深度学习】python使用opencv调用摄像头拍摄并保存图片

    打开pycharm,新建一个camerm.py文件,把下面代码复制粘贴进去就可以了。 需要安装两个库:pip install opencv-python;pip install numpy

    2024年02月11日
    浏览(42)
  • 使用终端命令行获取iOS设备CPU型号

    型号和架构的步骤如下: 1. 确保你的电脑连上了iOS设备,并通过USB线连接。 2. 打开终端应用程序。 3. 输入以下命令: 4. 这个命令会列出所有连接的iOS设备的UDID号码,类似这样: 5. 选择你需要获取CPU型号和架构的设备,复制它的UDID号码,例如:    B8EE1CBF-80E1-4E24-8A9A-29409

    2024年02月08日
    浏览(50)
  • iPhone(iPad)安装deb文件

    最简单的方法就是把deb相关的文件拖入手机对应的目录,一般是DynamicLibraries文件夹 参考:探讨手机越狱和安装deb文件的几种方式研究 打包 deb 教程之在 Mac 上安装 dpkg 命令_xcode打包root权限deb_qq_34810996的博客-CSDN博客 用法:dpkg-deb -R deb dir 参考:https://blog.csdn.net/luomoweilan/arti

    2024年02月12日
    浏览(43)
  • iOS-利用蒲公英工具,异地获取设备的udid

    在工作中经常会遇到需要给客户打包验收。 客户在外地,并且只有一个苹果手机。 蒲公英获取手机udid 1、https://www.pgyer.com/tools/udid?sl=65Gc 先扫码安装一下这个文件,我需要获取一下手机的udid号。这样用蒲公英打包的APP 你才能安装。 2、打开连接–同意下载安装,之后 再去手

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包