gpt4 book ai didi

c# - 为什么使用 ArcGIS 9.3 对象编写的程序在升级到 ArcGIS 10 后不再运行?

转载 作者:太空宇宙 更新时间:2023-11-03 16:00:28 28 4
gpt4 key购买 nike

去年的某个时候,当我们使用 ArcGIS 9.3 时,我在 Visual Studio 2008 中编写了一个 C# 程序来遍历文件夹中的所有 MXD 文件,检查所有图层源,如果错误或不正确则替换它们存在。它运行完美。

去年晚些时候,我们升级到了 ArcGIS 10。我们现在已经到了每年的那个时候,再次修复所有有问题的源。所以我进入了源代码,修复了绑定(bind),并重新引用了所有 Arc 源;这样做是为了使其与较新的 ArcGIS 10 对象兼容。该程序在使用 ArcGIS 10 制作的任何 MXD 上正常运行,但在使用 ArcGIS 9.3 制作的任何 MXD 上失败并出现以下错误:

Unable to cast COM object of type 'System.__ComObject' to interface type
'ESRI.ArcGIS.Carto.IFeatureLayer'. This operation failed because the
QueryInterface call on the COM component for the interface with IID
'{40A9E885-5533-11D0-98BE-00805F7CED21}' failed due to the following
error: No such interface supported (Exception from HRESULT: 0x80004002
(E_NOINTERFACE)).

将 ILayer 转换为 IFeatureLayer 时会发生此错误。比如这里的第二行:

ILayer layer = ...;
IFeatureLayer featureLayer = (IFeatureLayer)layer;
IFeatureClass featureClass = featureLayer.FeatureClass;

我需要能够访问该要素类。

那么为什么这个程序适用于较新的 MXD 而不是旧的?

谢谢。

编辑:这是我正在做的(稍微简化并且没有函数调用):

string[] featureClassNames = {"Building_Anno", ...};
IEnumLayer pEnumLayer = map.get_Layers(null, true);

for (int i = 0; i < featureClassNames.Length; i++)
{
pEnumLayer.Reset();

ILayer layer = null;

while ((layer = pEnumLayer.Next()) != null)
{ /* stuff */ }

if (layer == null) continue;

IFeatureLayer featureLayer = (IFeatureLayer)layer;
IFeatureClass oldFeatureClass = null;

try
{
oldFeatureClass = featureLayer.FeatureClass;
}
catch (NullReferenceException) { }

featureLayer.FeatureClass = newFeatureClass;

if (oldFeatureClass == null)
mapAdmin2.FireChangeFeatureClass(oldFeatureClass, newFeatureClass);
else if (oldFeatureClass.Equals(newFeatureClass))
return "Nope: Same source.";
else
return "Nope: Source already exists.";

} // end of for loop

最佳答案

听起来您的旧文档包含的图层不是要素图层。例如,如果您的 MXD 中有栅格,它将通过 IFeatureLayer 实现 ILayer,因为 RasterLayer CoClass没有实现 IFeatureLayer

通常的处理方式是在使用类型之前进行检查,即:

ILayer layer = ...;
IFeatureLayer featureLayer = layer as IFeatureLayer; // use as keyword
if (featureLayer != null)
{
// You have a feature class layer:
IFeatureClass fc = featureLayer.FeatureClass;

}

关于c# - 为什么使用 ArcGIS 9.3 对象编写的程序在升级到 ArcGIS 10 后不再运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21686487/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com