檢視人員地理位置

2021-09-28 10:44:20 字數 3897 閱讀 5709

1

目 標 場 景

有時候女朋友乙個人在外面玩耍,問她在哪個地方,就是不告訴我。但是,你又很想知道女朋友的「位置」,這該如何是好?

2

準 備 工 作

首先,在虛擬環境中安裝識別元資料的庫。

pip3 install exifread
然後,進入高德開放平台,申請乙個 web 服務的應用,獲取到乙個 「key」用於逆地理編碼 api。

編  寫  腳  本

整個操作分為 3 步驟,分別是獲取的經度和緯度、對經度和緯度進行資料矯正、呼叫高德逆地理編碼 api 獲取具體位置。

第 1 步,獲取的「經度和緯度」。

使用 exifread 庫可以直接讀取檔案,獲取到的元資料,包含經度、緯度、南北緯方向、東西經方向和拍攝時間。

# 使用 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']

如果元資料存在,然後判斷拍攝時間是否合理。如果拍攝時間不在今天,那只能很遺憾地通知你,你的女朋友在向你撒謊「撒謊」。

def judge_time_met(self, take_time):

"""判斷拍攝時間是否是在今天

:param take_time:

:return:

"""# 拍攝時間

format_time = str(take_time).split(" ")[0].replace(":", "-")

# 當天日期

today = str(datetime.date.today())

if format_time == today:

return true

else:

return false

if is_lie:

print('很遺憾的通知你,你的女朋友在撒謊!!!')

return

如果女友沒有撒謊,那麼可以進行第 2 步的操作。

因為通過 gps 獲取的經度、緯度和高德地圖的座標存在一定的誤差,這裡需要把座標轉換為「火星座標系」。

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]

另外需要注意的是,介面中經度、緯度引數只能識別小數點後 6 位,需要對經緯度中的度、分、秒做一定的資料處理,然後再進行四捨五入。

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)

第 3 步,呼叫高德的反地理編碼 api,傳入申請的應用 key,就能拿到女朋友的詳細位址。

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

4結 果 結 論

確保是原圖的基礎上,可以快速幫你判斷女朋友是否在撒謊;如果女朋友沒有撒謊,就返回女朋友具體的位置。

洋山港 地理位置

洋山港區位於浙江省嵊泗縣境內。由大洋山港口區和小洋山港口區組成。可供開發的深水岸線4900公尺,是上海國際航運中心的深水港區。位於嵊泗海域西部大洋山島的北岸。東北距縣城21.41海浬,西北距上海市蘆潮港18.9海浬。大洋山島海岸線總長16697公尺 其中基岩10214公尺 可利用岸線3200公尺,聖...

geospatial地理位置

redis的geo在redis3.2版本就退出來了推算地理位置資訊,兩地之間的距離 可以查詢一些測試資料 引數 key 緯度,經度 名稱 127.0.0.1 6379 geoadd china city 116.397128 39.916527 beijin integer 1127.0.0.1 6...

Android 地理位置定位

android官方提供的定位sdk 1.先在manifest.xml中申請許可權 targetsdkversion 為23或者更高的需要動態申請許可權 android name android.permission.access fine location android name android....