1、现象说明

使用Arcpy.da.searchcursor得到Geometry,将Geometry转换成Array,再从Array转换回Geometry。若Geometry包含内环,这个过程可能导致内环丢失,且不可逆转。

例如,原始图形如下图所示:

使用如下代码:

import arcpy
arcpy.env.workspace = "C:\\scripts\\test8.gdb"
arcpy.env.overwriteOutput = True
fc1 = "feature_with_hole"
fc2 = "target_feature"
arcpy.CreateFeatureclass_management(arcpy.env.workspace, fc2, "POLYGON", fc1, "DISABLED", "DISABLED", fc1)
c1 = arcpy.da.SearchCursor(fc1, ["SHAPE@"], "OBJECTID = 1")
for row in c1:
geo1 = row[0]
array = geo1.getPart(0)
c2 = arcpy.da.InsertCursor(fc2, ["SHAPE@"])
geo2 = arcpy.Geometry('polygon', array)
c2.insertRow([geo2])

经过两次转换后,得到图形如下:

2、原因分析

经过分析发现,从Geometry转换过来的Array,内外环之间存在一个为None的Item,通过插入如下代码片段证明:

打印结果如下:

而在从Array转换回Geometry时,None Item以及之后的Item将被忽略,通过插入如下代码片段证明:

打印结果如下:

3、如何避免?

在从Array转换回Geometry时,将None Item去掉,即可将内环部分完整还原。通过插入如下代码片段证明:

打印结果如下:

4、总结

  1)从Geometry转换过来的Array,内外环之间通过一个为None的Item进行间隔;

  2)Array转换回Geometry时,None Item以及之后的Item将被忽略;

  3)Array转换回Geometry时,将None Item去掉,即可将内环部分完整还原。

Arcpy中Geometry类与Array类转换的陷阱的更多相关文章

  1. Arrays类与Array类探究

    这里所说的Arrays类是util包中的java.util.Arrays,Array是反射包中的java.lang.reflect.Array. 首先介绍Arrays类的常用的静态方法: 1.排序方法 ...

  2. C#中Array类

    Array类是C#中所有数组的基类,它是在System命名空间中定义的,Array类提供了各种用于数组的属性和方法

  3. .NET中string[]数组和List<string>泛型的相互转换以及Array类的Sort()方法(转)

    从string[]转List<string>: " }; List<string> list = new List<string>(str); 从List ...

  4. Java中int类型和tyte[]之间转换及byte[]合并

    JAVA基于位移的 int类型和tyte[]之间转换 [java] view plaincopy /** * 基于位移的int转化成byte[] * @param int number * @retu ...

  5. 日历类和日期类转换 并发修改异常 泛型的好处 *各种排序 成员和局部变量 接口和抽象类 多态 new对象内存中的变化

    day07 ==和equals的区别? ==用于比较两个数值 或者地址值是否相同.  equals 用于比较两个对象的内容是否相同   String,StringBuffer.StringBuilde ...

  6. C#中的集合(HashTable与Array类)【转】

    一.Array类 1.Array类的属性 序号 属性 & 描述 1 IsFixedSize 获取一个值,该值指示数组是否带有固定大小. 2 IsReadOnly 获取一个值,该值指示数组是否只 ...

  7. C#中的集合(HashTable与Array类)

    一.Array类 1.Array类的属性 序号 属性 & 描述 1 IsFixedSize 获取一个值,该值指示数组是否带有固定大小. 2 IsReadOnly 获取一个值,该值指示数组是否只 ...

  8. 详解C++中基类与派生类的转换以及虚基类

    很详细!转载链接 C++基类与派生类的转换在公用继承.私有继承和保护继承中,只有公用继承能较好地保留基类的特征,它保留了除构造函数和析构函数以外的基类所有成员,基类的公用或保护成员的访问权限在派生类中 ...

  9. java中的进制转换以及字符串类和数值类的相互转化

    import java.util.*; import java.io.*; import java.math.*; import java.math.*; public class Main { pu ...

随机推荐

  1. C# winform 获取鼠标点击位置

    说明:该篇随笔的代码内容并非出自本人,是在其他网站搜寻的,出处已经不记得了,本次随笔只为记录,目的帮助自己,帮助他人. 实现的原理也不做多的赘述,直接上代码. 第一个类是需要用到的Windows AP ...

  2. Ansible varialbes

    1.什么是变量? ​ 以一个固定的字符串,表示一个不固定的值 version: 1.12 2.定义变量? 1.在playbook中定义变量? vars 关键字 [root@manager projec ...

  3. 设计模式之设计原则 C#

    成为一名资深架构师首先要懂设计模式,在懂之前,要清楚设计原则,原来我就吃过这个亏,很久以前有人问我设计原则,我是一头茫然,不是只有设计模式吗?且不知设计原则就像是写书法一样,楷体就是方正,竖道有垂露等 ...

  4. webpack加载css文件及其配置

    webpack加载css文件及其配置 当我们写了几个css文件之后如果想要引用到html中去的话我们最开始的方式就是通过link标签将css文件导入进去,但是如果我们的css文件有很多的话,一个个的导 ...

  5. 想入门Web安全,这些基础知识都学会了吗?

    毕业季已经正式告一段落,这届毕业生都找到心仪的工作了吗? 正在实习期或者试用期的职场新人,是否在岗位上做的风生水起? 工作了一两年,从未升职加薪的菜鸟,还愿意继续原地踏步吗? 在校学生.IT从业者.毕 ...

  6. access truncate

    access int access(const char *pathname, int mode); 确定文件或文件夹的访问权限 //unistd.h #define R_OK 4 /* Test f ...

  7. EFLAGS寄存器(标志寄存器)

    这篇文章不是从0开始的,前面还有一些汇编基础指令以及进制,我都没写,时间问题,还是今天空闲,我才想补一下博文,后面我陆续会把前面知识点渐渐补上.我不会重0基础讲起,中间会以.汇编.C.C++交叉的形式 ...

  8. Ubuntu 18.04上安装 phpMyAdmin

    我们将安装 phpMyAdmin 在 Ubuntu18.04 上配合 Apache 一起工作. 在安装 phpMyAdmin 之前需要已经安装了LAMP栈并提供了web页面. 如果没有安装可以参照 U ...

  9. fatal error C1083: 无法打开包括文件: “Halcon.h”: No such file or directory

    这个文件是有包括的.但编译时报错. 解决方法:我把debug模式改为release模式就好了.

  10. JS高阶---继承模式(原型链继承)

    [前言] 之前已经介绍了对象创建的五种模式,下面看下继承模式 本节介绍下<原型链继承> [主体] 验证如下: 关键点: .