ArcPy之读取几何要素(shapefile)的坐标

简单介绍介绍如何使用ArcPy读取几何要素的坐标,后续会介绍如何生成一个shp文件。

 

掌握arcgis软件及其开发技巧对于任何一个giser都是必备的基本功,说来简单,没有大量的实践和练习一切都是扯淡。虽然已经有很多学者在倡导去arcgis化,但有机会还是要认真练习的,毕竟它的很多技术和理念一直引领者gis界的潮流。

即便很熟悉软件的操作,你还是会发现,实际做事的时候,自己面对的工作总有一些特殊需求或者大量重复的工作(就跟考试似的,会的都不考,考的都是没看的),仅凭arcgis软件有很大的困难,怎么办?用脚本,用程序吧!千万别疯狂点鼠标进行重复软件操作,颈椎和腰间盘把持不住啊。有时候鼠标狂点一天,其实几行代码就搞定了,倒杯茶,翘着腿,等它自动处理不香么。

前面几篇文章也介绍了ArcPy的基本操作,ArcPy 是一个 Python包,可提供以实用高效的方式通过 Python 执行地理数据分析、数据转换、数据管理和地图自动化。为什么要用ArcPy 呢?因为它是基于python的,简单易学,真的是简单易学。当然,指入门简单,复杂起来真让人流泪。

导读

先宏观介绍一下,ArcPy 包括:数据访问模块 (arcpy.da)、制图模块 (arcpy.mapping)、ArcGIS Spatial Analyst 扩展模块(arcpy.sa) 和ArcGIS Network Analyst 扩展模块(arcpy.na),不同的模块可以帮助我们处理不同的任务。

接下里的几篇会分别分享矢量栅格的输入输出,使用内置功能,批量制图等,最后在分享几个有趣的小实践。

闲话少说,进入今天的主题。本篇主要介绍如何使用ArcPy读取几何数据,获取属性列表。

有些项目需要获取shp数据中Polygon、Polyline、PointGeometry 、 MultiPoint(面,线,点,多点)的几何坐标,可能是用于计算等操作,那么我们怎么去获取呢?

借助ArcPy中数据访问模块 (arcpy.da)提供的SearchCursor 函数,可以在要素类或表上建立只读游标,通过遍历 Row 对象并提取字段值。

 

点要素(PointGeometry 要素)坐标的获取

第一步:导入arcpy模块

一般用到什么模块就导入什么模块,这个一种约定的代码规范。但是实在偷懒导入全部的模块也不是不行,比如直接写 import arcpy也可以。

import arcpy.da

第二步:添加文件地址

比如本人用的是point.shp

datadir = r'E:\data\test' #文件根目录 pointFile = datadir + os.sep + 'point.shp'#点shp文件名

第三步:使用with语句创建一个游标

with arcpy.da.SearchCursor(fc,["SHAPE@XY"]) as cursor:

其实大家到知道,既然打开了文件就得把它关闭掉,把资源释放掉。但是很多时候大家很容易忘记关闭文件,或者程序执行异常导致文件没有关闭。这时候with语句的强大之处就体现了,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后关闭已经打开的文件句柄,将资源会保证被释放掉。(具体怎么用大家可以自行百度学习一下)

第四步:循环搜索游标(SearchCursor),并打印对应的X,Y坐标值

for row in cursor:
    print("这是第" + str(flag) + "个点要素")
    flag += 1
    # 打印每个点要素的x,y坐标
    x, y = row[0]
    print("{}, {}".format(x, y))

执行结果如下图所示:

完整程序如下所示:

import os
import arcpy
import time

def readPoint(fc):

    print("读取点几何开始运行")
    flag = 1
    #for row in arcpy.da.SearchCursor(fc, ["SHAPE@XY"]):
    with arcpy.da.SearchCursor(fc,["SHAPE@XY"]) as cursor:
        for row in cursor:
            print("这是第" + str(flag) + "个点要素")
            flag += 1
            # 打印每个点要素的x,y坐标
            x, y = row[0]
            print("{}, {}".format(x, y))


if __name__ == '__main__':
    print("程序开始运行")
    s_time=time.time()
    
    datadir = r'E:\data\test' #文件根目录
    pointFile = datadir + os.sep + 'point.shp'#点shp文件名
    readPoint(pointFile)#读取点几何数据
    e_time=time.time()
    print("程序共耗时: %.2f s!" % (e_time - s_time))

