検索
ホームページバックエンド開発Python チュートリアルPythonを使用して写真が撮影されたときの詳細な位置を取得する方法

    一.引言

    我们的朋友给我们发来一张照片我们如何获取到她的位置呢?

    用手机拍照会带着GPS信息,原来没注意过这个,因此查看下并使用代码获取照片里的GPS信息

    查看图片文件属性

    Pythonを使用して写真が撮影されたときの詳細な位置を取得する方法

    1.读取照片信息,获取坐标

    ExifRead

    Python library to extract EXIF data from tiff and jpeg files.

    安装

    pip install exifread

    读取GPS

    import exifread
    import re
    
    def read():
        GPS = {}
        date = ''
        f = open("C:\\Users\\24190\\Desktop\\小朱学长.jpg",'rb')
        contents = exifread.process_file(f)
        for key in contents:
            if key == "GPS GPSLongitude":
                print("经度 =", contents[key],contents['GPS GPSLatitudeRef'])
            elif key =="GPS GPSLatitude":
                print("纬度 =",contents[key],contents['GPS GPSLongitudeRef'])
            #print(contents)
    read()

    运行

    Pythonを使用して写真が撮影されたときの詳細な位置を取得する方法

    我们得到了一个简易的gps地址

    如果想要读取全部的拍摄信息:

    # 读取照片的GPS经纬度信息
    def find_GPS_image(pic_path):
            GPS = {}
            date = ''
            with open(pic_path, 'rb') as f:
                    tags = exifread.process_file(f)
                    for tag, value in tags.items():
                            # 纬度
                            if re.match('GPS GPSLatitudeRef', tag):
                                    GPS['GPSLatitudeRef'] = str(value)
                            # 经度
                            elif re.match('GPS GPSLongitudeRef', tag):
                                    GPS['GPSLongitudeRef'] = str(value)
                            # 海拔
                            elif re.match('GPS GPSAltitudeRef', tag):
                                    GPS['GPSAltitudeRef'] = str(value)
                            elif re.match('GPS GPSLatitude', tag):
                                    try:
                                            match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
                                            GPS['GPSLatitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
                                    except:
                                            deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
                                            GPS['GPSLatitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
                            elif re.match('GPS GPSLongitude', tag):
                                    try:
                                            match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
                                            GPS['GPSLongitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
                                    except:
                                            deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
                                            GPS['GPSLongitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
                            elif re.match('GPS GPSAltitude', tag):
                                    GPS['GPSAltitude'] = str(value)
                            elif re.match('.*Date.*', tag):
                                    date = str(value)
            return {'GPS_information': GPS, 'date_information': date}

    2.通过baidu Map的API将GPS信息转换成地址。

    众所周知gps和百度的经纬度会有误差,那么我们需要调用百度转换接口,这个百度目前没有开源。

    # 通过baidu Map的API将GPS信息转换成地址。
    def find_address_from_GPS(GPS):
            """
            使用Geocoding API把经纬度坐标转换为结构化地址。
            :param GPS:
            :return:
            """
            secret_k ey = 'XXX'
            if not GPS['GPS_information']:
                    return '该照片无GPS信息'
            lat, lng = GPS['GPS_information']['GPSLatitude'], GPS['GPS_information']['GPSLongitude']
            baidu_map_api = "http://api.map.baidu.com/geocoder/v2/?ak={0}&callback=renderReverse&location={1},{2}s&output=json&pois=0".format(
                    secret_key, lat, lng)
            response = requests.get(baidu_map_api)
            content = response.text.replace("renderReverse&&renderReverse(", "")[:-1]
            print(content)
            baidu_map_address = json.loads(content)
            formatted_address = baidu_map_address["result"]["formatted_address"]
            province = baidu_map_address["result"]["addressComponent"]["province"]
            city = baidu_map_address["result"]["addressComponent"]["city"]
            district = baidu_map_address["result"]["addressComponent"]["district"]
            location = baidu_map_address["result"]["sematic_description"]
            return formatted_address, province, city, district, location

    然后在主函数输出:

    Pythonを使用して写真が撮影されたときの詳細な位置を取得する方法

    二.源码附上!!!

    # coding=utf-8
    import exifread
    import re
    import json
    import requests
    import os
    
    
    # 转换经纬度格式
    def latitude_and_longitude_convert_to_decimal_system(*arg):
            """
            经纬度转为小数, param arg:
            :return: 十进制小数
            """
            return float(arg[0]) + ((float(arg[1]) + (float(arg[2].split('/')[0]) / float(arg[2].split('/')[-1]) / 60)) / 60)
    
    
    # 读取照片的GPS经纬度信息
    def find_GPS_image(pic_path):
            GPS = {}
            date = ''
            with open(pic_path, 'rb') as f:
                    tags = exifread.process_file(f)
                    for tag, value in tags.items():
                            # 纬度
                            if re.match('GPS GPSLatitudeRef', tag):
                                    GPS['GPSLatitudeRef'] = str(value)
                            # 经度
                            elif re.match('GPS GPSLongitudeRef', tag):
                                    GPS['GPSLongitudeRef'] = str(value)
                            # 海拔
                            elif re.match('GPS GPSAltitudeRef', tag):
                                    GPS['GPSAltitudeRef'] = str(value)
                            elif re.match('GPS GPSLatitude', tag):
                                    try:
                                            match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
                                            GPS['GPSLatitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
                                    except:
                                            deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
                                            GPS['GPSLatitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
                            elif re.match('GPS GPSLongitude', tag):
                                    try:
                                            match_result = re.match('\[(\w*),(\w*),(\w.*)/(\w.*)\]', str(value)).groups()
                                            GPS['GPSLongitude'] = int(match_result[0]), int(match_result[1]), int(match_result[2])
                                    except:
                                            deg, min, sec = [x.replace(' ', '') for x in str(value)[1:-1].split(',')]
                                            GPS['GPSLongitude'] = latitude_and_longitude_convert_to_decimal_system(deg, min, sec)
                            elif re.match('GPS GPSAltitude', tag):
                                    GPS['GPSAltitude'] = str(value)
                            elif re.match('.*Date.*', tag):
                                    date = str(value)
            return {'GPS_information': GPS, 'date_information': date}
    
    
    # 通过baidu Map的API将GPS信息转换成地址。
    def find_address_from_GPS(GPS):
            """
            使用Geocoding API把经纬度坐标转换为结构化地址。
            :param GPS:
            :return:
            """
            secret_ke y = 'zbLsuDDL4CS2U0M4KezOZZbGUY9iWtVf'
            if not GPS['GPS_information']:
                    return '该照片无GPS信息'
            lat, lng = GPS['GPS_information']['GPSLatitude'], GPS['GPS_information']['GPSLongitude']
            baidu_map_api = "http://api.map.baidu.com/geocoder/v2/?ak={0}&callback=renderReverse&location={1},{2}s&output=json&pois=0".format(
                    secret_key, lat, lng)
            response = requests.get(baidu_map_api)
            content = response.text.replace("renderReverse&&renderReverse(", "")[:-1]
            print(content)
            baidu_map_address = json.loads(content)
            formatted_address = baidu_map_address["result"]["formatted_address"]
            province = baidu_map_address["result"]["addressComponent"]["province"]
            city = baidu_map_address["result"]["addressComponent"]["city"]
            district = baidu_map_address["result"]["addressComponent"]["district"]
            location = baidu_map_address["result"]["sematic_description"]
            return formatted_address, province, city, district, location
    
    if __name__ == '__main__':
            GPS_info = find_GPS_image(pic_path='小朱学长.jpg')
            address = find_address_from_GPS(GPS=GPS_info)
            print("拍摄时间:" + GPS_info.get("date_information"))
            print('照片拍摄地址:' + str(address))

    注意事项

    1.照片的地址信息等,一般的手机相机默认是打开的。

    2.微信和QQ里面发送原图,信息都会完整的保留下来。

    3.代码里面需要处理在照片我放到了代码的同文件夹下,所以没有写路径,大家可以自己写路径,或者放到于代码相同的路径下即可。

    以上がPythonを使用して写真が撮影されたときの詳細な位置を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明
    この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
    Pythonと時間:勉強時間を最大限に活用するPythonと時間:勉強時間を最大限に活用するApr 14, 2025 am 12:02 AM

    限られた時間でPythonの学習効率を最大化するには、PythonのDateTime、時間、およびスケジュールモジュールを使用できます。 1. DateTimeモジュールは、学習時間を記録および計画するために使用されます。 2。時間モジュールは、勉強と休息の時間を設定するのに役立ちます。 3.スケジュールモジュールは、毎週の学習タスクを自動的に配置します。

    Python:ゲーム、GUIなどPython:ゲーム、GUIなどApr 13, 2025 am 12:14 AM

    PythonはゲームとGUI開発に優れています。 1)ゲーム開発は、2Dゲームの作成に適した図面、オーディオ、その他の機能を提供し、Pygameを使用します。 2)GUI開発は、TKINTERまたはPYQTを選択できます。 TKINTERはシンプルで使いやすく、PYQTは豊富な機能を備えており、専門能力開発に適しています。

    Python vs. C:比較されたアプリケーションとユースケースPython vs. C:比較されたアプリケーションとユースケースApr 12, 2025 am 12:01 AM

    Pythonは、データサイエンス、Web開発、自動化タスクに適していますが、Cはシステムプログラミング、ゲーム開発、組み込みシステムに適しています。 Pythonは、そのシンプルさと強力なエコシステムで知られていますが、Cは高性能および基礎となる制御機能で知られています。

    2時間のPython計画:現実的なアプローチ2時間のPython計画:現実的なアプローチApr 11, 2025 am 12:04 AM

    2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

    Python:主要なアプリケーションの調査Python:主要なアプリケーションの調査Apr 10, 2025 am 09:41 AM

    Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

    2時間でどのくらいのPythonを学ぶことができますか?2時間でどのくらいのPythonを学ぶことができますか?Apr 09, 2025 pm 04:33 PM

    2時間以内にPythonの基本を学ぶことができます。 1。変数とデータ型を学習します。2。ステートメントやループの場合などのマスター制御構造、3。関数の定義と使用を理解します。これらは、簡単なPythonプログラムの作成を開始するのに役立ちます。

    プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?プロジェクトの基本と問題駆動型の方法で10時間以内にコンピューター初心者プログラミングの基本を教える方法は?Apr 02, 2025 am 07:18 AM

    10時間以内にコンピューター初心者プログラミングの基本を教える方法は?コンピューター初心者にプログラミングの知識を教えるのに10時間しかない場合、何を教えることを選びますか...

    中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?中間の読書にどこでもfiddlerを使用するときにブラウザによって検出されないようにするにはどうすればよいですか?Apr 02, 2025 am 07:15 AM

    fiddlereveryversings for the-middleの測定値を使用するときに検出されないようにする方法

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 最新バージョン

    Dreamweaver Mac版

    Dreamweaver Mac版

    ビジュアル Web 開発ツール

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    mPDF

    mPDF

    mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

    VSCode Windows 64 ビットのダウンロード

    VSCode Windows 64 ビットのダウンロード

    Microsoft によって発売された無料で強力な IDE エディター