文章目录
- 问题:空间查询时,如果每个层级都查询一遍,效率很差且极其耗费资源;
- 问题:gdb数据库无法进行SQL的嵌套查询,会报错:
- 问题:通配符%不适用于mdb格式数据源,导致模糊查询时设置的删选条件无效,进而导致查询游标被置空;
- 问题:CreatField算法要求使用下拉选择输入要素
- 问题:输入int类型时模型识别为string类型,从而在初始化时候报错
- 问题:任务返回了false,但未记录错误
- 问题:在gdb很大时,计算总记录数算法的计算时间过于长(>20min),需要优化
- 问题:使用IGpValueTableObject向GP工具传值的时候出现错误
- 问题:使用相交的GP工具输出结果错误
- 问题:无法将类型为"Systerm._ComObject"的对象强制转换为类型FileGDBWorkspaceFactory
- 问题:地图服务只能下载json格式,而不能下载shp或者gdb
- 问题:在运行GP工具执行相交的时候,出现了System.Runtime.InteropServices.COMException (0x80010105): 服务器出现意外情况。 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))
- 问题:地图服务只能下载json格式的图层数据时,不停地报超时错误
- 问题:部分图层特别大,而地图服务的查询接口一次性只能返回1000个记录数
- 问题:使用内存图层InMemoryWorkspaceFactoryClass处理数据出现不明bug
- 问题:修改SDE图层字段时报未实现该方法或操作
- 问题:导出cad时调用distdwgoplib.dll报错:
- 问题:连接Oracle的SDE失败
- 问题:导出数据接口返回的http协议的下载链接无效
- 问题:操作过快会产生占用问题
- 问题:保存入库后范围对应不上
- 问题:SOE注册库读取不到
问题:空间查询时,如果每个层级都查询一遍,效率很差且极其耗费资源;
对策:空间查询时,考虑到如果每个层级都进行查询,一是没有必要,二是会因此导致效率很差,所以,可以只遍历第一层级所有点,随后每个层级的计算都依赖于第一层级遍历的结果,这样只需要取一次值就可以实现算法。思路如下图:

问题:gdb数据库无法进行SQL的嵌套查询,会报错:

