文章目录
前言
在GIS里,点要素作为矢量数据的三大巨头之一,是每个giser都必须知道的。在日常中,我们使用ArcMap可以轻松操作点要素,那么在Arcpy开发的世界里,点要素又是如何创建、使用和进行分析,,这背后有着十分精彩的故事。
点与点要素
点(Point) 与点要素(Point Geometry) 是两种需要进行区分的事物,虽然他们都是由坐标组成,但在地理学里,点要素是指具有空间参考信息的点,是有实际地理意义的。而点,实质上就只是一对数值,不具有地理意义,因此,在开始创建点要素之前,我们需要区分好这两个概念。
创建点要素的核心工具
在Arcpy里创建点要素的方法有很多,从整体上划分,有创建单个点要素和多点要素两种,而在多个点要素创建里头,各种方法层出不穷,但主要可以分为以下几类:
- 将坐标值保存到属性表里,主要运用游标进行属性更新。
- 通过坐标值直接创建点,进而转成点要素,通过迭代的方法重复上述过程生成点要素列表,最后将点要素列表转成所需数据
无论使用哪种方法,在创建点要素的时候需要使用的函数也相差无异。主要用到以下几个函数:
arcpy.Point(x,y) -- 用于生成点(*注意不是点要素,是点!!!*)
arcpy.PointGeometry(point,spatial_reference) -- 生成点要素
创建单个点要素
创建单个点要素的方法比较简单,只需要有经纬度坐标即可,代码如下:
#创建点
test_point= arcpy.Point(-77.4349451, 37.5408265)
#创建点要素
test_geo = arcpy.PointGeometry(test_point,spef)
#保存点要素
arcpy.CopyFeatures_management(test_geo,'test3.shp')
上面保存点要素用到的方法是一个叫做CopyFeatures_management的函数,这里有两个核心参数:
1. 需要保存的要素类
2. 第二个是保存的文件名。
注意记得设置好工作环境,不然容易报错~
创建多点要素
上面讲过主要有游标和迭代两种方法,游标法比较常见,官网示例也是用的游标,那我就选择用迭代的方法来弥补一下这块的空缺吧。
我的做法是用一个存储经纬度的表来批量新建点要素。通过相应的字段传给点的X、Y,当然我这里用pandas库来实现读取和迭代。
代码如下:
# -*— coding: utf-8 -*-
import arcpy
import sys
reload(sys)
import pandas as pd
sys.setdefaultencoding("utf-8")
#设置工作空间
arcpy.env.workspace = 'D:/New Desktop/2019全国行政区划'
#准备了一个带有经纬度信息的表
table = 'XY.txt'
#迭代过程中存储点要素的列表
pointList = []
#读取经纬度表
XY_table = pd.read_table(table,sep=',')
#定义空间参考,众所周知4326是我们熟悉的wgs84
spef = arcpy.SpatialReference(4326)
#使用pandas里的iterrows方法进行迭代,该方法会返回每一行的索引和内容
for index,row in XY_table.iterrows():
X = row['X']
Y = row['Y']
#将x、y传入Point()中生成点
point = arcpy.Point(X,Y)
point_geo = arcpy.PointGeometry(point,spef)
#生成点要素之后将其放进列表中
pointList.append(point_geo)
#将该要素保存为test2.shp,并输出到工作路径下
arcpy.CopyFeatures_management(pointList,'test2.shp')
总结
我觉得这个方法是比较简单的,而且在没有字段要求的时候也不用设置插入、更新游标,核心过程简单且功能简单。如果需要添加字段的话可以用其他函数封装,无需在创建点要素的过程中增加其他功能,这样可拓展性不仅下降了,而且对于阅读者来说也增加难度。
当然,至于迭代的方法快还是用游标更新属性表的速度快,我没有认真比较,因此可能思考不够全面,记录下来以后方便反省!