首页 / 浏览问题 / 组件GIS / 问题详情
SplitRegion切割后,如何将原图斑覆盖?
9EXP 2021年12月07日
使用产品:iobject 10i  操作系统:win10 x64
数据类型:
问题详细描述:Geometrist.SplitRegion(sourceGeoRegion,splitGeometry,targetGeoRegion1,targetRegion2)成功后,如何把sourceGeoRegion在地图上显示的区域用新的targetRegion1和targetRegion2给替换掉。效果就像idesktop里面的划线切割一样,切完以后就是两个图斑了。
问题重现步骤: 无

1个回答

您好,iObject组件有多种产品,为便于我们更快帮您解决问题,希望您可以准确标识您使用的产品,如iobject .net、iobject Python等。
希望可以帮助到您!
9,653EXP 2021年12月07日
iobject .net 10i

对数据集的记录集里把老的几何对象移除remove,新的几何对象add进来,保存修改,刷新图层显示即可。

裁剪对不同的数据,二维几何对象、二维几何对象组、几何模型、数据集等等有不同的裁剪方法。

只是单一面对分割的话,使用基本几何运算类Geometrist下的分割面对象方法SplitRegion。

希望可以帮助到您!

能说一说具体调用的方法吗?我这样写没有效果

GeoRegion resultRegion1 = new GeoRegion(), resultRegion2 = new GeoRegion();  // 用来接受分割的结果
GeoRegion region = recordset.GetGeometry() as GeoRegion;   // 待分割的原图斑
Geometrist.SplitRegion(region, splitTarget, resultRegion1, resultRegion2);  // 开始分割
region.RemovePart(0);   // 把原来的图斑删了
region.AddPart(resultRegion1[0]);  //添加结果1
region.AddPart(resultRegion2[0]);  // 添加结果2

GeoRegion resultRegion1 = new GeoRegion(), resultRegion2 = new GeoRegion(); // 接受分割后的两个结果
GeoRegion region = recordset.GetGeometry() as GeoRegion;
Geometrist.SplitRegion(region, spilitTarget, resultRegion1, resultRegion2);
region.RemovePart(0);
region.AddPart(resultRegion1[0]);
region.AddPart(resultRegion2[0]);
recordset.Edit();
recordset.SetGeometry(region);
recordset.Update();

你好,这样写是把原来的recodset变成包含两个georegion,我是想把这个recordset分割以后就变成两个recordset,要怎么实现呢?

你在updata后,从datasetvector可以拿到你新加的记录吗。
可以,像上面代码那样操作,是这个recordset变成了两个part,我想让分出来的这两个georegion变成两个recordset,并把原来的老recordset删掉,并且还支持撤回,撤回以后就可以回退到原来老recordset的样子。

  说简短点:就是要像你们idesktop里面给二维面图层进行“划线切割”一模一样的效果,并且Ctrl-Z能撤回切割,请问要怎么实现。谢谢
变成两个recordset?recordset是对应数据集的记录集,你要两个recordset是什么意思?

开发时撤回功能都是代码逻辑自行实现的。
线划切割就是把一个Geometry用分割方法分割成两个Geometry,然后在该数据集对应的记录集中移除该Geometry,新增分割后的两个Geometry,update将recordset记录集中的修改更新到dataset数据集中,刷新地图。
需求过程:

地图上有一个GeoRegion_1,这个GeoRegion_1对应着一个Recordset节点 ==> 现在调用Geometries.SplitRegion()把这个GeoRegion_1切成了GeoRegion_2和GeoRegion_3 ==> 现在我想:把这个 GeoRegion_2和GeoRegion_3添加到datasetVector里,所以这个datasetVector的Recordset就会有两个节点对应这两个新的GeoRegion。

请问:

1. 如何把Region_1对应的字段属性赋值给这Region_2和Region_3,并把Region_2和Region_3添加到datasetVector中,并把Region_1对应的recordset节点删除

2. 如何能够实现撤销划线切割的操作,让Region_2和Region_3对应的recordset节点消失,恢复region_1。

总结:

