基于python的空间距离权重计算——arcgis中的arcpy

arcgis出了10后,python代替vb成为官方脚本语言,python中的gis库也是有很多,但因为本人最先接触的是arcgis所以就直接学习他自带的库arcpy了,主要以空间权重矩阵作为一个契机顺便学习arcpy。

代码及数据资料:https://github.com/shikanon/WeightDistance

因为还是不太习惯arcpy中的表操作,所以借助了pandas进行表操作,构建一个表转换:

#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的投影坐标,因此需要先得到一个spatialReference

#空间坐标投影参数
#随便抽取一个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=',')

小小练习完成,查看一下结果,图为广东省市级单元的空间权重矩阵:

231803_fVbC_2266481.png

贴上完整代码:

# -*- 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/

------------窈----------------窈---------------窈------------窈------------窈-------------窈------------窈-------

转载于:https://my.oschina.net/Kanonpy/blog/361078

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值