对策:将数据统一存储在mdb数据库里
问题:通配符%不适用于mdb格式数据源,导致模糊查询时设置的删选条件无效,进而导致查询游标被置空;
对策:shapefile的字段名用双引号如:"fieldName"而MDB的采用[fieldName]格式;
shapefile的模糊查询用like ‘%A%’ 而MDB用like ‘A’;
shapefile的非字符字段不支持模糊查询而MDB格式的支持;
在进行模糊查询时最好先加入判断:
if (pDateset.Workspace.Type == esriWorkspaceType.esriFileSystemWorkspace)
{
pQueryFilter.WhereClause = "\"" + fldName + "\"" + " like '%" + this.txt_findObject.Text.Trim() + "%'"; //shp
else
{
pQueryFilter.WhereClause = "[" + fldName + "]" + " like '*" + this.txt_findObject.Text.Trim() + "*'"; //mdb
}
问题:CreatField算法要求使用下拉选择输入要素
对策:使用stringList实现,如图:

问题:输入int类型时模型识别为string类型,从而在初始化时候报错


对策:放弃原来的初始化方式,即:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

改为:

问题:任务返回了false,但未记录错误

对策:这是因为项目中引用了office,而本机没有安装导致的
问题:在gdb很大时,计算总记录数算法的计算时间过于长(>20min),需要优化
对策:使用并行计算+线程安全集合,解决了效率问题,将时间缩短了
比如在计算总记录数的步骤中
//原写法
for (int i = 0; i < groubyResult.Count(); i++)
{
IGrouping<string, DataRow> groupColumn = groubyResult.ElementAt(i);
li.Add(groupColumn.Key, groupColumn.Count());
}
//改进后写法
Parallel.For(0, groubyResult.Count(), i =>
{
IGrouping<string, DataRow> groupColumn = groubyResult.ElementAt(i);
li.TryAdd(groupColumn.Key, groupColumn.Count());
System.Threading.Thread.Sleep(10);
});
问题:使用IGpValueTableObject向GP工具传值的时候出现错误
对策:一定要注意列数,严格按照GP工具内部的列数来设置,例如,Dissolve工具输入字段时就是一列,而相交工具输入图层是是两列
//输入字段时
IGpValueTableObject pObject = new ESRI.ArcGIS.Geoprocessing.GpValueTableObjectClass();//对多个字段进行融合添加
pObject.SetColumns(1);
pObject.AddRow(dissolve_Field[0]);
pObject.AddRow(dissolve_Field[1]);
//输入图层时
IGpValueTableObject gpValueTableObject = new GpValueTableObjectClass();//对两个要素类进行相交运算
gpValueTableObject.SetColumns(2);
object o1 = rFeatureClass;//输入IFeatureClass 1
object o2 = sFeatureClass;//输入IFeatureClass 2
gpValueTableObject.AddRow(ref o1);
gpValueTableObject.AddRow(ref o2);
问题:使用相交的GP工具输出结果错误
对策:使用部分GP工具,比如相交时,需要注意输出类型,应当将其输出到gdb或者mdb中,而非直接输出为shp文件,即可解决问题
问题:无法将类型为"Systerm._ComObject"的对象强制转换为类型FileGDBWorkspaceFactory
对策:使用C#的Activator类中的CreateInstance来new FileGDBWorkspaceFactory,这样就可以成功创建
//出现错误的声明方法
IWorkspaceFactory pFileGDBWorkspaceFactoryClass = new FileGDBWorkspaceFactoryClass();
//尝试后正确的声明方法
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory"));
问题:地图服务只能下载json格式,而不能下载shp或者gdb
对策:使用这个接口即可将地图服务下载下来的json转为gdb内的图层
Url = Url + "/query";
string param = AttributeUtil.ModelToUriParam(queryParam);
//string param = JsonConvert.SerializeObject(queryParam);
string data = WebUtil.PostData(Url, param);
JObject objData = JObject.Parse(data);
string jsonfeatureSet = data.ToString();
IJSONReader jsonReader = new JSONReaderClass();
jsonReader.ReadFromString(jsonfeatureSet);
IJSONConverterGdb JSONConverterGdb = new JSONConverterGdbClass();
IPropertySet ppOriginalToNewFieldMap;
IRecordSet pRecorset;
JSONConverterGdb.ReadRecordSet(jsonReader, null, null, out pRecorset, out ppOriginalToNewFieldMap);
Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory");
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(factoryType);
IWorkspace workspace = workspaceFactory.OpenFromFile(gdbPath, 0);
IRecordSet2 recordSet2 = pRecorset as IRecordSet2;
string json2fc = layer;
recordSet2.SaveAsTable(workspace, json2fc);
问题:在运行GP工具执行相交的时候,出现了System.Runtime.InteropServices.COMException (0x80010105): 服务器出现意外情况。 (异常来自 HRESULT:0x80010105 (RPC_E_SERVERFAULT))
对策:严格使用C#提供的路径创造方法,否则即使测试时候不会出错,但在特殊情况下会出现错误
//出现错误的参数定义方法
intersect.out_feature_class = gdbPath + "/intersect" + code;
//尝试后正确的参数定义方法
intersect.out_feature_class = gdbPath + @"/" + "intersect" + code;
问题:地图服务只能下载json格式的图层数据时,不停地报超时错误
对策:修改HttpWebRequest request的参数设置,将ServicePoint.Expect100Continue设置为false
request.ServicePoint.Expect100Continue = false;
问题:部分图层特别大,而地图服务的查询接口一次性只能返回1000个记录数
对策:先查询总记录数,为防错误按照每次查询500条创建图层,然后使用append的GP工具追加到第一个图层上,随后重命名其作为后续计算依据
Append(gdbpath, name + code, help);
IWorkspaceFactory workspaceFactory = (IWorkspaceFactory)Activator.CreateInstance(Type.GetTypeFromProgID("esriDataSourcesGDB.FileGDBWorkspaceFactory"));
IFeatureWorkspace workspace = workspaceFactory.OpenFromFile(gdbpath, 0) as IFeatureWorkspace;
IFeatureClass xzqFeatureClass = workspace.OpenFeatureClass(name + code + 0);
IDataset dataset = xzqFeatureClass as IDataset;
dataset.Rename(name + code);
AlterAliasName(xzqFeatureClass, name + code);
问题:使用内存图层InMemoryWorkspaceFactoryClass处理数据出现不明bug
对策:改用临时ShapefileWorkspaceFactoryClass已解决
//出现错误的参数定义方法
IWorkspaceFactory pWSF = new InMemoryWorkspaceFactoryClass();
//尝试后正确的参数定义方法
IWorkspaceFactory pWSF = new ShapefileWorkspaceFactoryClass();
问题:修改SDE图层字段时报未实现该方法或操作
对策:SDE本质上是数据库,如果没有相关的权限,是不能编辑图层的,所以需要提前配置好
问题:导出cad时调用distdwgoplib.dll报错:

对策:sOutputDwgPath应当是一个X:\\XX\\XXX\\ABC.dwg格式的参数,即为目标输出文件
问题:连接Oracle的SDE失败

对策:在oracle的net manager中关了TNS就行
问题:导出数据接口返回的http协议的下载链接无效
对策:在IIS中给ftp绑定一个http端口,比如在231上就绑定了81端口,然后启用目录浏览,再设置MIME类型,在防火墙上设置出入站规则,打开81端口
问题:操作过快会产生占用问题
对策:获取文件的时候使用guid给加一个唯一目录
问题:保存入库后范围对应不上

对策:点选图层的xy容差和入库图层是不一样的,所以会导致入库的时候丢失点,需要重新建图层设置好正确的xy容差
问题:SOE注册库读取不到
对策:使用ilasm.exe重新反编译并且改为与项目相同的runtime进行编译
本文针对GIS开发中常见的问题提供了详细的解决方案,包括空间查询优化、数据格式转换、图层处理、GP工具使用技巧等,旨在帮助开发者提高开发效率。

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



