基於python的空間距離權重計算——arcgis中的arcpy

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

相關文章
相關標籤/搜索