arcgis工具箱下载:【免费】arcgis大比例面要素标识工具箱资源-CSDN文库
输入要素——红框test_fishnet:

标识要素test:

输出要素——largeppt(将test图层属性附给红框图层test_fishnet,生成largepp图层):

使用说明:本工具可在不切割输入要素图斑的前提下,按标识面积最大标识要素,并生成有标识属性的输入要素图层。工具运行后请刷新显示。

使用场景:
1、跨行政区界图斑主要所属行政区的识别
2、因为边界精度导致标识图斑后被分割,使用该工具能不切割图斑进行标识,等等
具体使用方法见工具箱说明:


原始代码:
#coding=utf-8
import arcpy, os
import logging
# logging.disable(logging.CRITICAL) #禁用CRITICAL级别以下的日志记录
# 按此格式显示DEBUG级别以上的日志记录
# logging.basicConfig(filename=loggingfile, level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s-%(levelname)s-%(message)s")
logging.debug("start of program")
# arcgis工具
argv = tuple(arcpy.GetParameterAsText(i) for i in range(arcpy.GetArgumentCount()))
fc = argv[0] # 在同数据库路径下生成\largeppt为最大比例属性标识后图层,注意图层记录数
fcId = argv[1] # 文件地理数据库图层,要标识字段相同属性需融合(多对象),只要fc能标识到,就取其中最大比例的面积图斑的属性,注意如果只有部分图斑,譬如区内的部分街道,如果只放部分街道的图斑,则只要有相交都会标注那部分街道的属性,除非将区内所有街道的图斑放上去
arcpy.env.overwriteOutput = True
arcpy.env.workspace = os.path.dirname(fc)
IdHfc = r"in_memory\IdHfc"
SXFc = r"in_memory\SXFc"
SXFcMAX = r"in_memory\SXFcMAX"
SXFcTab = r"in_memory\SXFcTab"
try:
arcpy.RepairGeometry_management(fc)
arcpy.RepairGeometry_management(fcId)
largeppt = arcpy.FeatureClassToFeatureClass_conversion(fc, os.path.dirname(fc), "largeppt") # 涉及保存位置
# result = arcpy.CopyFeatures_management("roads", os.path.dirname(fc) + r"\largeppt")
# largeppt = os.path.dirname(fc) + "\\largeppt"
fcIdCopy =arcpy.FeatureClassToFeatureClass_conversion(fcId, "in_memory", "fcIdCopy") # 涉及保存位置
field_names2 = [f.name for f in arcpy.ListFields(fcIdCopy)]
arcpy.AddField_management(largeppt, "MJ", "DOUBLE")
arcpy.CalculateField_management(largeppt, "MJ",
"!SHAPE.area!", "PYTHON_9.3")
arcpy.Identity_analysis(largeppt, fcIdCopy, IdHfc)
arcpy.AddField_management(IdHfc, "BL", "DOUBLE")
arcpy.CalculateField_management(IdHfc, "BL",
"round((!SHAPE.AREA!)/!MJ!,4)", "PYTHON_9.3")
arcpy.Select_analysis(IdHfc, SXFc, "\"FID_fcIdCopy\" <> -1") # field_names2其中数据型字段,注意是标识后图层的字段名,不是标识前;筛选有属性的记录
arcpy.Statistics_analysis(SXFc, SXFcTab, [["BL", "MAX"]], "FID_largeppt") # 统计有属性的记录中最大比例的统计表
arcpy.AddField_management(SXFcTab, "SXTabBZ", "TEXT", field_length = 100)
arcpy.CalculateField_management(SXFcTab, "SXTabBZ", 'str(!FID_largeppt!) + "_" + str(!MAX_BL!)', "PYTHON_9.3")# field_names1 = "BH"
# str(!BSM!) + "a" + str(!MAX_BL!), "PYTHON_9.3")
arcpy.AddField_management(SXFc, "SXBZ", "TEXT", field_length = 100)
arcpy.CalculateField_management(SXFc, "SXBZ",
'str(!FID_largeppt!) + "_" + str(!BL!)', "PYTHON_9.3") # field_names1 = "BH"
SXFcTabqsx = arcpy.TableToTable_conversion(SXFc, "in_memory", "SXFcTabqsx") # 涉及保存位置
arcpy.JoinField_management(SXFcTabqsx, "FID_largeppt", SXFcTab, "FID_largeppt")
arcpy.TableSelect_analysis(SXFcTabqsx, SXFcMAX, "\"SXBZ\" = \"SXTabBZ\"")
field_names3 = arcpy.ListFields(SXFcMAX)
field_names4 = []
for f1 in field_names3:
if not f1.required:
field_names4.append(f1.name)
print(field_names4)
field_names5 = field_names4[field_names4.index("FID_fcIdCopy")+1:field_names4.index("BL")]
field_names5 += ["FID_largeppt"]
print(field_names5)
for i in field_names5:
field_names4.remove(i)
print(field_names4)
arcpy.DeleteField_management(SXFcMAX, field_names4)
arcpy.JoinField_management(largeppt, "OBJECTID", SXFcMAX, "FID_largeppt")
# arcpy.JoinField_management(largeppt, field_names1, SXFcMAX, field_names1, field_names2)
logging.debug("end of program")
except Exception as ex:
# If an error occurred, print line number and error message
import traceback
import sys
tb = sys.exc_info()[2]
print("捕获到的异常信息是:{}".format(ex)) # 或者使用print("捕获到的异常信息是:",ex.args[0]或者str(ex)或者直接ex);3.9版本ex.message已不可用)
print("捕获到的异常代码行号是:Line {0}".format(tb.tb_lineno))
print(traceback.format_exc()) # 显示完整错误路径
except arcpy.ExecuteError:
print(arcpy.GetMessages())
# 无错误运行else后代码
else:
logging.debug("program success")
# arcpy.AddMessage("program success")
# 有没有错误均运行finally后代码
finally:
pass
欢迎使用,如发现问题欢迎指正,需求和交流请私信

3万+

被折叠的 条评论
为什么被折叠?



