首頁 > 科技

手把手教你用Python替代Mapinfo,更快查詢兩張表中距離最近的點

2021-06-10 16:57:46

來源:Python爬蟲與資料探勘

作者:崔豔飛

一、前言

大家好,我是崔豔飛。工作中有時需要把A表中的經緯度點,從B表中匹配一個最近的點出來,用Mapinfo也可以實現,但處理速度慢,特別是資料量大時根本處理不動,此時用Python就能輕鬆實現,還能顯示處理進度,詳細如下。

二、項目目標

用Python實現兩張表間最近點的計算。

三、項目準備

軟體:PyCharm

需要的庫:pandas, xlrd,os

四、項目分析

1)如何選擇並讀取要處理的Excel檔案?

利用os、xlrd,選擇要讀取處理的Excel檔案。

2)如何計算兩個經緯度點的距離?

利用pandas庫讀取兩張表的內容,再定義函數計算兩個經緯度點的距離。

3)如何迴圈計算並儲存最近一個點的資料?

利用For迴圈,對兩張表的內容進行迴圈讀取,通過If判斷保留最近的距離點資料。

4)如何儲存結果?

利用to_excel儲存,得到最近點的資料。

五、項目實現

1、第一步匯入需要的庫

import pandas as pd

import xlrd

import os

2、第二步選擇並讀取要處理的Excel檔案

path="D:/a/"

#獲取資料夾下所有EXCEL名

bb = path + 'result.xlsx'

writer = pd.ExcelWriter(bb,engine='openpyxl')

xlsx_names = [x for x in os.listdir(path) if x.endswith(".xlsx")]

# 獲取第一個EXCEL名

xlsx_names1 = xlsx_names[0]

aa = path + xlsx_names1

#開啟第一個EXCEL

first_file_fh=xlrd.open_workbook(aa)

# 獲取SHEET名

first_file_sheet=first_file_fh.sheets()

3、第三步迴圈計算並儲存最近一個點的資料

for i in range(h1):

w1=df1.loc[i,'緯度']

j1 = df1.loc[i,'經度']

d1 = df1.loc[i, :]

d0=10000000000000000000000000.0000

print("原小區第%d個。" %(i+1))

test_dict = {'距離': [d0]}

d3 = pd.DataFrame(test_dict)

for l in range(h2):

w2=df2.loc[l, '緯度']

j2=df2.loc[l,'經度']

d=haversine(j1, w1, j2, w2)

if d<d0:

d0=d

d2 = df2.loc[l, :]

test_dict = {'距離': [d0]}

d3 = pd.DataFrame(test_dict)

else:continue

4、第四步儲存計算後的檔案

resultdata1.to_excel(excel_writer=writer, sheet_name='原小區', encoding="utf-8", index=False)

resultdata2.to_excel(excel_writer=writer, sheet_name='最近小區', encoding="utf-8", index=False)

resultdata3.to_excel(excel_writer=writer, sheet_name='距離', encoding="utf-8", index=False)

writer.save()

writer.close()

六、效果展示

1、處理前資料:

2、處理進度顯示:

3、處理結果:

七、總結

本文介紹瞭如何利用Python計算兩個經緯度點間的距離,並在兩張表間進行最近點計算,這本來是Mapinfo的分內之事,但資料量大時就處理不動了,Python處理速度快,還能對資料進行預處理,正是由於可以自己優化程式碼,可以無限提高運行速度,比如資料切塊處理,有興趣的同學可以進一步研究下。


IT145.com E-mail:sddin#qq.com