利用arcpy在arcgis中实现批量计算图斑四至坐标

1

问题与解决办法

这个方法的灵感来自昨天昨天,下面来说一下实现功能。

一直以来都有对图斑(polygon)多边形四至坐标提取的需求,其实是这样的,之前在群里看到了林业部门的一个小伙伴有这样的需求,就是提取图斑(polygon)多边形最四至坐标,即一个多边形的最北点、最东点、最西点、最南点。一直以来,我也想着解决这个问题,都没有想到解决的办法,因为在多边形(polygon)中,arcgis的api接口提供的是范围(包络线),而今天我们正是利用这个范围的两个角点坐标,再由arcgis的api接口将多边形各个节点坐标提取出来,然后将坐标点一一与两个坐标的最大的X坐标XMax、最大的Y坐标YMax、最小的X坐标XMin、最小的Y坐标YMin相比较,如果多边形的节点坐标中某点的X值与XMax相等,则认为该点为最东点,如果某点的X值与XMin相等,则认为是最西点,而如果某点的Y值与YMax相等,则认为是最北点,再如果某点的Y值与YMin相等,则认为是最南点,至此整个算法就结束,相对来说是比较简单的。

当然也可以使用其他的解决办法,这里就没有去研究。

2

编写代码实现

这里使用的是arcpy,即使用的是python在arcgis中的接口进行开发。开发的编辑器使用的pycharm2018.2社区版,不得不说这个编辑器还是挺好用的,毕竟开发安卓的android studio以及java开发中比较常用的编辑器使用的是idea,这些编辑器都是出自一家公司之手。关于如何在pycharm中如果arcpy站点包的解决办法,已经在之前的博客中已经提到了,大家可以参考之前的博客即可。

在编写代码的时候,这里使用到python的类,具体的实现代码如下图所示。

中间遇到调试代码两个问题。

1.python类的初始化。

Python中类的初始化必须使用括号,即obj=Object(),其中Object为我们创建的类对象,而如果使用的是obj=Object的形式,则认为obj为一个全局变量。这样造成的结果是,最新修改的数据对全局变量的修改,如下图所示,在数组中保存一个全局变量,导致所有的数据都是一样的。

而正确的使用创建类对象方式,那么每次都是新的对象,所获取值都是不一样的,具体如下图所示。

2.类对象成员变量。

Python类对象成员变量,有多种结构。之所以要把这个问题提到日程,是因为遇到如下图的错误。报错的说,str对象没有point属性,一开始我很是纳闷,明明创建的对象有point属性,还有我创建的对象怎么变成str类型去了。

来看一下问题的原因,如下图所示紫色箭头是报错的地方,很显然我创建的对象变成了一个字符,该字符对象赋值了szInfo.ID值,而szInfo.ID为一个str对象,估计是python内部已经将tmpSZResInfo对象转为了str类型了,所以导致下面的那行代码报错了。而只要代码改为红色箭头所示的形式即可。

这里讲解一般的多边形,而如果出现有空洞的多边形没有考虑在范围之内。还有一个问题,这里是使用范围(包络线)两个角点来比较的,那么会带来一个问题,在一个图形中,很有可能几个点同时落在边界上面,具体如下所示。这样就要求根据工程的需要进行取舍。

3

结果分析

编写好代码后,我们使用pycharm启动调试模式,在控制台中查看我们的运行结果。最后打印结果如下图所示。

我们来分析一下结果,以ID为0多边形为例。下图是北至坐标点。显然和上面在pycharm控制台中打印出的结果相一致。

再对比一下其他结果。显然从图面来说,已经正确的提取出图斑(polygon)的四至坐标。

4

后记

这里讲解一般的多边形,而如果出现有空洞的多边形没有考虑在范围之内。还有一个问题,这里是使用范围(包络线)两个角点来比较的,那么会带来一个问题,在一个图形中,很有可能几个点同时落在边界上面,具体如下所示。这样就要求根据工程的需要进行取舍。

至此,整个说明就讲解完了。祝你生活愉快,工作顺利。

如果觉得这篇文章有用,欢迎微信分享转载。更多内容,敬请微信关注公众号:测绘科技。

排版|测绘科技

文案|测绘科技

公众号:测绘科技

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181107G0BMCQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券