arcgis中邻接矩阵文件的生成

摘要:
首先,我想解释一下,基于基本一阶邻接关系的空间自相关计算已经在Arcgis 9.2中实现。也就是说,Arcgis系统本身通过某些算法解决了本文和之前博客中涉及的相关问题。以下内容仅限于对算法设计的兴趣以及对arcgis相关功能实现的讨论。Arcgis9.2扩展了空间关联矩阵文件的构建。您可以通过DBF属性中值为“唯一”的任何字段创建矩阵。因此,您将发现生成的邻接矩阵的行数将比原始的行数多。

首先我要说明的是,arcgis 9.2中已经实现基于基本一阶邻接关系的空间自相关计算,也
就是说arcgis系统本身已通过一定算法解决了本文以及之前blog中涉及的相关问题。

以下内容仅限于算法设计的兴趣及对arcgis相关功能实现的探讨。

arcgis 9.2中对于空间关联矩阵文件的构建做了拓展,你可以DBF属性中任意值为Unique的
字段来建立矩阵。原先矩阵的关联字段只能使用Object ID构建,而现在你可以使用其它唯
一值的字段了,甚至是中文的地名字段(当然需要注意的是,字段值中不能有空格!而且
似乎用户自定义的文件中若使用OID构建运行时会报错)

下面是之前的面向9.0版本开发的VBA代码,现增添了计算MoranI值的程序,一并打包(生
成的邻接文件可用于9.0/9.1版本的相关计算,也可以用于VBA自带的MoranI计算,但不能
直接用于9.2中):
http://lilybbs.net/file/T/toolbar/VBA.rar

为了满足9.2中的邻接矩阵构建,鄙人近日对算法进行了扩充,并基于GDAL/OGR运算包在P
ython平台下进行了算法实现。特别要指出的是,由于GDAL相关函数的限制,算法中相应的
相邻多边形计算未能完全实现,仅仅搜索出了外接矩形(Envelop)相邻的多边形。因此大
家会发现生成的邻接矩阵行数会比原来的多一些。(相信随着GDAL的完善,最终可以在Py
thon平台上脱离ArcGIS实现相应功能)

附python源文件

  1 """
  2 多边形的邻接矩阵生成
  3 pnm.py - by toolbar
  4 
  5 update time: 2006.12.19
  6 """
  7 #引入操作系统库
  8 import os
  9 #引入TK库
 10 from Tkinter import *
 11 #引入消息对话框
 12 from tkMessageBox import *
 13 #引入文件对话框
 14 from tkFileDialog import *
 15 #引入_GDAL.dll
 16 import _gdal
 17 #引入OGR库
 18 from gdal import ogr
 19 
 20 #主程序类
 21 class Main:
 22     #字体定义
 23     _font=('宋体',9)
 24     #初始化
 25     def __init__(self,master):
 26         self.master=master
 27         Frame(master).pack(side=BOTTOM,expand=YES,fill=BOTH)
 28         master.title('多边形邻接计算'.decode('mbcs'))
 29         master.geometry('300x200+350+250')
 30         #第一行框架
 31         frame1=Frame(master)
 32         frame1.pack(side=TOP,expand=YES)
 33         #第二行框架
 34         frame2=Frame(master)
 35         frame2.pack(side=TOP,expand=YES)
 36         #第一行控件(文件输入)
 37         Label(frame1,text='输入文件'.decode('mbcs'),font=self._font).pack(side=LEFT,fill=BOTH)
 38         fin=StringVar()
 39         Entry(frame1,relief=SUNKEN,textvariable=fin,width=36).pack(side=LEFT)
 40         list=Listbox(frame2,height=3,width=37)
 41         Button(frame1,text='...',width=2,command=lambda w=fin,l=list,s=self:w.set(s.filein(l))).pack(side=LEFT)
 42         #第二行控件(文件输入)
 43         Label(frame2,text='选择变量'.decode('mbcs'),font=self._font).pack(side=LEFT,fill=BOTH)
 44         fieldin=StringVar()
 45         #list=Listbox(frame,height=3,width=37)
 46         scroll=Scrollbar(frame2,command=list.yview)
 47         list.config(yscrollcommand=scroll.set)
 48         list.pack(side=LEFT)
 49         scroll.pack(side=LEFT,fill=Y)
 50         #第三行框架
 51         frame3=Frame(master)
 52         frame3.pack(side=TOP,expand=YES)
 53         #第三行控件(文件输出)
 54         Label(frame3,text='输出文件'.decode('mbcs'),font=self._font).pack(side=LEFT,fill=BOTH)
 55         fout=StringVar()
 56         Entry(frame3,relief=SUNKEN,textvariable=fout,width=36).pack(side=LEFT)
 57         Button(frame3,text='...',width=2,command=lambda w=fout,s=self:w.set(s.fileout())).pack(side=LEFT)
 58         #第四行框架
 59         frame4=Frame(master)
 60         frame4.pack(side=TOP,expand=YES)
 61         #第四行控件(执行按钮)
 62         Button(frame4,text='确 认'.decode('mbcs'),font=self._font,
 63                command=lambda w1=fin,w2=fout,l=list,s=self:s.adjcent(w1.get(),w2.get(),l.selection_get())).pack(side=LEFT)
 64         Button(frame4,text='清 空'.decode('mbcs'),font=self._font,
 65                command=lambda w1=fin,w2=fout:(w1.set(''),w2.set(''))).pack(side=RIGHT)
 66         #GUI显示循环
 67         master.mainloop()        
 68 
 69     #文件输入
 70     def filein(self,list):
 71         a=askopenfilename(title='打开文件'.decode('mbcs'),filetypes=[('Shape file','*.shp'),('All files','*.*')])
 72         if a:
 73             shapefile=ogr.Open(a)
 74             shapelayer=shapefile.GetLayer()
 75             layerinfo=shapelayer.GetLayerDefn()
 76             for i in range(0,layerinfo.GetFieldCount()-1):
 77                 list.insert(END,layerinfo.GetFieldDefn(i).GetName())
 78             return os.path.abspath(a)
 79         else:
 80             return ''
 81 
 82     #文件输出
 83     def fileout(self):
 84         a=asksaveasfilename(title='保存文件'.decode('mbcs'),filetypes=[('Neighbor file','*.txt'),('All files','*.*')])
 85         if a:
 86             return os.path.abspath(a)
 87         else:
 88             return ''
 89 
 90     #执行邻接函数
 91     def adjcent(self,FileIn,FileOut,list):        
 92         textfile=open(FileOut,'w')
 93         textfile.writelines(list+'\n')
 94         shapefile=ogr.Open(FileIn)
 95         shapelayer=shapefile.GetLayer()
 96         #showinfo(title='',message=str(fcount))
 97         shapefeature=shapelayer.GetNextFeature()
 98         while shapefeature:
 99             shapegeometry=shapefeature.GetGeometryRef()