折线或面几何坐标的获取

第一步:导入arcpy模块

import arcpy.da

第二步:添加文件地址

datadir = r'E:\data\test' #文件根目录
polylineFile = datadir + os.sep + 'line.shp'#折线几何shp文件
polygonFile = datadir + os.sep + 'polygon.shp'#面几何shp文件

第三步:使用with语句创建一个游标

with arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]) as cursor:

注意:

这里解释一下SearchCursor游标里面的参数。

SearchCursor参数 SearchCursor (dataset, {where_clause}, {spatial_reference}, {fields}, {sort_fields})

参数的解释:

                                               (arcpy中SearchCursor()函数参数的含义,来源ArcGIS官网)

比如,本例子中,fc就是文件地址,对应于dataset;["OID@", "SHAPE@"]就是设置的返回条件,第一个OID指的是典型面的ID值,即下图中的FID,第二个SHAPE@是几何令牌。

几何令牌可用于访问特定几何信息,通常访问完整几何更加耗时,所以指定返回项目更加关心的内容。下面 是常用的几何令牌。

                              (几何令牌,来源ArcGIS官网)

 

第四步:循环搜索游标(SearchCursor),并打印对应的X,Y坐标值

for row in cursor:
    
# 打印当前要素的ID(即属性列表的记录个数,比如一个面要素由十个多边形组成)
    print("Feature {}:".format(row[0]))
    partnum = 0
    # 分解每个要素的部分(比如环,有内部和外部之分)
    for part in row[1]:
    #打印部分点的编号
    print("Part {}:".format(partnum))
    #分别打印每个点
    for pnt in part:
        if pnt:
        # 打印当前点的经纬度
            print("{}, {}".format(pnt.X, pnt.Y))
        else:
        # 如果pnt为空,则表示一个内部环
            print("Interior Ring:")
            partnum += 1

可以看到,这个有三层循环,主要是因为线和面是存储的结构是三维的(要素-->要素的部分->坐标)。比如下图这个 面.shp:第一维度,它由三个要素组成(粉色三角属于一个要素,multiPolygon);第二维度,再看正方形的环,它由两个部分组成,内环和外环;第三维度,每个部分的坐标点。

要是我们运行程序读取上面图形的shp,则可以得到下面的数据:

    (执行结果,数据来源ArcGIS官网)

 

完整程序如下所示:

import arcpy
import time
    
def readPolygonAndPolyline(fc):

    print("读取面或者线几何开始运行")
    #for row in arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]):
    with arcpy.da.SearchCursor(fc, ["OID@", "SHAPE@"]) as cursor:
        for row in cursor:
            # 打印当前要素的ID(即属性列表的记录个数,比如一个面要素由十个多边形组成)
            print("Feature {}:".format(row[0]))
            
            partnum = 0
            # 分解每个要素的部分(比如环,有内部和外部之分)
            for part in row[1]:
                #打印部分点的编号
                print("Part {}:".format(partnum))

                #分别打印每个点
                for pnt in part:
                    if pnt:
                        # 打印当前点的经纬度
                        print("{}, {}".format(pnt.X, pnt.Y))
                    else:
                        # 如果pnt为空,则表示一个内部环
                        print("Interior Ring:")
                partnum += 1

if __name__ == '__main__':
    print("程序开始运行")
    s_time=time.time()
    
    datadir = r'E:\data\test' #文件根目录
    polylineFile = datadir + os.sep + 'line.shp'#折线几何shp文件
    polygonFile = datadir + os.sep + 'polygon.shp'#面几何shp文件

    readPolygonAndPolyline(polylineFile)#读取面几何数据
    readPolygonAndPolyline(polygonFile)#读取面几何数据
    
    e_time=time.time()
    print("程序共耗时: %.2f s!" % (e_time - s_time)) 

完整程序可在Git中查看:

https://github.com/Linglihua/-GIS/blob/master/readShpCoordinates 

至此,已经基本了解如何读取几何要素的坐标值,可以为进一步的项目做铺垫,当然仅仅有几何坐标完全是不够的。程序用得到如SearchCursor()这样的游标,后面也会单独详细的介绍一个什么是游标,有哪些用处,比如获取属性列表,创建一个几何要素,修改属性列表,输出shp文件等,为完成项目做好技术上的准备。

 

 

 

                                                                           一起学技术,玩GIS吧

                                                                         长按识别二维码关注我们

                                                            

 

 

  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值