FeatureClass范围更改

本文详细介绍了如何在不同类型的地理数据库(包括SDEGDB、FILEGDB和个人GDB)中重新设置要素类的坐标范围。通过实际操作步骤,演示了如何通过重新导入要素类或者直接修改系统表来实现坐标范围的更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重新导入

“重新导入”来更改要素类范围,适用于各种数据库(SDEGDBFILEGDBPersonalGDB),下面以SDEGDB为例介绍

当前SDE中存在要素类LDL,它的坐标范围如下图所示

 

可以从新导入这个要素类,在导入的时候重新设置坐标范围,具体过程见下面介绍。

1右键菜单,选择如下图所示的“要素类(单个)C…

2、选择导入的要素类(如下图所示选择了SDE中的LDL要素类);为导入要素类输入新名称(如下图所示“LDL_NEW”);点击窗口右下角的“环境”按钮

3、在弹出的窗口中,展开“高级地理数据库”一项,如下图所示

4、找到“输出XY”值域项,下拉列表里选择“如下面指定选项”;然后在下面坐标输入框中输入新的坐标,如下图所示;最后,点击“确定”按钮返回。

5、点击下图中的“确定”按钮,导入数据;

6、查看新导入的要素类“LDL_NEW”坐标范围,发现与之前我们设置的坐标范围一致

SDE系统表更改

    本方法只适用于SDE数据库

1、打开SDE中的LAYERS表,找到TABLE_NAME字段值等于”LDL_NEW”的记录,并记下该条记录SRID的值。如下图所示,这个值为“4

2、打开SDE中的SPATIAL_REFERENCES表,在表中找到AUTH_SRID字段值等于44:该值来源于上一步记录的值)等记录;修改FALSEXFALSEY字段值(这两个字段分别对应着minxminy),系统会根据当前的其它设置自动计算maxxmaxy

3、在ArcCatalog中重新打开空间数据库连接,查看要素类LDL_NEW的坐标范围,与前面坐标范围相比较,如下图所示

PGDB系统表修改

    本方法只适用于PersonalGDB*.mdb)数据库

新建一个personalGDB数据库即个人地理数据库,并向其中导入一个要素类LDL

Personal GDB的要素类范围修改与SDE要素类的修改方法很相似,具体过程如下:GDB_GeomColumns

 

1、打开MDB数据库,再打开数据库中的GDB_GeomColumns表,找到TableName字段值等于LDL的记录,并记下该条记录SRID的值。如下图所示,这个值为“2

 

2、打开GDB_SpatialRefs表,在表中找到SRID字段值等于22:该值来源于上一步记录的值)等记录;修改FalseXFalseY字段值(这两个字段分别对应着minxminy),系统会根据当前的其它设置自动计算maxxmaxy

3、在ArcCatalog中刷新数据库节点,查看要素类LDL的坐标范围,与前面坐标范围相比较,如下图所示

    通过更改系统表的方法来修改要素类坐标范围的,在更改完范围之后要重新计算下要素类的空间索引,以保证空间查询速度效率。、

 

