<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
2.1 GPS點座標的兩種表示方式(誤差還是有的)
2.1.1 十進位制換度分秒
例:經緯度115.46513298108795,38.83474699749353
2.1.2 度分秒換十進位制
2.1.3 實際距離換算
地球子午線長是39940.67公里,緯度改變一度合110.94公里,一分合1.849公里,一秒合30.8米,赤道圈是40075.36公里,北京地區緯在北緯40度左右,緯度圈長為40075*sin(90-40),此地經度一度合276公里,一分合1.42公里一秒合23.69米。
地球赤道上環繞地球一週走一圈共 40075.04公里,而這一圈分成360,而每1°(度)有60’,每一度一秒在赤道上的長度計算如下:
40075.04km/360°=111.31955km
111.31955km/60’=1.8553258km=1855.3m
而每一分又有60秒,每一秒就代表 1855.3m/60=30.92m
任意兩點距離計算公式為:
d=111.12cos{1/[sinΦAsinΦB十 cosΦAcosΦBcos(λB—λA)]}
其中:
結論
1°經度差對應的東西方向的距離是與其緯度有密切關係的。
赤道上經度相差1°對應的弧長大約是111千米
具體資料如下:
緯度 1°經度差對應的東西距離
20° 104公里
26° 100公里
30° 96公里
36° 90公里
40° 85公里
44° 80公里
51° 70公里
1、經緯度在不同地區,每度距離差是不同的,如果假定地球是完美的球體(這樣假設誤差不是很大)的話,緯度為 B 的地區:
2、不同經度不一樣,在南極、北級,所有的經度線都彙集在南、北極的點上,經度之間的距離為0,在赤道,經度之間的距離最大。
程式碼如下(範例):
import os import exifread from decimal import Decimal from position_utils import * import requests import json import datetime # pip3 install exifread class Location(object): def __init__(self, image_path): self.img_path = image_path self.api_key = "4e8d619c69859ce0f8962de9297c3764" #申請的高德APP web KEY #self.api_key = "4f458eaded9bad93b63b8a2c67f5c0e0" #申請的高德APP web KEY self.url_get_position = 'https://restapi.amap.com/v3/geocode/regeo?key={}&location={}' def run(self): coordinate = self.__get_image_ability() print(f'獲取到經度、緯度是:{coordinate}') if not coordinate: return # 根據經度和緯度,獲取到詳細地址 address = self.__get_address(coordinate) # 檢驗座標值 # https://lbs.amap.com/console/show/picker print(f'他當前位置在:{address}') def __get_address(self, location): """ 根據座標得到詳細地址 :param location: 經緯度值 :return: """ resp = requests.get(self.url_get_position.format(self.api_key, location)) location_data = json.loads(resp.text) address = location_data.get('regeocode').get('formatted_address') return address def __format_lati_long_data(self, data): """ 對經度和緯度資料做處理,保留6位小數 :param data: 原始經度和緯度值 :return: """ # 刪除左右括號和空格 data_list_tmp = str(data).replace('[', '').replace(']', '').split(',') data_list = [data.strip() for data in data_list_tmp] # 替換秒的值 data_tmp = data_list[-1].split('/') # 秒的值 data_sec = int(data_tmp[0]) / int(data_tmp[1]) / 3600 # 替換分的值 data_tmp = data_list[-2] # 分的值 data_minute = int(data_tmp) / 60 # 度的值 data_degree = int(data_list[0]) # 由於高德API只能識別到小數點後的6位 # 需要轉換為浮點數,並保留為6位小數 result = "%.6f" % (data_degree + data_minute + data_sec) return float(result) def __get_image_ability(self): """ 獲取圖片的屬性值,包含:經緯度、拍攝時間等 :param picture_name: :return: """ # 利用exifread庫,讀取圖片的屬性 img_exif = exifread.process_file(open(self.img_path, 'rb')) # 能夠讀取到屬性 if img_exif: # 緯度數 latitude_gps = img_exif['GPS GPSLatitude'] # N,S 南北緯方向 latitude_direction = img_exif['GPS GPSLatitudeRef'] # 經度數 longitude_gps = img_exif['GPS GPSLongitude'] # E,W 東西經方向 longitude_direction = img_exif['GPS GPSLongitudeRef'] # 拍攝時間 take_time = img_exif['EXIF DateTimeOriginal'] is_lie = self.judge_time_met(take_time) if is_lie: print('很遺憾的通知你,他/她在撒謊!!!照片不是今天拍的') return # 緯度、經度、拍攝時間 if latitude_gps and longitude_gps and take_time: # 對緯度、經度值原始值作進一步的處理 latitude = self.__format_lati_long_data(latitude_gps) longitude = self.__format_lati_long_data(longitude_gps) # print(f'{longitude},{latitude}') # 注意:由於gps獲取的座標在國內高德等主流地圖上逆編碼不夠精確,這裡需要轉換為火星座標系 location = wgs84togcj02(longitude, latitude) return f'{location[0]},{location[1]}' else: print(f'獲取的圖片資料屬性不完整') return '' else: print('抱歉,圖片不是原圖,沒法獲取到圖片屬性。') return '' def judge_time_met(self, take_time): """ 通知拍攝時間判斷女朋友是否撒謊 :param take_time: :return: """ # 拍攝時間 format_time = str(take_time).split(" ")[0].replace(":", "-") print('照片拍攝日期是:') print(format_time) # 當天日期 驗證照片是否是當日拍攝 # today = str(datetime.date.today()) # if format_time == today: # return False # else: # return True if __name__ == '__main__': # 女朋友發過來的圖片【原圖】 #圖片命名容易衝突,更換開頭就可以 location = Location('./aec0cddf45a946dec358301ddf17982.jpg') # 找到女朋友的地理位置 location.run()
程式碼如下(座標轉換範例):
# -*- coding: utf-8 -*- import json import math x_pi = 3.14159265358979324 * 3000.0 / 180.0 pi = 3.1415926535897932384626 # π a = 6378245.0 # 長半軸 ee = 0.00669342162296594323 # 扁率 def wgs84togcj02(lng, lat): """ WGS84轉GCJ02(火星座標系) :param lng:WGS84座標系的經度 :param lat:WGS84座標系的緯度 :return: """ if out_of_china(lng, lat): # 判斷是否在國內 return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [mglng, mglat] def gcj02towgs84(lng, lat): """ GCJ02(火星座標系)轉GPS84 :param lng:火星座標系的經度 :param lat:火星座標系緯度 :return: """ if out_of_china(lng, lat): return lng, lat dlat = transformlat(lng - 105.0, lat - 35.0) dlng = transformlng(lng - 105.0, lat - 35.0) radlat = lat / 180.0 * pi magic = math.sin(radlat) magic = 1 - ee * magic * magic sqrtmagic = math.sqrt(magic) dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi) dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi) mglat = lat + dlat mglng = lng + dlng return [lng * 2 - mglng, lat * 2 - mglat] def transformlat(lng, lat): ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lat * pi) + 40.0 * math.sin(lat / 3.0 * pi)) * 2.0 / 3.0 ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 * math.sin(lat * pi / 30.0)) * 2.0 / 3.0 return ret def transformlng(lng, lat): ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng)) ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 * math.sin(2.0 * lng * pi)) * 2.0 / 3.0 ret += (20.0 * math.sin(lng * pi) + 40.0 * math.sin(lng / 3.0 * pi)) * 2.0 / 3.0 ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 * math.sin(lng / 30.0 * pi)) * 2.0 / 3.0 return ret def out_of_china(lng, lat): """ 判斷是否在國內,不在國內不做偏移 :param lng: :param lat: :return: """ if lng < 72.004 or lng > 137.8347: return True if lat < 0.8293 or lat > 55.8271: return True return False
將需要定位的圖片放到指定路徑下,執行main.py
執行結果:
照片拍攝日期是:
2021-10-22
獲取到經度、緯度是:115.46513298108795,38.83474699749353
他當前位置在:河北省保定市蓮池區南大園鄉朝陽南大街2166號長城家園南區
執行截圖展示:
以上就是利用Python提取圖片經緯度並鎖定拍照地點的詳細內容,更多關於Python提取圖片經緯度的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45