arcgis出了10後,python代替vb成爲官方腳本語言,python中的gis庫也是有不少,但由於本人最早接觸的是arcgis因此就直接學習他自帶的庫arcpy了,主要以空間權重矩陣做爲一個契機順便學習arcpy。python
代碼及數據資料:https://github.com/shikanon/WeightDistancegit
由於仍是不太習慣arcpy中的表操做,因此藉助了pandas進行表操做,構建一個錶轉換:
github
#ListFields包含field類的數組 fields=arcpy.ListFields(path) def GetTable(): '''將arcpy表單變爲pandas表單,仍是喜歡pandas些~''' table=[] fieldname=[field.name for field in fields] #遊標集合,用for 循環一次後沒辦法循環第二次!一個遊標實例只能循環一次 data=arcpy.SearchCursor(path) for row in data: #Shape字段中的要數是一個幾何類 r=[] for field in fields: r.append(row.getValue(field.name)) table.append(r) return pd.DataFrame(table,columns=fieldname)
由於求歐幾裏距離在arcpy 中polyline直接有length屬性因此只須要構建一個線類,而後直接求長度就好了數組
def getdistance(point1,point2,sparef): '''求兩點的距離''' #兩點構造一條線 l=arcpy.Polyline(arcpy.Array([point1,point2]),sparef) #求線長 return l.getLength()
在求長度時候須要考慮到shp的投影座標,所以須要先獲得一個spatialReferenceapp
#空間座標投影參數 #隨便抽取一個shape出來求得該圖層的空間投影 sparef=data['Shape'][0].spatialReference print sparef.name #計算質心centre #Shape字段下是一個geometry object對象,其下有中心點和麪積等工具 #貌似由centroid抽出來的點沒有空間投影屬性, #因此data['centre'][0].spatialReference將會報錯 data['centre']=[d.centroid for d in data['Shape']] #計算歐幾裏權重矩陣 weight=[] for i in data['centre']: row=[] for j in data['centre']: row.append(getdistance(i,j,sparef)) weight.append(row) weight=pd.DataFrame(weight,index=data['FID'],columns=data['FID'])
最後導出csv:工具
#輸出csv weight.to_csv(path_or_buf='weight.csv',sep=',')
小小練習完成,查看一下結果,圖爲廣東省市級單元的空間權重矩陣:學習
貼上完整代碼:spa
# -*- coding: cp936 -*- import arcpy import numpy as np import pandas as pd path='data/gd.shp' #ListFields包含field類的數組 fields=arcpy.ListFields(path) def GetTable(): '''將arcpy表單變爲pandas表單,仍是喜歡pandas些~''' table=[] fieldname=[field.name for field in fields] #遊標集合,用for 循環一次後沒辦法循環第二次!一個遊標實例只能循環一次 data=arcpy.SearchCursor(path) for row in data: #Shape字段中的要數是一個幾何類 r=[] for field in fields: r.append(row.getValue(field.name)) table.append(r) return pd.DataFrame(table,columns=fieldname) def getdistance(point1,point2,sparef): '''求兩點的距離''' #兩點構造一條線 l=arcpy.Polyline(arcpy.Array([point1,point2]),sparef) #求線長 return l.getLength() data=GetTable() #空間座標投影參數 #隨便抽取一個shape出來求得該圖層的空間投影 sparef=data['Shape'][0].spatialReference print sparef.name #計算質心centre #Shape字段下是一個geometry object對象,其下有中心點和麪積等工具 #貌似由centroid抽出來的點沒有空間投影屬性, #因此data['centre'][0].spatialReference將會報錯 data['centre']=[d.centroid for d in data['Shape']] #計算歐幾裏權重矩陣 weight=[] for i in data['centre']: row=[] for j in data['centre']: row.append(getdistance(i,j,sparef)) weight.append(row) weight=pd.DataFrame(weight,index=data['FID'],columns=data['FID']) #輸出csv weight.to_csv(path_or_buf='weight.csv',sep=',')
http://my.oschina.net/Kanonpy/
.net
------------窈----------------窈---------------窈------------窈------------窈-------------窈------------窈-------code