- 使用exifread庫(kù)讀取圖片的經(jīng)緯度信息(WGS84坐標(biāo))
- 使用高德開(kāi)放API將經(jīng)緯度轉(zhuǎn)為高德底圖經(jīng)緯度,并輸出具體位置
- 使用folium庫(kù),以高德底圖為基準(zhǔn),在網(wǎng)頁(yè)上可視化顯示地圖和興趣點(diǎn)
一、獲取圖片經(jīng)緯度
????????之前發(fā)過(guò)類似的文章,這里就不贅述了。下面代碼中有相應(yīng)注釋。
def Get_LatLon(path_image):
"""
:param path_image: 輸入圖片路徑
:return: 返回緯度、經(jīng)度
"""
# 獲取圖片的經(jīng)緯度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("經(jīng)度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("緯度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
return latitude_f, longitude_f
二、高德開(kāi)放API將經(jīng)緯度轉(zhuǎn)為高德底圖經(jīng)緯度,并輸出具體位置
1.注冊(cè)賬號(hào),獲取key
????????打開(kāi)
,注冊(cè)賬號(hào)后點(diǎn)擊控制臺(tái)。點(diǎn)擊我的應(yīng)用,然后創(chuàng)建應(yīng)用后就會(huì)得到一個(gè)key。對(duì)于地理編碼官方也有 ,可以自行參考。2.使用高德開(kāi)放API將經(jīng)緯度轉(zhuǎn)為高德底圖經(jīng)緯度,并輸出具體位置
def Get_address(latitude_f2, longitude_f2):
"""
:param latitude_f2: 輸入WGS84緯度
:param longitude_f2: 輸入WGS84經(jīng)度
:return: 返回地址、高德經(jīng)緯度
"""
key = '**********'
# 高德地圖api
url_lonlat = f'https://restapi.amap.com/v3/assistant/coordinate/convert?locations=%s,%s&coordsys=gps' \
f'&output=json&key={key}' % (longitude_f2, latitude_f2)
r_lonlat = requests.get(url_lonlat)
gaode_lonlat = r_lonlat.json()['locations']
# 獲取高德經(jīng)緯度
url_address = f'https://restapi.amap.com/v3/geocode/regeo?output=json&location=%s&key={key}' \
f'&radius=1000&extensions=all' % gaode_lonlat
r_address = requests.get(url_address)
gaode_address = r_address.json()['regeocode']['formatted_address']
# 獲取經(jīng)緯度對(duì)應(yīng)的詳細(xì)地址
return gaode_address, gaode_lonlat
三、folium庫(kù)以高德底圖為基準(zhǔn)在網(wǎng)頁(yè)上可視化顯示地圖和興趣點(diǎn)
def Show_map(address1, lonlat):
"""
:param address1: 高德地址
:param lonlat: 高德經(jīng)緯度
:return: 打開(kāi)html,可視化地圖
"""
tiles1 = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
# 高德底圖api
map_url = folium.Map([float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
tiles=tiles1,
attr="© <a href=http://ditu.amap.com/>高德地圖</a>",
zoom_start=15,
control_scale=True,
)
# 底圖的基本設(shè)置
folium.Marker(
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('%s' % address1, max_width=20),
icon=folium.Icon(color='red', icon='info-sign') # 標(biāo)記顏色圖標(biāo)
).add_to(map_url)
# 添加標(biāo)記點(diǎn)
folium.Circle(
radius=3000,
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('范圍', max_width=20),
color="crimson",
fill=False,
).add_to(map_url)
# 添加圓圈
map_url.add_child(folium.ClickForMarker(popup="新點(diǎn)"))
# 添加新點(diǎn)
map_url.add_child(plugins.MeasureControl(position='topleft'))
# 地圖測(cè)距離
map_url.add_child(folium.LatLngPopup())
# 經(jīng)緯度查詢
map_url.save('map.html')
# 保存為html
webbrowser.open('map.html')
四、完整代碼
????????記得自己修改key和圖片路徑!
# -*- coding: utf-8 -*-
"""
@Time : 2023/6/1 15:29
@Auth : RS迷途小書童
@File :Positioning based on images.py
@IDE :PyCharm
@Purpose :通過(guò)圖片獲取其準(zhǔn)確位置并在網(wǎng)頁(yè)上可視化
"""
import exifread
import requests
import folium
# 地圖模塊
import webbrowser
# 瀏覽器調(diào)用
from folium import plugins
def Get_LatLon(path_image):
"""
:param path_image: 輸入圖片路徑
:return: 返回緯度、經(jīng)度
"""
# 獲取圖片的經(jīng)緯度信息
f = open(path_image, 'rb')
contents = exifread.process_file(f)
longitude = contents["GPS GPSLongitude"].values
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("經(jīng)度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("緯度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
return latitude_f, longitude_f
def Get_address(latitude_f2, longitude_f2):
"""
:param latitude_f2: 輸入WGS84緯度
:param longitude_f2: 輸入WGS84經(jīng)度
:return: 返回地址、高德經(jīng)緯度
"""
key = '*******'
# 高德地圖api
url_lonlat = f'https://restapi.amap.com/v3/assistant/coordinate/convert?locations=%s,%s&coordsys=gps' \
f'&output=json&key={key}' % (longitude_f2, latitude_f2)
r_lonlat = requests.get(url_lonlat)
gaode_lonlat = r_lonlat.json()['locations']
# 獲取高德經(jīng)緯度
url_address = f'https://restapi.amap.com/v3/geocode/regeo?output=json&location=%s&key={key}' \
f'&radius=1000&extensions=all' % gaode_lonlat
r_address = requests.get(url_address)
gaode_address = r_address.json()['regeocode']['formatted_address']
# 獲取經(jīng)緯度對(duì)應(yīng)的詳細(xì)地址
return gaode_address, gaode_lonlat
def Show_map(address1, lonlat):
"""
:param address1: 高德地址
:param lonlat: 高德經(jīng)緯度
:return: 打開(kāi)html,可視化地圖
"""
tiles1 = 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}'
# 高德底圖api
map_url = folium.Map([float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
tiles=tiles1,
attr="© <a href=http://ditu.amap.com/>高德地圖</a>",
zoom_start=15,
control_scale=True,
)
# 底圖的基本設(shè)置
folium.Marker(
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('%s' % address1, max_width=20),
icon=folium.Icon(color='red', icon='info-sign') # 標(biāo)記顏色圖標(biāo)
).add_to(map_url)
# 添加標(biāo)記點(diǎn)
folium.Circle(
radius=3000,
location=[float(lonlat.split(',')[1]), float(lonlat.split(',')[0])],
popup=folium.Popup('范圍', max_width=20),
color="crimson",
fill=False,
).add_to(map_url)
# 添加圓圈
map_url.add_child(folium.ClickForMarker(popup="新點(diǎn)"))
# 添加新點(diǎn)
map_url.add_child(plugins.MeasureControl(position='topleft'))
# 地圖測(cè)距離
map_url.add_child(folium.LatLngPopup())
# 經(jīng)緯度查詢
map_url.save('map.html')
# 保存為html
webbrowser.open('map.html')
if __name__ == "__main__":
file_image = "G:/721_0211_W.jpeg"
latitude_f1, longitude_f1 = Get_LatLon(file_image)
# 輸入圖片路徑,獲取WGS84經(jīng)緯度
address, lonlat = Get_address(latitude_f1, longitude_f1)
# 獲取高德地址和經(jīng)緯度
Show_map(address, lonlat)
# 在網(wǎng)頁(yè)上可視化顯示
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-473455.html
?本文章主要是分享個(gè)人在學(xué)習(xí)Python過(guò)程中寫過(guò)的一些代碼。有些部分參考了前人以及官網(wǎng)的教程,如有侵權(quán)請(qǐng)聯(lián)系作者刪除,大家有問(wèn)題可以隨時(shí)留言交流,博主會(huì)及時(shí)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-473455.html
到了這里,關(guān)于【Python入門教程】獲取圖片可視化精準(zhǔn)定位(逆地理編碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!