手把手教你用Python替代Mapinfo更快查找兩張表中距離最近的點
一、前言
大家好,我是崔艷飛。工作中有時需要把A表中的經(jīng)緯度點,從B表中匹配一個最近的點出來,用Mapinfo也可以實現(xiàn),但處理速度慢,特別是數(shù)據(jù)量大時根本處理不動,此時用Python就能輕松實現(xiàn),還能顯示處理進(jìn)度,詳細(xì)如下。
二、項目目標(biāo)
用Python實現(xiàn)兩張表間最近點的計算。
三、項目準(zhǔn)備
軟件:PyCharm
需要的庫:pandas, xlrd,os
四、項目分析
1)如何選擇并讀取要處理的Excel文件?
利用os、xlrd,選擇要讀取處理的Excel文件。
2)如何計算兩個經(jīng)緯度點的距離?
利用pandas庫讀取兩張表的內(nèi)容,再定義函數(shù)計算兩個經(jīng)緯度點的距離。
3)如何循環(huán)計算并保存最近一個點的數(shù)據(jù)?
利用For循環(huán),對兩張表的內(nèi)容進(jìn)行循環(huán)讀取,通過If判斷保留最近的距離點數(shù)據(jù)。
4)如何保存結(jié)果?
利用to_excel保存,得到最近點的數(shù)據(jù)。
五、項目實現(xiàn)
1、第一步導(dǎo)入需要的庫
- 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、第三步循環(huán)計算并保存最近一個點的數(shù)據(jù)
- for i in range(h1):
- w1=df1.loc[i,'緯度']
- j1 = df1.loc[i,'經(jīng)度']
- d1 = df1.loc[i, :]
- d0=10000000000000000000000000.0000
- print("原小區(qū)第%d個。" %(i+1))
- test_dict = {'距離': [d0]}
- d3 = pd.DataFrame(test_dict)
- for l in range(h2):
- w2=df2.loc[l, '緯度']
- j2=df2.loc[l,'經(jīng)度']
- 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='原小區(qū)', encoding="utf-8", index=False)
- resultdata2.to_excel(excel_writer=writer, sheet_name='最近小區(qū)', encoding="utf-8", index=False)
- resultdata3.to_excel(excel_writer=writer, sheet_name='距離', encoding="utf-8", index=False)
- writer.save()
- writer.close()
六、效果展示
1、處理前數(shù)據(jù):
2、處理進(jìn)度顯示:
3、處理結(jié)果:
七、總結(jié)
本文介紹了如何利用Python計算兩個經(jīng)緯度點間的距離,并在兩張表間進(jìn)行最近點計算,這本來是Mapinfo的分內(nèi)之事,但數(shù)據(jù)量大時就處理不動了,Python處理速度快,還能對數(shù)據(jù)進(jìn)行預(yù)處理,正是由于可以自己優(yōu)化代碼,可以無限提高運行速度,比如數(shù)據(jù)切塊處理,有興趣的同學(xué)可以進(jìn)一步研究下。