动态符号化和自动接边终于搞定了

Posted by 蒋波涛 11 March,2007 Views (31)Comment
  • 开年后接到通知,自己参与的基础信息系统改造3月底就要进行验收了,当务之急就是把去年半年开发的大大小小的功能组件进行集成,统一到一个大的软件框架中去,这些组件包括CAD数据依据规则库转换为GIS数据并入库、数据备份、数据更新、地图接边和动态符号化等等。

本来打算一开始就集中精力做集成工作的,但不想数据部接到的一批CAD数据入库任务,在使用我修改后的入库系统中仍然存在许多问题,以前修改这个程序的时候,编码和测试都是我一个人做,许多隐藏的问题根本没有办法查出来,这次超过200幅的标准图幅入库,总算是让整个程序的正确性和健壮性得到了考验。数据部几乎是边入库边反馈,我就在旁边直接修改程序,尽管将近一个星期的努力,整个入库系统总算是没有了大的系统性问题。

入库系统完成后,我考虑将自动符号化功能和GIS数据自动接边功能使用DLL进行开发,因为这两个功能都需要人工进行干预,放在ArcMap中是最恰当不过的事情。

自动符号化是地图可视化中的一个功能,我们在载入GIS数据到ArcMap后,往往需要对其配置符号,以进行正确的显示,实际上,许多地方是有自己专门的地理数据符号规范的,这些规范不仅规定了何种地物对象使用什么颜色、形状的符号,甚至连点符号的形状和角度都有规定,如水流方向符号等。我做的这个自动符号化功能,能够依据符号库的编码,给地物要素自动判别匹配正确的symbol,如果符号不存在,则可以产生一个随机符号给地物要素,这样整个符号化过程完全不依赖人工的判读,在符号化方面具有很高的效率。在实际数据生产和查看中,符号化具有非常重要的作用。

http://www.hmgis.cn/upload/1.png   http://www.hmgis.cn/upload/2.png

要素接边是去年就开始做的一个功能,但在实际项目的压力下,这个星期终于将其核心算法进行了极大的修改,使得整个接边的效率和可靠性较之以前的算法有了很大的提高,这些改变包括:

  1. 使用基于单个边框的缓冲区替代过去基于整个更新面的边界的缓冲区,在以前的算法中,如果一个矩形范围内的地物与周边地物接边,是构造一个环形缓冲区,如果在这个缓冲区每边都有10个要素被取出进行比较,则比较的次数为40×40=1600次,而使用单个边的算法,只需要4×10×10=400次
  2. 使用一次比较法替代过去的循环比较法,在过去的算法中,如果有1、2、3三个要素,将进行1-1、1-2、1-3、2-1、2-2、2-3、3-1、3-2、3-3的9次比较;在新算法中,要素的取出次序严格按照OID值递增,这样只会进行1-2、1-3和2-3的三次比较,这样,算法的比较次数为4×(9+8+...+1)=180次
  3. 最简单的限制条件放在整个限制规则范围的最外层,为了提高效率,新算法将最简单的限制条件,即“当前要素OID必须小于比较要素OID”放在最外层,“地物编码必须匹配”放在最次外层,而两个地物的距离放在第三层,这样,大部分的要素比较都会在无需距离运算的情况下被取消
  4. 一个地物要素对符合了前三者条件后,将进行是否在接边线两侧的判读,比较的要素必须在接边的左右两侧才能参与比较
  5. 线型地物的只能进行起点对起点、终点对终点或起点对终点的接边,而不能将一条线与另一条线的中间相接
  6. 面地物判别它是边连接还是点连接,如果是点连接,则不会被接边
  7. 。。。。。。

除此以外,我还编写了一个复杂的接边日志系统【这是本功能最得意的地方之一】,它可以使用XML文件记录在接边中发生的任何接边错误和接边失败原因,这个日志可以通过一个TOC控件表格显示,并能够根据日志定位到要素上,如果已经查看了日志,还可以将日志的状态改变,这样下次再载入日志的时候,将不会显示已经被查看的日志了。

