免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 2890|回复: 11
收起左侧

【walkscript】求共界线

  [复制链接]

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
发表于 2012-10-31 13:53 | 显示全部楼层 |阅读模式
在应用中,往往需要求几个地物共界线,使用walkscript可以快速批量完成这些任务。

如下图,需要求它们的共界线。
求共界线前.png



walkscript求得的结果如下图所示(红色的线)
walkscript求共界线后.png








22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-10-31 13:54 | 显示全部楼层
//求共界线
void MutualBoundary(wkLayer layer, double eps, bool bSel)
{
        int nFeaCount = bSel ? layer.getSelectionCount() : layer.getFeatureCount();
       
        //求不同的边界线
        wkClean cln;
        int i = 0;
        cln.create(layer.getBox());       
        for (i = 0; i < nFeaCount; ++i)
        {
                wkGeometry geom = bSel ? layer.getSelectionAt(i).getGeometry()
                                                           : layer.getFeatureAt(i).getGeometry();
                cln.xorOverLine(geom, eps);
        }
        cln.cleanZero(eps);
        cln.combineToArc();       
        array ps;
        wkParts parts = cln.getFirstArc();
        while (parts.handle())
        {
                ps.add(parts);
                parts = cln.getNextArc();
        }
       
        //用所有地物边界减去不同的部分,得到共界的部分
        for (i = 0; i < nFeaCount; ++i)
        {
                wkGeometry geom = bSel ? layer.getSelectionAt(i).getGeometry()
                                                           : layer.getFeatureAt(i).getGeometry();
                cln.orOverLine(geom, eps);
        }       
        for (i = 0; i < ps.getSize(); ++i)
        {
                cln.diffOverLine(ps[ i ], eps);
        }       
        cln.cleanZero(eps);
        int nCount = cln.combineToArc();
        parts = cln.getFirstArc();
        while (parts.handle())
        {
                if (parts.handle())
                        layer.addFeature(parts,false);
                parts = cln.getNextArc();               
        }
       
        cln.free();       
}


回复 支持 反对

使用道具 举报

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-10-31 13:54 | 显示全部楼层
测试代码如下:
  1. wkGeoset geoset;
  2. wkView view;

  3. void main()
  4. {
  5.         wkLayer layer = geoset.getEditableLayer();
  6.         double eps = 0.001;
  7.         MutualBoundary(layer, eps, false);
  8.         return;       
  9. }
复制代码
回复 支持 反对

使用道具 举报

4

主题

434

铜板

1

好友

版主

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
719
发表于 2012-10-31 14:00 | 显示全部楼层
多谢分享!
回复 支持 反对

使用道具 举报

185

主题

2898

铜板

13

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2398
发表于 2012-10-31 14:28 | 显示全部楼层
多谢分享 学习了!
回复 支持 反对

使用道具 举报

17

主题

5723

铜板

14

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2610
发表于 2012-10-31 16:31 | 显示全部楼层
感谢  楼主 啊
  
回复 支持 反对

使用道具 举报

0

主题

5万

铜板

3

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
5448

爱心勋章组织勋章地信元老灌水勋章荣誉会员勋章活跃勋章地信专家组VIP勋章贡献勋章成就学员勋章

发表于 2012-10-31 20:46 | 显示全部楼层
感谢楼主分享,多多学习
回复 支持 反对

使用道具 举报

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-11-1 08:02 | 显示全部楼层
  1. <p>
  2. </p><p>//求共界线</p><p>void MutualBoundary(wkLayer layer, double eps, bool bSel)</p><p>{</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>int nFeaCount = bSel ? layer.getSelectionCount() : layer.getFeatureCount();</p><p><span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>//求不同的边界线</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>wkClean cln;</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>int i = 0;</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>cln.create(layer.getBox());<span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>for (i = 0; i < nFeaCount; ++i)</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>{</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>wkGeometry geom = bSel ? layer.getSelectionAt(i).getGeometry()</p><p><span class="Apple-tab-span" style="white-space:pre">                                                        </span>   : layer.getFeatureAt(i).getGeometry();</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>cln.xorOverLine(geom, eps);</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>}</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>cln.cleanZero(eps);</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>cln.combineToArc();<span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>array ps;</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>wkParts parts = cln.getFirstArc();</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>while (parts.handle())</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>{</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>ps.add(parts);</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>parts = cln.getNextArc();</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>}</p><p><span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>//用所有地物边界减去不同的部分,得到共界的部分</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>for (i = 0; i < nFeaCount; ++i)</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>{</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>wkGeometry geom = bSel ? layer.getSelectionAt(i).getGeometry() </p><p><span class="Apple-tab-span" style="white-space:pre">                                                        </span>   : layer.getFeatureAt(i).getGeometry();</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>cln.orOverLine(geom, eps);</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>}<span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>for (i = 0; i < ps.getSize(); ++i)</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>{</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>cln.diffOverLine(ps[i], eps);</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>}<span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>cln.cleanZero(eps);</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>int nCount = cln.combineToArc();</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>parts = cln.getFirstArc();</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>while (parts.handle())</p><p><span class="Apple-tab-span" style="white-space:pre">        </span>{</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>if (parts.handle())</p><p><span class="Apple-tab-span" style="white-space:pre">                        </span>layer.addFeature(parts,false);</p><p><span class="Apple-tab-span" style="white-space:pre">                </span>parts = cln.getNextArc();<span class="Apple-tab-span" style="white-space:pre">                </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>}</p><p><span class="Apple-tab-span" style="white-space:pre">        </span></p><p><span class="Apple-tab-span" style="white-space:pre">        </span>cln.free();<span class="Apple-tab-span" style="white-space:pre">        </span></p><p>}</p><div></div>
复制代码
回复 支持 反对

使用道具 举报

22

主题

444

铜板

3

好友

助理工程师

Rank: 5Rank: 5

积分
265
 楼主| 发表于 2012-11-1 08:02 | 显示全部楼层
  1. wkGeoset geoset;
  2. wkView view;

  3. void main()
  4. {
  5.         wkLayer layer = geoset.getEditableLayer();
  6.         double eps = 0.001;
  7.         MutualBoundary(layer, eps, false);
  8.         return;       
  9. }
复制代码
回复 支持 反对

使用道具 举报

0

主题

496

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
15
发表于 2020-4-28 12:19 | 显示全部楼层
楼主大佬,您有walkscript的学习资料吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表