本人第一篇原创,希望可以给小伙伴们带来一丝丝*10086的灵感!
在ArcGIS中shp文件的属性文件dbf常常包含着所有要素的基本属性。在一般的查看属性表中,我们可以看到属性表的ObjectID和shape栏为生成文件时默认的属性,其中shape属性即为空间属性,不仅有空间属性的分类(点、线、面)还有当前坐标系统下的空间坐标地理位置。对于点要素而言,可以直接导出属性表获取几何坐标,但是对于线和面,直接导出的仅为要素的几何重心坐标。以往读取shp文件的方法太复杂了(不仅要了解这种文件格式的存储方法还要自己编写函数),这时,arcpy提供了可以说是傻瓜函数的办法,可以直接读取shape属性。 是不是很心动,那就继续往下看!
具体的官方文档可以在ArcMap中按F1获取,主要是针对矢量和栅格文件的处理,还有与之对应的网络分析和空间分析模块。本文主要介绍其中数据访问模块。 针对本文的需要,我们主要使用其中的searchcuror类(SearchCursor 用于建立从要素类或表中返回的记录的只读访问权限。返回一组迭代的元组。元组中值的顺序与属性表的字段顺序相符)。当然访问的最关键属性就是shape属性,根据官方文档给出的语法(SearchCursor (in_table, field_names)),in_table为要访问的要素,field_names为要访问的字段名,shape属性访问使用SHAPE@取代属性名。 (以上仅代表个人理解,有误请指出。)
在pycharm等IDE平台中需要对环境进行配置: point.shp(点状要素)
PointFilePath = "point.shp" # 读取属性表 PointMetaArray = ap.ListFields(PointFilePath) PointMetaList = [] for i in PointMetaArray: PointMetaList.append(i.aliasName) # 读取记录 Feature_point = [] for i in ap.da.SearchCursor(PointFilePath, PointMetaList): Feature_point.append(i) pointdf = pd.DataFrame(Feature_point, columns=[根据shp文件的属性表进行设置])***整理属性列表,可无pointdf返回带空间属性的属性列表
line.shp(线状要素) 与点状不同的是,空间属性字段需要单独整合,面状同样。
LineFilePath = "line.shp" # 读取属性表 LineMetaArray = ap.ListFields(LineFilePath) LineMetaList = [] for i in LineMetaArray: LineMetaList.append(i.aliasName) # 读取记录 Feature_line = [] for i in ap.da.SearchCursor(LineFilePath, LineMetaList): Feature_line.append(i) linedf = pd.DataFrame(Feature_line, columns=[根据shp文件的属性表进行设置])***这里注意不读取shape属性 # 读取shape属性 line_position = [] for i in ap.da.SearchCursor(LineFilePath, 'SHAPE@'): partlist = [] for part in i[0]: for j in part: partlist.append([j.X, j.Y]) line_position.append([partlist]) line_positiondf = pd.DataFrame(line_position) linedf.insert(1, 'feature', line_positiondf)linedf返回带空间属性的属性列表
polygon.shp(面状要素)
PolygonFilePath = "polygon.shp" # 读取属性表 PolygonMetaArray = ap.ListFields(PolygonFilePath) PolygonMetaList = [] for i in PolygonMetaArray: PolygonMetaList.append(i.aliasName) # 读取记录 Feature_polygon = [] for i in ap.da.SearchCursor(PolygonFilePath, PolygonMetaList): Feature_polygon.append(i) polygondf = pd.DataFrame(Feature_polygon, columns=根据shp文件的属性表进行设置]) # 读取shape属性 polygon_position = [] for i in ap.da.SearchCursor(PolygonFilePath, 'SHAPE@'): partlist = [] for part in i[0]: for j in part: partlist.append([j.X, j.Y]) polygon_position.append([partlist]) polygon_positiondf = pd.DataFrame(polygon_position) polygondf.insert(1, 'feature', polygon_positiondf)polygondf返回带空间属性的属性列表
以上代码所需包为:
import arcpy as ap import pandas as pd代码均可直接使用,相关参数根据实际进行修改,如有问题可留言! 代码没有考虑任何效率问题,如有这方面问题的小伙伴无需留言,我不会!!! 写这个初衷就是可以记录自己遇到的问题(因为网上相关问题很少,本人都是查看官方文档慢慢摸索的),如果可以给你带来一丝丝*10086帮助,那当然更好,如果没有…只能说明我太菜了! 欢迎大家交流学习呀!