• 【GIS数据处理】 利用空间关系建立线CAD数据和属性表关联


    这两天遇到一个不太容易解决的问题。

    某燃气公司想自己对自建管线进行测绘便于数字化管理,在接受了简单的RTK测量培训和Cass成图培训后,就自己着手开干。

    最近数据整理的差不多了,就提交给我请我帮忙核查下是否可用。

    拿到数据后,发现几个问题: 

    1. 成图的数据并没有在CASS中完成空间对象编码的赋值

    2. 所整理的属性表(Xls)可能有大量的不规范甚至不全。

    这份数据可以用于绘制一个基本的管网分布地图,但是却难以用于空间数据管理和分析。

    根本原因在于,图(空间数据)和属性没有成功建立联系。 这也是我认为某地经信委请来的团队极度不靠谱的原因,因为数据表结构是对方要求,而对于管线,其结构中没有体现唯一性的字段。

    其实到这时感觉是比较麻烦的,因为建立空间关联向来都是GIS数据处理中的大问题。如果是定点还容易,特定坐标系统下的坐标+高程能够基本确定唯一,但是对于线和面对象就复杂了。

    不过出于程序员偷懒的本性,还是不希望去和对方讲你们重做一遍这样的话,毕竟上万个点的重来还是很大的工作量。那么思考开始。

    首先,已经完成且看上去质量不错的数据有 管线CAD数据,管线属性表,管线点属性表三份。

    因为测绘是由点成线,由线成面的过程,所以点数据一定是包含全部线折点信息的。【此处说明一下,对方是提供了可用的点CAD的,但是没有列在可用里是因为该数据可以直接通过点属性以坐标展开得到。】

    即是说,将管线上的关键点(折点)提取出来加以筛选,这个结一定和展点结果有空间上一一对应。

    再看管线属性表上,有几个字段可以重点关注: 起始点号、终止点号、管线长度。

    那么直觉告诉我,利用对起止点号的关联,应该就能够完成整个匹配工作。所以接下来的目标非常明确,提取出正确的管线起止点号。

    显然,直接用线转点得到的点是没有点号信息的(因为该数据来自线数据,而线数据没有关联属性),但是关键点必须要有。 所以第一步,使用 ArcToolBox/DATa management/Feature/ Feature vertical to Point 工具提取每段管线的起止点。

    【PS: 前期特别交代过,连线时必须连接成多段线而不是线段,所以这里起止点的提取才是有效的】

    接下来就是怎样将这些起止点的信息匹配到位。 GIS之所以改变数据处理的方式就在于,通过为各种平面数据增加一个地理基准维度,使得这些(具备地理信息属性的)平面数据能够产生更多的关联。 前文分析过,起止点一定是全部点数据的子集,所以这里直接使用Spatial Join,实现基于空间位置的唯一关联。

    当然,因为Spatial Join的算法会考虑各个点之间的最短距离/最小中误差等几种情况,以实现一个容差内的空间捕捉,所以直接得到的数据结果中可以发现存在一个 Join源点对应多个匹配点的情况。好在ArcMap非常贴心的为这个Join的结果属性表中增加了Distance字段,根据它进行排除。 比如,在我的例子中,两个点图层上的点必然是一一唯一空间对应的,那么全部可保留的数据的Distance值只能是0. 而在一些复杂的拓扑情况下,因为数据精度、坐标系转换参数等的问题,可能需要一个容差值,那么此时的Distance中就不一定全是0了。

    得到这一步的结果,就相当于我对计算区内全部的起止点完成了属性值的匹配。那么这里得到最关键的信息其实就是点号。

    根据前边的介绍,点号是用来建立点和线关联的字段。所以接下来的问题是,怎样确保我知道起止点分别是哪个。 

    到这是真的犯难了,因为第一次做的思路和这里写差不多,不过是起点和止点分开匹配,然后再对结果求交集,于是仅仅得到一条数据。经过分析发现,对方很可能在连线时没有意识的去按照真实的管线流向进行连接,所以这里的起止点并不明确。

    到这一步,开始打算是对起止点两个字段进行模糊匹配,比如管线表中指定: 起点号 001001,末点为001134,那么我在目前得到的数据中匹配,只要两个字段分别包含这两个点号,就认定匹配。 这个思路应该是没有问题的,但是实践起来不太容易。如果读者有兴趣,可以自己尝试下?

    好在对方的偷懒给我省下了很多事。对方表示大部分的起止点规则都是起点<止点。那么事情就很简单了。

    我将起止点结果数据导出一份,再对管线数据进行一次空间连接,这样就相当于管线数据也有了带点号的起止点信息。接下来,对这个属性表分析:

    因为直接提取的起止点采用的策略是 Both Ends,所以实际上在得到的起止点表里是两行数据对应一条线。而另一个关键字段是ORIG_FID,即源FeatureID,是管线数据自己的空间对象ID。所以只要确保ORIG_FID是一样的,这两个点就是对应的这条管线的起止点。那么接下来的处理可以交给Excel解决,两行一条线,我就利用Excel的列排序功能直接得到两列按ORIG_FID分组、再按点号升序、降序的点号数据,如下:

                                      --------------------------------------------

                                      ORIG_FID       起始点号          终止点号

                                      --------------------------------------------

                                      10                  0010124      0010225

                                      --------------------------------------------

                                      10                  0010225          0010124

                                      ————————————————————

    让Excel以ORIG_FID列为准,去除重复行就能得到满足起始点号小于终止点号的结果。

    最后再将这个数据表与管线数据进行Join(Table Join即可),ORIG_FID作为关联字段,就能得到带有起止点信息的管线空间数据。此时,再对管线属性表进行关联,关联字段为起始点号,就能完成整个基于空间关系的匹配工作。

    PS:

    特别提醒,以这个方法完成关联的前提是,能够正确提取线的起止点,点、线属性表数据记录数量必须与空间数据的要素数量一致,否则匹配结果会有误。

    总体来说,这个流程是面向特定的情况设计实践的,但是数据处理过程中应该更准确的抓住问题,才能考虑出解决核心问题的方案。

  • 相关阅读:
    curl 命令行使用参考
    PHP 输出json_encode 空白的检查
    RAM和ROM
    浮点数
    负数补码
    位运算
    无法加载文件 C:UsershuangshiminAppDataRoaming pmwechat-terminal.ps1,因为在此系统上禁止运行脚本
    windows + php + shell_exec 执行失败的可能原因
    Ubuntu 发送邮件
    红黑树
  • 原文地址:https://www.cnblogs.com/DannielZhang/p/6867968.html
Copyright © 2020-2023  润新知