GIS开发常见bug汇总(持续更新)

本文针对GIS开发中常见的问题提供了详细的解决方案,包括空间查询优化、数据格式转换、图层处理、GP工具使用技巧等,旨在帮助开发者提高开发效率。

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

文章目录

问题:空间查询时,如果每个层级都查询一遍,效率很差且极其耗费资源;

对策:空间查询时,考虑到如果每个层级都进行查询,一是没有必要,二是会因此导致效率很差,所以,可以只遍历第一层级所有点,随后每个层级的计算都依赖于第一层级遍历的结果,这样只需要取一次值就可以实现算法。思路如下图:
在这里插入图片描述

问题: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进行编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值