基于python和ArcGIS的arcpy包读取shp文件的空间属性
本人第一篇原创,希望可以给小伙伴们带来一丝丝*10086的灵感!
shp文件空间属性读取
在ArcGIS中shp文件的属性文件dbf常常包含着所有要素的基本属性。在一般的查看属性表中,我们可以看到属性表的ObjectID和shape栏为生成文件时默认的属性,其中shape属性即为空间属性,不仅有空间属性的分类(点、线、面)还有当前坐标系统下的空间坐标地理位置。对于点要素而言,可以直接导出属性表获取几何坐标,但是对于线和面,直接导出的仅为要素的几何重心坐标。以往读取shp文件的方法太复杂了(不仅要了解这种文件格式的存储方法还要自己编写函数),这时,arcpy提供了可以说是傻瓜函数的办法,可以直接读取shape属性。
是不是很心动,那就继续往下看!
Arcpy
具体的官方文档可以在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帮助,那当然更好,如果没有…只能说明我太菜了!
欢迎大家交流学习呀!