如何用iobject实现像idesktop里面划线切割一样的效果?具体表现在:①划线切割以后两个新的region在recodset里面有他们对应的节点,并且有原来老region的字段属性值 ② 两个新的被添加后,老的region对应的recordset节点会被删除 ③按Ctrl-Z可以撤销刚才的划线切割操作,让老region恢复,两个新的region消失。
”线划切割就是把一个Geometry用分割方法分割成两个Geometry,然后在该数据集对应的记录集中移除该Geometry,新增分割后的两个Geometry,update将recordset记录集中的修改更新到dataset数据集中,刷新地图。“

↑↑  这个方法可以实现切割操作,但没有办法像idesktop里面按ctrl-z就可以撤回恢复成切割前的样子。
GeoRegion resultRegion1 = new GeoRegion(), resultRegion2 = new GeoRegion();   // 接受分割后的两个结果
GeoRegion region = recordset.GetGeometry() as GeoRegion;    // 待切割图斑
Geometrist.SplitRegion(region, spilitTarget, resultRegion1, resultRegion2);  // 开始切割

Dictionary<string, object> values = new Dictionary<string, object>();    // 拿到老图斑的字段信息
foreach (FieldInfo field in fieldInfos)
{
    if (field.Name.Substring(0, 2) == "Sm") continue;
    values.Add(field.Name, recordset.GetFieldValue(field.Name));
}
recordset.Delete();  // 删掉老的
recordset.Update();

recordset.AddNew(resultRegion1, values);  // 添加新图斑1,并给字段赋值
recordset.Update();

recordset.AddNew(resultRegion2, values); // 添加新图斑2,并给字段赋值
recordset.Update();

我现在就是按您的思路写的,但是没有办法Ctrl-Z或者mapContro.Undo()撤回。

属性编辑用记录集里set系方法。
软件开发过程里的版本控制、撤回、回退等操作是需要你这边自行代码逻辑实现的哈。
不是代码的撤回....是在程序运行起来以后,在mapControl里面我把这个东西画线切割开了,要怎么用代码实现撤回刚才的划线切割的操作...
是代码实现的啊 CtrlZ组合键事件或者你其他操作来触发的这个撤回是事件,是业务代码写出来的

dataset里内容的“撤回”或者mapcontrol上绘制内容的“撤回”都是开发自行设计实现的哈。

建议你可以直接百度了解下winfrom实现撤回的开发思路,内部逻辑不管日志式、版本控制式、内存式等等很多种方式都是可以实现的哈,只是说外部触发你可以用观念里常见的CtrlZ来触发你的事件。

意思就是下面这段代码是正确的分割代码,但是iobject没有提供能够对recordset操纵进行撤回的接口,要自己手撕一个?

GeoRegion resultRegion1 = new GeoRegion(), resultRegion2 = new GeoRegion();   // 接受分割后的两个结果
GeoRegion region = recordset.GetGeometry() as GeoRegion;    // 待切割图斑
Geometrist.SplitRegion(region, spilitTarget, resultRegion1, resultRegion2);  // 开始切割

Dictionary<string, object> values = new Dictionary<string, object>();    // 拿到老图斑的字段信息
foreach (FieldInfo field in fieldInfos)
{
    if (field.Name.Substring(0, 2) == "Sm") continue;
    values.Add(field.Name, recordset.GetFieldValue(field.Name));
}
recordset.Delete();  // 删掉老的
recordset.Update();

recordset.AddNew(resultRegion1, values);  // 添加新图斑1,并给字段赋值
recordset.Update();

recordset.AddNew(resultRegion2, values); // 添加新图斑2,并给字段赋值
recordset.Update();

不止gis,对于winform来说很少有控件有你说的撤回api
好吧,主要我看到maopControl里面有个undo可以撤回对要素的节点编辑 拖动啥的,以为是我的切割方法没对无法触发undo
mapcontrol类里的undo是组件产品在此类上额外提供的撤回,您可以在mapcontrol类界面中看到描述,提供的该撤回事件是针对开启了编辑的图层时,对基本对象绘制功能的撤回。(比如Action、复制、剪切、粘贴等这些)

比如你额外使用Split方法去操作的,需要您这边根据您需要的功能自行追加或者来实现撤回事件。

mapcontrol现有的Action和剪切复制粘贴等new或者delete几何对象的方法,所以才有对应的撤回。

对于winfrom来说,哪方做的方法哪方才能做对应方法的撤回实现。
...