首页 / 浏览问题 / 组件GIS / 问题详情
QueryParameter查询没有过滤出正确的结果
49EXP 2022年10月09日
有一个线对象的图层,我的目的就是找出这些线中,可能是重复的对象,

我是遍历每一个线对象,给这个线对象构造一个10米的缓冲区,

用这个缓冲区和图形进行查询,查找相交的线,

现在出现的问题是,任何一个缓冲区查询时 都会返回所有的线。但实际情况不是这样的。

                     Recordset objCXRecordset = objCXDatasetVector.Query(queryParameter);
                     {
                        if (objCXRecordset.RecordCount > 0)
                        {
                            objCXRecordset.MoveFirst();
                            while (!objCXRecordset.IsEOF)
                            {
                                int currentId = objCXRecordset.GetID();

                /// 获得几何线
                GeoLine objCXGeolineTemp = objCXRecordset.GetGeometry() as GeoLine;
                                BufferAnalystParameter bufferAnalystParam = new BufferAnalystParameter();
                                bufferAnalystParam.EndType = BufferEndType.Flat;
                                bufferAnalystParam.RadiusUnit = BufferRadiusUnit.Meter;
                                bufferAnalystParam.LeftDistance = 10;  //此处为获取缓冲区半径的一个方法.
                                bufferAnalystParam.RightDistance = 10;
                //为线几何对象建立缓冲区,并将分析结果存储在结果数据集中
                                GeoRegion geometryBuffer = BufferAnalystGeometry.CreateBuffer(objCXGeolineTemp, bufferAnalystParam, MapOp.FSuperMap.Map.PrjCoordSys);

 

                                QueryParameter qp = new QueryParameter();
                                qp.CursorType = CursorType.Static;
                                qp.HasGeometry = true;
                                qp.SpatialQueryMode = SpatialQueryMode.Intersect;
                                qp.SpatialQueryObject = geometryBuffer;
                                Recordset resultRecordset = objCZDatasetVector.Query(qp);
                                if (resultRecordset != null)
                                {
                                    if (resultRecordset.RecordCount == objCXRecordset.RecordCount)
                                    {
                    /// 查询的结果和图层里的对象数总是一样多
                    }
                                    else
                                    {
                    ///     
                                    }
                                    resultRecordset.Close();
                                    resultRecordset.Dispose();
                                }
                                geometryBuffer.Dispose();
                                objCXGeolineTemp.Dispose();
                                objCXRecordset.MoveNext();
                            }
                            objCXRecordset.Close();
                            objCXRecordset.Dispose();
                        }

1个回答

您好,首先如果您的目的是为了找到重复的线对象,对线对象缓冲然后进行查询缓冲区内线认定是不是重合是不合理不正确的,

您的这个思路是不能判断是不是重合的。

判断线对象空间位置上是否重合,进行重合算子的空间查询即可,判断线对象构造上是否完全一直,GeoLine.toxml进行相等判别即可。

其次,空间查询算子本身是没法给您凭空生成拓扑关系错误的结果的,空间查询查询出来的结果肯定是基于查询对象与被查询对象的严密拓扑关系的,若结果不符合您业务算法设计的预期结果,建议您检查您的算法逻辑以及将您的过程数据保存打印出来人工判别一下是否正确。

想要达到预期的业务结果,数据情况、算法路线、算法逻辑建议您仔细核查。

希望可以帮助到您。
10,758EXP 2022年10月10日
这个重复检查 是近似重复检查,不是完全一致的检查,

比如说一条路,A采集了其中一段,B采集了另外的一段,

我们要判断A和B他们的采集,是否有重复的地方,诸如此类。

所以我们的做法是把A采集的线形做个缓冲区,

看看B采集的线落入到缓冲区里面的长度有多少,来确定是否多采了。
那就建议你把你的缓冲后的面数据集叠在地图上看一下了。
...