Related Items

Categories : ArcObjects Tags : ArcObjects  
Comments
2007-3-12 21:46:37

“考研”---->考验

Posted by lee Gravatar Icon

2007-3-13 13:56:45

你好,我向SDE数据库插入一条记录时,IFeatureCursor::InsertFeature()返回值正常,而IFeatureCursor::Flush()返回FDO_E_SE_GSIZE_TOO_SMALL,
请问这是怎么回事?谢谢

Posted by 小熊 Gravatar Icon

2007-3-13 14:34:09

FDO_E_SE_GSIZE_TOO_SMALL -2147216063 SDE Error
检查下你的SDE数据库的容量,可能是一次flush太多的数据。
这种错误可以在帮助中搜索到的。

Posted by 蒋波涛 Gravatar Icon

2007-3-13 15:58:43

SDE数据库的容量怎么查,我是InsertFerture一次立马Flush一次,插入45条记录flush都返回这个错误,但是插成功4条,我在帮助和网上都搜过没有,很急啊,救救我

Posted by 小熊 Gravatar Icon

2007-3-13 17:19:27

把CAD的数据导入SDE,带弧的Polyline导入后面积有误差是怎么回事?是不是ArcGIS对弧拟合了?怎么控制这个误差范围?谢谢

Posted by 小熊 Gravatar Icon

2007-3-14 11:03:31

1.你把数据插入到MDB试看看,看是否可以插入,或者插入另一个SDE库,判断是否是SDE库出了问题,如果是SDE库的问题,推荐你看看SDE_ORACLE_CONFIG这类的书
2.SDE是通过点坐标集和弧线的方式来管理地理图形的,应该有一定误差

Posted by 蒋波涛 Gravatar Icon

2007-3-14 13:29:49

有的面积误差还不小呢,有没有什么参数能控制这个误差范围?

Posted by 小熊 Gravatar Icon

2007-3-16 10:36:11

FDO_E_SE_GSIZE_TOO_SMALL,SDE容量没问题,sde库也没问题,我在另一台机器上重装了SDE,ArcObject有个例子"Insert features using an insert cursor"上面说了这样一句话,// Flush the feature cursor every 100 features // This is safer because you can write code to handle a flush error // If you don't flush the feature cursor it will automatically flush but // after all of your code executes at which time you have no control
按照他的做还是不行,帮帮我啊

Posted by 小熊 Gravatar Icon

2007-3-16 12:56:19

你不要使用Insert方式了,而是在IFeatureWorkspaceEdit开启的编辑流程中,使用CreateFeature方式往其中添加

Posted by 蒋波涛 Gravatar Icon

2007-3-16 15:09:31

我刚用了IFeatureClass::CreateFeature,虽然每条记录都插入进去了,但是几何数据和属性数据都为空,IFeature::Store也是返回FDO_E_SE_GSIZE_TOO_SMALL。可能和我的图有关,有的可以传进去。我检查了一下传不进去的图,图没有问题,坐标没有越界。不知道GSIZE到底指的什么?网上也没搜到。

Posted by 小熊 Gravatar Icon

2007-3-16 17:02:51

GSIZE是Grid Size,我把这个值设大点就行了。

Posted by 小熊 Gravatar Icon

2007-3-16 22:13:44

默认好像是1000吧,也只有一个级别

Posted by 蒋波涛 Gravatar Icon

2007-3-19 8:26:18

CAD数据导入SDE,由于CAD图的坐标都是任意的,有时候会越界,请问有什么方法解决?谢谢

Posted by 小熊 Gravatar Icon

2007-3-19 8:50:10

不是任意的,在实际工程项目中,CAD数据的坐标是严格控制的,不会越界。如果真越界,你需要自己计算CAD的边界,按照边界范围设计要素类或数据集。

