手把手教你用Python替代Mapinfo更快查找兩張表中距離最近的點
一、前言
大家好,我是崔艷飛。工作中有時需要把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處理速度快,還能對數據進行預處理,正是由于可以自己優化代碼,可以無限提高運行速度,比如數據切塊處理,有興趣的同學可以進一步研究下。