1. 程式人生 > >ArcGIS的swm二進位制檔案處理成為矩陣形式的文字檔案

ArcGIS的swm二進位制檔案處理成為矩陣形式的文字檔案

空間權重矩陣是空間分析的資料基礎。我們常用ArcGIS的空間統計模組的工具生成空間權重矩陣,然而其所得結果儲存在swm檔案中。該檔案是二進位制檔案,資料結構不明。我們通常需要將swm處理成為矩陣形式,以便於進行進一步的資料分析。本人在做實驗的過程中需要用到鄰接矩陣,鄰接矩陣是一種特殊的空間權重矩陣,元素只含0或1。我將過程經驗總結下來,方便遇到類似問題的人。

我使用的是python,用到的模組包括pysal,numpy,pandas。首先,我們利用ArcGIS提供的工具將swm檔案轉為dbf檔案。


第二步,編寫程式,讀取dbf的內容並處理成為矩陣形式。參考程式碼如下:

import pandas as pd
import numpy as np
import pysal


field_dbf=pysal.open(r'E:\atest\linjie.dbf')

#只需將FIDNUM和NID兩列儲存到arr中,前者是物件唯一標識,後者是與前者鄰近的物件標識
arr=field_dbf.by_col_array('FIDNUM','NID')

df1=pd.DataFrame(arr,columns=(('FID','NID')))

index_list=sorted(list(set(arr[:,0])))#用於空間權重矩陣的排列
n=len(index_list)
#初始化一個元素全為0的矩陣
df=pd.DataFrame(np.zeros(n*n).reshape(n,n),index=index_list,columns=index_list)
#將相鄰的兩個物件對應的位置元素改為1
for (k1, k2), group in df1.groupby(['FID','NID']):
    a=index_list.index(k1)
    b=index_list.index(int(k2))
    df.iloc[a,b]+=1
#將結果儲存到csv檔案中   
df.to_csv(r'E:\atest\linjie2.csv')

最後,來看下結果


希望對觀看此文的讀者有所幫助!