Posted by 蒋波涛 Gravatar Icon

2007-3-20 0:45:25

我在map上画了一些元素后,总之就是进行了修改,如何判断这个修改?就是说如何判断当前的map与保存的map已经不同?

Posted by 433 Gravatar Icon

2007-3-27 16:05:29

你好,我想自己写一个Identify功能,用的是ArcEngine的MapControl,请问怎么取得用户点击处的Feature?

Posted by 小熊 Gravatar Icon

2007-3-27 20:18:11

这个功能在我的blog上讲过多次。你可以找过去的blog看。

Posted by 蒋波涛 Gravatar Icon

2007-5-17 9:54:15

jbttm你好:
有个问题想问一下,你在日志里提到的接边是不是就是地图的合并?我现在想用ArcEngine实现地图的合并,不知道能不能给我一点指点。谢谢

Posted by vicky Gravatar Icon

2007-5-18 15:00:13

你好!
我是ArcIMS初学者,现在发布的地图上省的名称显示不出来,只有小方形,请问在哪里修改一下?

Posted by fyb Gravatar Icon



2007-7-6 15:35:27

请问你自动接边程序是采用什么语言做的,是VBA,还是Python。ArcGIS中对于栅格图形的处理,是不是先取出栅格图形的像元值后,经过运算,然后在新建一个栅格图形,将计算后的像元值赋值给这个图形。若采用VBA来进行这种运算速度是不是很慢?

Posted by 是在那里做的 Gravatar Icon

2007-7-28 2:56:14

你好,我在ArcMAP中配置MXD文件时为了使地图符号随地图比例尺变化而设置了
Reference Scale 为 1:2000,并且设置了坐标系
但是在应用程序中加载mxd文件后用IDisplayTransformation.FromPoints 方法获取map distance ,map distance 不随比例尺的变化而成了一个固定值,请问怎样才能使map distance 变化。
谢谢!

Posted by chuliobo Gravatar Icon

2007-7-31 16:11:49

你好,请问能否深入讲解自动符号化功能如何实现,或者提供一些编程思路 非常感谢

Posted by 左岸 Gravatar Icon

2007-7-31 22:10:39

这个很简单,首先你必须有专门的符号库,不同的地方都可能根据本地实际情况并结合国家规范指定了专门的符号规范,这些规范是依据不同地物类型产生的。你根据地物类型的数量产生唯一值着色即可,如果有选择的地方,依据地物的角度改变符号的角度即可。

Posted by 蒋波涛 Gravatar Icon

2007-9-14 17:32:43

你好,领导交给我数据入库即接边,没有头绪,请帮助俺一下。(第一次碰GIS这玩儿意),谢谢~~!

Posted by Awen Gravatar Icon

2007-9-14 17:34:21

还有就是他们说的你的那本书,是什么书呢?

Posted by Awen Gravatar Icon

2007-9-14 21:48:36

1.第一次碰GIS,我很难帮你怎么做。数据入库是个非常复杂的事情,以我们这里的测绘提交的DWG数据为例,我们需要依据本市的规程将DWG中的CAD对象分别提取、存储、构面、接边最后入正式库,这已经不是一两篇文章说的清楚的。
2.第二个问题,请看blog首页。

Posted by 蒋波涛 Gravatar Icon

2008-1-12 16:28:33

路过支持 一下 收藏到博客了

Posted by 打标机 Gravatar Icon

2008-3-17 16:50:00

你太强了!

Posted by 122 Gravatar Icon

2010-6-20 13:18:42

你好,我想请教下,在ao中如何将一个图层的symbol复制给另一个图层,就好像arcmap中symbology中的imports symbology from a layer to another layer功能一样?折磨我好几天了,恳请解答下,谢谢!!

Posted by zbfgis Gravatar Icon

Leave a comment

Or, take a look at Archives and Categories

目录

存档