查找相同工具的脚本

93
4
跳到解决方案
一个月前
CFrost
通过
新贡献者II

我想写一个脚本,将找到重复的多边形基于形状,定义的属性,和位置。我认为Find same工具将提供我所需要的,但我没有使用它的许可证。

有人有什么建议吗?

谢谢

0荣誉
1解决方案

接受的解决方案
CFrost
通过
新贡献者II

嗨,谢谢,非常感谢!我修改了上面的代码,以查看shape_length和shape_area作为一个测试,但我收到以下错误消息

回溯(最近一次调用):
文件"",第21行,在<模块>
RuntimeError:请求取消

我修改后的代码如下:

#输入参数in_table = "temp_layer" out_table_folder = "memory" out_table_name = " same " fields = ["Shape_length", "SHAPE_Area"] only_duplicate = False #创建输出表arcpy.env.overwriteOutput = True out_table = arcpy.management. output = True创建表(out_table_folder, out_table_name)AddField(out_table, "IN_FID", "LONG")AddField(out_table, "FEAT_SEQ", "LONG") # read and group in_table groups = dict() for i, f in enumerate(fields): if f == "Shape": fields[i] = "SHAPE@WKT" with arcpy.da。搜索Cursor(in_table, ["OID@"] + fields) as cursor: for row in cursor: oid = row[0] key = tuple(row[1:]) try: groups[key].append(oid) except KeyError: groups[key] = [oid] # write groups into out_table with arcpy.da.InsertCursor(out_table, ["IN_FID", "FEAT_SEQ"]) as cursor: for seq, key in enumerate(groups.keys()): oids = groups[key] if only_duplicate and len(oids) < 2: continue for oid in oids: cursor.insertRow([oid, seq])

你有什么建议吗?此外,我想比较字符串字段除了整数字段-这段代码将工作,而不管字段类型?谢谢!

在原帖子中查看解决方案

0荣誉
4回复
JohannesLindner
常规赛MVP
#输入参数in_table = "path_or_layer_name" out_table_folder = "memory" out_table_name = " same " fields = ["IntegerField", "Shape"] only_duplicate = False创建表(out_table_folder, out_table_name)AddField(out_table, "IN_FID", "LONG")AddField(out_table, "FEAT_SEQ", "LONG") # read and group in_table groups = dict() for i, f in enumerate(fields): if f == "Shape": fields[i] = "SHAPE@WKT" with arcpy.da。搜索Cursor(in_table, ["OID@"] + fields) as cursor: for row in cursor: oid = row[0] key = tuple(row[1:]) try: groups[key].append(oid) except KeyError: groups[key] = [oid] # write groups into out_table with arcpy.da.InsertCursor(out_table, ["IN_FID", "FEAT_SEQ"]) as cursor: for seq, key in enumerate(groups.keys()): oids = groups[key] if only_duplicate and len(oids) < 2: continue for oid in oids: cursor.insertRow([oid, seq])

祝你有愉快的一天!
约翰内斯
0荣誉
CFrost
通过
新贡献者II

嗨,谢谢,非常感谢!我修改了上面的代码,以查看shape_length和shape_area作为一个测试,但我收到以下错误消息

回溯(最近一次调用):
文件"",第21行,在<模块>
RuntimeError:请求取消

我修改后的代码如下:

#输入参数in_table = "temp_layer" out_table_folder = "memory" out_table_name = " same " fields = ["Shape_length", "SHAPE_Area"] only_duplicate = False #创建输出表arcpy.env.overwriteOutput = True out_table = arcpy.management. output = True创建表(out_table_folder, out_table_name)AddField(out_table, "IN_FID", "LONG")AddField(out_table, "FEAT_SEQ", "LONG") # read and group in_table groups = dict() for i, f in enumerate(fields): if f == "Shape": fields[i] = "SHAPE@WKT" with arcpy.da。搜索Cursor(in_table, ["OID@"] + fields) as cursor: for row in cursor: oid = row[0] key = tuple(row[1:]) try: groups[key].append(oid) except KeyError: groups[key] = [oid] # write groups into out_table with arcpy.da.InsertCursor(out_table, ["IN_FID", "FEAT_SEQ"]) as cursor: for seq, key in enumerate(groups.keys()): oids = groups[key] if only_duplicate and len(oids) < 2: continue for oid in oids: cursor.insertRow([oid, seq])

你有什么建议吗?此外,我想比较字符串字段除了整数字段-这段代码将工作,而不管字段类型?谢谢!

0荣誉
JohannesLindner
常规赛MVP

嗯…“请求取消”是一个我以前从未见过的错误,我在网上也找不到。总有一个行之有效的“重启ArcGIS”,但除此之外我不知道。

当检查Shape_Length和Shape_Area应该工作时(我可以在测试时这样做),也许从一个简单的测试表开始。

是的,您应该能够找到相同的字符串,整数,双精度(排除舍入错误),日期和几何。

很好地捕捉overwriteOutput。在我的设置中,它默认为True,所以我没有考虑这个问题。


祝你有愉快的一天!
约翰内斯
CFrost
通过
新贡献者II

谢谢你的回复,知道这是一个你不熟悉的错误是有帮助的-我会按照你的建议尝试正常的事情。谢谢你的帮助,真的很感激!

更新-设法解决错误(不确定如何)。输出如下所示:

objecd in_fid feat_seq
11 10 0
2 2 1
3 3 2
4 4 3

我知道OID 1和OID 4是完全相同的(测试数据集,看看输出是如何工作的),但我不清楚输出是如何显示这一点的-你介意解释一下吗?谢谢!

更新:Ive设法通过更改'only_duplicate= true'来解决输出的问题,这会生成一个类似于重叠功能工具的输出,其中它列出了重复的功能id。奇怪的是,当我把它改回“false”时,Feat_seq字段显示重复的值,在那里功能是重复的,所以看起来它是有效的。

谢谢这个解决方案-非常有用!

0荣誉