yanxiaoyong的个人博客分享 http://blog.sciencenet.cn/u/yanxiaoyong 在路上……

博文

GISDK典型程序实例之:线数据重采样

已有 9366 次阅读 2010-4-28 20:52 |个人分类:程序设计|系统分类:科研笔记| GIS, 程序设计, 交通规划

        在实际项目中用TransCAD绘制路网时,一般是先从AutoCAD等软件中导入路网地图,然后再进行一些后续的编辑工作。但有些地图(特别是扫描后数字化的地图)经常会遇到这样一个问题:很多线段会含有很多不必要的轮廓点,手工一个个去除是非常费事的,也很让人心烦。

        我以往处理这种情况,都是先把AutoCAD地图导入SuperMap中,然后用线对象重采样的工具把多余的轮廓点去除掉,然后再保存为Shp格式导入到TransCAD中。但多种数据格式之间导来导去,难免会造成地图失真。而且,如果没有SuperMap或ArcInfo等具有曲线重采样功能的软件,就束手无策了。

        这个问题我在TranBBS论坛上问过很久了,一直没人回答,于是我就自己动手,用TransCAD软件自带的GISDK开发工具实现了这一功能。

        曲线重采样有很多方法,比较高效的是Douglas—Peucker算法,不过我在GISDK里没找到函数参数传址的功能,试验了一下没能实现DP算法,于是就采用了一种比较简单的算法:垂距法。

        关于垂距法的具体思路可以参看这篇博文:《矢量数据的压缩》,一般的GIS教材上也都会有曲线重采样算法的介绍,原理都非常简单。下边直接上代码:

//TransCAD下的线数据重采样代码,基于垂距法
Macro "SIM"  
    view="New Layer"         //数据视图view名称为“New Layer”,请根据实际的线图层名自行修改
    SetLayer(view)           //将“New Layer”置为当前图层
    view_set = view + "|"                   //定义视图集view_set,其中包含了一个视图view
    rec = GetFirstRecord(view_set, null)    //得到视图集中的第一条记录
   
    while rec <> null do                 //遍历视图集中的所有线对象记录
        linepts = GetLine(view.ID)         //根据ID得到线对象的所有特征点
        tolerance = 1        //定义一个限差tolerance,单位与地图单位相同,请根据要求自行修改
        newpts = RunMacro("Offset", linepts, tolerance)   //调用垂距法,返回一个点数组newpts
        ReshapeLink(view.ID, newpts, null)                //用返回的点数组更新线对象
        rec = GetNextRecord(view_set, null, null)              //得到视图集中的下一条记录
    end

  RedrawMap()        //重采样结束,刷新视图     
endMacro

//垂距法的子程序
Macro "Offset" (pts, tol)
    star = 1     //定义起始位置
    ret:
    //如果未检查的点少于两个则不再检查,返回点数组
    if (pts.length - star) < 2 then do
        return(pts)
  end
  //顺序拾取三点执行检查 ,计算中间点到两端点连线的垂距
    dist = GetLineDistance(pts[star+1], {pts[star],pts[star+2]}) 
    if dist[1] < tol then do                    //如果垂距小于限差,则可去除这个点
        pts = ExcludeArrayElements(pts, star+1, 1)
    end
    else do                                       //否则保留该点,将检查点下移一位
        star = star+1
    end
    goto ret                                    //调回函数开头,继续执行下一步检查
endMacro



        在一个文本文件中输入上述代码后,把它保存为一个以rsc为扩展名的文件,就可以在TransCAD中运行了,具体方法如下:

        在TransCAD中打开含有要进行重采样的线类型地理文件,然后选择“Tools → Add-Ins”菜单项,TransCAD会弹出一个“Add-ins”对话框,选择列表框中的“GIS Developer’s Kit”,点击“OK”,此时TransCAD中出现了一个“GISDK Toolbox”工具栏。点击该工具栏左起第一个按钮,打开刚才建立的宏代码文件“SIM.rsc”,然后再点击第二个按钮,此时TransCAD弹出一个“Test an Add-in”对话框。在该对话框中,“Name”后输入“SIM”,即我们建立的宏代码的名字,然后点击“OK”。此时TransCAD将会运行这个宏代码,完成曲线重采样并自动刷新地图。

        注意一开始可以把tolerance设得小一些,运行后不满意可以逐步调大,千万不要一开始就设一个很大的值。另外本代码没有经过严格测试,应用前请先备份数据,万一出错了不要来找我噢:)

       



https://blog.sciencenet.cn/blog-404069-317254.html

上一篇:复杂网络观察:为什么网络会加速增长?
下一篇:GISDK典型程序实例之:非直线系数计算
收藏 IP: .*| 热度|

1 黄富强

发表评论 评论 (2 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-24 04:54

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部