100             for i in range(0,shapelayer.GetFeatureCount()-1):
101                 shapefeature1=shapelayer.GetFeature(i)
102                 if shapefeature1.GetFID()==shapefeature.GetFID():continue
103                 shapegeometry1=shapefeature1.GetGeometryRef()
104                 if shapegeometry1.Intersect(shapegeometry):
105                     #s=str(shapefeature.GetFID())+' '+str(shapefeature1.GetFID())+' 1\n'
106                     t=shapefeature.GetFieldIndex(list)
107                     s=str(shapefeature.GetField(t))+' '+str(shapefeature1.GetField(t))+' 1\n'
108                     textfile.writelines(s)
109             self.master.title(str(shapefeature.GetFID()))
110             shapefeature=shapelayer.GetNextFeature()
111         textfile.close()
112         showinfo(message='Done!')
113 
114 if __name__=='__main__':
115     Main(Tk())


(python版本2.4.1,ArcGIS 9.2已自带;GDAL版本1.3.2,需安装)

谈论完了自己的算法,也很好奇ArcGIS 9.2中是怎么实现一阶邻接对象矩阵生成的。查找
了一下toolbox下的ArcScript源代码,发现ESRI的实现主要是通过了两个步骤:(1)使用
polygon to line功能,生成的line文件将自带有弧段左右多边形的拓扑信息;(2)对生
成line文件的左右多边形字段进行Frequency统计,剔除重复的冗余,在此基础上再生成邻
接矩阵文件就不难了(一次表格遍历即可)
有兴趣的话,可以在toolbox相应功能上右键‘edit’即可查看ESRI的源代码~
enjoy~

免责声明:文章转载自《arcgis中邻接矩阵文件的生成》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JS组件系列——封装自己的JS组件Intellij idea 新建springboot 项目下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Arcgis python geometry

Geometry 描述 来自:https://pro.arcgis.com/zh-cn/pro-app/arcpy/classes/geometry.htm 几何对象定义空间位置和关联几何形状。 说明 在许多地理处理工作流中,您可能需要使用坐标和几何信息运行特定操作,但不一定想经历创建新(临时)要素类、使用光标填充要素类、使用要素类,然后删除临时要素...

【转】用Python实现各种排序算法

以下代码均为python3版本的代码 # 冒泡排序 # 比较相邻的元素大小,将小的前移,大的后移,就像水中的气泡一样,最小的元素经过几次移动,会最终浮到水面上。 def bubbleSort(list): if list != None: if len(list) ==1: pass...

ClosedXML导出Excel简单使用

c#经常会用到导出excel。 ClosedXML是一个.NET库,用于读取,操作和写入Excel 2007+(.xlsx,.xlsm)文件。它旨在提供一个直观且用户友好的interface来处理基础的OpenXML API。 ClosedXML许可证是MIT。 示例: using ClosedXML.Excel; using DoExcel.Models...

vue自学小demo----前端

vue学习的小demo,实现简单的页面项目的增删 代码如下 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue</title> <script src="./vue.js">...

说说C#中IList与List区别

我知道IList是一个接口,而List可以实例化IList。请问,我不可以不定义接口IList么?或者在IDAL(接口中)定义List吗?必须是Ilist么??请大家谈谈他们之间的区别和作用? (摘自网络)   首先IList 泛型接口是 ICollection 泛型接口的子代,并且是所有泛型列表的基接口。 它仅仅是所有泛型类型的接口,并没有太多方...

selenium之处理alert弹出对话框

在完成某些操作时会弹出对话框来提示,主要分为"警告消息框","确认消息框","提示消息对话"三种类型的对话框。    1.警告消息框(alert)  警告消息框提供了一个"确定"按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。   2.确认消息框(confirm)   确认消息框向用户提示一个"是与否"...