import arcpy import os # 设置工作空间 gdb_path = r"F:\Project\data-2\Transportation.gdb" arcpy.env.workspace = gdb_path arcpy.env.overwriteOutput = True # 定义要素数据集路径 feature_dataset = os.path.join(gdb_path, "Transportation") # 定义数据源路径 datasets = { "Roads": r"F:\Project\data-2\道路.SHP", "GasStations": r"F:\Project\data-2\加油站.SHP", "Communities": r"F:\Project\data-2\小区.SHP", "Districts": r"F:\Project\data-2\区划范围.SHP" } # 获取源数据投影(使用道路数据) prj = arcpy.Describe(datasets["Roads"]).spatialReference # 创建要素数据集 if not arcpy.Exists(feature_dataset): arcpy.CreateFeatureDataset_management( out_dataset_path=gdb_path, out_name="Transportation", spatial_reference=prj ) # 导入数据到要素数据集 for name, path in datasets.items(): out_fc = os.path.join(feature_dataset, name) if not arcpy.Exists(out_fc): arcpy.FeatureClassToFeatureClass_conversion( in_features=path, out_path=feature_dataset, out_name=name ) # 2. 道路数据处理(排除高速公路) valid_roads = os.path.join(feature_dataset, "ValidRoads") if not arcpy.Exists(valid_roads): arcpy.analysis.Select( in_features=os.path.join(feature_dataset, "Roads"), out_feature_class=valid_roads, where_clause="类型 NOT IN ('高速公路')" ) # 验证所有必要要素类存在 required_fcs = ["Roads", "ValidRoads", "GasStations", "Communities", "Districts"] for fc in required_fcs: path = os.path.join(feature_dataset, fc) if not arcpy.Exists(path): arcpy.AddError(f"错误:缺失必要要素类 {fc}") exit() # 3. 创建拓扑 topology_name = "RoadTopology" topology_path = os.path.join(feature_dataset, topology_name) # 创建拓扑(确保拓扑不存在) if not arcpy.Exists(topology_path): arcpy.management.CreateTopology( in_dataset=feature_dataset, out_topology=topology_name, cluster_tolerance=0.001 ) print(f"拓扑已创建: {topology_path}") # 安全添加要素类到拓扑 def safe_add_featureclass_to_topology(topology_path, featureclass, xy_rank=1, z_rank=1): """安全添加要素类到拓扑,避免重复添加""" try: # 检查是否已存在 desc = arcpy.Describe(topology_path) existing_participants = [fc.name for fc in arcpy.ListFeatureClasses(feature_dataset=topology_path)] featureclass_name = os.path.basename(featureclass) if featureclass_name in existing_participants: print(f"要素类 {featureclass_name} 已在拓扑中,跳过添加") return False print(f"正在添加要素类 {featureclass_name} 到拓扑...") arcpy.management.AddFeatureClassToTopology( in_topology=topology_path, in_featureclass=featureclass, xy_rank=xy_rank, z_rank=z_rank ) print(f"要素类 {featureclass_name} 已成功添加到拓扑") return True except arcpy.ExecuteError as e: # 处理特定错误代码 if "160032" in str(e): # 类已经是拓扑成员 print(f"警告: {featureclass} 已在拓扑中(错误160032)") return False else: error_msgs = arcpy.GetMessages(2) print(f"添加要素类到拓扑失败: {error_msgs}") return False except Exception as e: print(f"添加要素类到拓扑失败: {str(e)}") return False # 添加拓扑规则的健壮方法 - 修正规则名称格式 def add_topology_rule(topology_path, rule_type, feature_class, rule_id=None): """添加拓扑规则的健壮方法""" try: # 修正规则名称格式 - 添加要素类型后缀 full_rule_name = f"{rule_type} (Line)" print(f"尝试添加规则: {full_rule_name}") arcpy.management.AddRuleToTopology( in_topology=topology_path, rule_type=full_rule_name, in_featureclass=feature_class, subtype="", in_featureclass2="", subtype2="" ) print(f"成功添加规则: {full_rule_name}") return True except arcpy.ExecuteError: # 如果名称失败,尝试使用规则ID if rule_id is not None: try: print(f"尝试使用规则ID: {rule_id}") arcpy.management.AddRuleToTopology( in_topology=topology_path, rule_type=rule_id, in_featureclass=feature_class, subtype="" ) print(f"使用ID {rule_id} 成功添加规则") return True except Exception as e: print(f"使用ID添加规则失败: {str(e)}") # 获取详细的错误信息 error_msgs = arcpy.GetMessages(2) print(f"添加拓扑规则失败: {error_msgs}") return False except Exception as e: print(f"添加拓扑规则失败: {str(e)}") return False # 改进的拓扑状态检查方法 def get_topology_status(topology_path): """获取拓扑状态的可读信息""" try: # 检查拓扑错误要素类是否存在 errors_path = os.path.join(feature_dataset, f"{topology_name}_Errors") if arcpy.Exists(errors_path): # 检查是否有错误记录 error_count
最新发布
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值