AutoLISP与Excel在分地测量内业工作中的应用

范森合1 武建2
(南宁市勘测院 广西南宁 530021)

【摘 要】 本文通过举例介绍了AutoLISP与Excel在分地测量内业工作中的应用。
【关键字】 AutoCAD AutoLISP Excel 分地测量内业

  1 引言
  随着时代的发展和科技的进步,工程测量资料也需要电脑化、程序化、标准化。AutoCAD是美国Autodesk公司推出的通用计算机制图软件,它有强大的绘图功能和良好的开发环境。Excel是微软公司Office办公系统的一个用于创建和维护电子表格的套件,它有自动求和、自动筛选、分类汇总等强大的功能。
  2 提出问题及解决方案
  在分地测量外业工作完成之后,就需要进行内业处理。内业工作包括编辑宗地、整饰分地测量图、打印分地测量图、宗地坐标表及分地测量统计表、装订成册等。如果仅凭内业工作人员一宗一宗地编辑,再一宗一宗相对应地统计,不仅内业工作量大(因每一宗地都需要标注宗号、权属名称、地类、面积),还比较容易出现错误(如宗号重复、宗地区域不闭合)。必将浪费大量的时间和精力,并且也没有工作效率。为此,笔者利用AutoLISP语言编写了一个程序来解决这些问题。该程序具有以下优点:①一次输入,多种用途;②自动生成一个闭合的复合线图形;③可以避免宗号重复;④自动标注宗地信息(包括标注宗号、权属名称、地类、面积);⑤自动生成宗地坐标表和分地测量统计表。
  3 程序代码
  ;;;分地测量
  (defun c:fdcl(/)
   (regmap)
   (setvar "cmdecho" 0)
   (setq word_list'("稻田" "旱地" "菜地" "林地" "宅地" "道路" "鱼塘" "塘堤"))
   (fdcl0)
   (command "layer" "s" "0" "")
   (princ "\n完成!")
   (princ)
  
  ;;;
  (defun fdcl0(/)
   (if (= (getvar "dwgtitled") 0)
    (progn
     (alert "先将图形保存到相应的工程目录下,再进行编辑!")
     (setq filname (getfiled "另存为" "D:/" "dwg" 44))
     (command "saveas" 2000 filname y)
     (setq filepath (getvar "dwgprefix"))
     (fdcl1 filepath)
     
    (progn
     (setq filepath (getvar "dwgprefix"))
     (fdcl1 filepath)
     
    
   
  ;;;
  (defun fdcl1(filepath /)
   (setvar "osmode" 0)
   (setq filename (strcat filepath "分地测量统计表.csv"))
   (setq f (open filename "w"))
   (setq bt1 "分地测量统计表")
   (write-line bt1 f)
   (setq bt2 (strcat "宗号" "," "权属名称" "," "地类" "," "面积" "," " " "," "备注"))
   (write-line bt2 f)
   (setq bt3 (strcat " " "," " " "," " " "," "平方米" "," "亩数" "," " "))
   (write-line bt3 f)
   (setq ltscale (htblc))
   (setq p1 (getpoint "\n输入地块中心位置:"))
   (while (/= p1 nil)
    (setq dcl_id (load_dialog "fdcl"))
    (new_dialog "fdcl" dcl_id)
    ;(set_tile "zdbh" zdbh)
    (set_tile "zdbh" "自动编号")
    (show_list "klist" word_list)
    (action_tile "klist" "(sub_klist $value)")
    (action_tile "accept" "(ok)(done_dialog 1)")
    (setq dd (start_dialog))
    (command "layer" "m" "分地图" "c" "magenta" "分地图" "")
    (command "boundary" p1 "")
    (setq ss (ssadd))
    (setq e1 (entlast))
    (zdzbb);子程序,生成宗地坐标表
    (ssadd e1 ss)
    (if (= z nil)
    (setq z 1)
     (setq z (+ z 1))
    
   (setq zh (itoa z))
   (setq l (strlen zh))
   (if (= l 3)
    (setq zdbh zh)
   
  (if (= l 2)
   (setq zdbh (strcat "0" zh))
  
  (if (= l 1)
   (setq zdbh (strcat "00" zh))
  
  (command "area" "o" ss)
  (setq pfm (rtos (getvar "area") 2 2))
  (setq mu (rtos (* (getvar "area") 0.0015) 2 3))
  (setq pfm2 (strcat pfm "平方米"))
  (setq ms (strcat mu "亩"))
  (setq p11 (polar p1 (* (/ pi 2) 2) (* 6.0 ltscale)))
  (setq p12 (polar p1 0 (* 6.0 ltscale)))
  (setq p2 (polar p1 (/ pi 2) (* 2.5 ltscale)))
  (setq p21 (polar p1 (/ pi 2) (* 8.0 ltscale)))
  (setq p3 (polar p1 (* (/ pi 2) 3) (* 2.8 ltscale)))
  (setq p31 (polar p1 (* (/ pi 2) 3) (* 8.0 ltscale)))
  (setq p32 (polar p1 (* (/ pi 2) 3) (* 13.0 ltscale)))
  (setq zdb (strcat zdbh "," qsmc "," tdlb "," pfm "," mu))
  (write-line zdb f)
  (setq zg (* 3.0 ltscale))
  (command "style" "等线体" "黑体" "" "" "" "" "")
  (command "layer" "m" "宗地编号" "c" "red" "宗地编号" "")
  ;(command "pline" p11 p12 "")
  (command "text" "j" "m" p1 zg "" "_____")
  (command "text" "j" "m" p2 zg ""zdbh)
  (command "layer" "m" "权属名称" "c" "blue" "权属名称" "")
  (command "text" "j" "m" p21 zg ""qsmc)
  (command "layer" "m" "土地类别" "c" "blue" "土地类别" "")
  (command "text" "j" "m" p3 zg ""tdlb)
  (command "layer" "m" "面积(平方米)" "c" "blue" "面积(平方米)" "")
  (command "text" "j" "m" p31 zg "" pfm2)
  (command "layer" "m" "面积(亩数)" "c" "blue" "面积(亩数)" "")
  (command "text" "j" "m" p32 zg "" ms)
  (setq p1 (getpoint "\n输入地块中心位置:"))
  
  (close f)
  
  ;;;
  (defun show_list(key newlist)
   (start_list key)
   (mapcar 'add_list newlist)
   (end_list)
  
  ;;;
  (defun sub_klist(vvs)
   (setq tdlb (get_tile "tdlb"))
   (setq tdlb (nth (atoi vvs) word_list))
   (set_tile "tdlb" (strcat tdlb))
  
  ;;;
  (defun ok(/)
   ;(setq zdbh (get_tile "zdbh"))
   ;(if (or (= zdbh nil) (= zdbh "")) (exit))
   (setq qsmc (get_tile "qsmc"))
   (if (or (= qsmc nil) (= qsmc "")) (exit))
   (setq tdlb (get_tile "tdlb"))
   (if (or (= tdlb nil) (= tdlb "")) (exit))
  
  4 应用实例
  在命令行输入FDCL(意为分地测量)命令后确认。
  4.1 输入宗地信息,如图1所示

图1 输入宗地信息对话框

  显示结果如图2所示

图2 分地结果图

  4.2 依次输完所有宗地信息,程序自动、完好地将数据保存到指定目录。
  4.3 整饰后的分地测量图,如图3所示。

图3 分地测量图

  4.4 自动生成的宗地坐标表,如图4所示。

图4 宗地坐标图

  4.5 自动生成的分地测量统计表,如图5所示。

图5 分地测量统计表

  4.6 分别打印分地测量图、宗地坐标表、分地测量统计表。
  4.7 装订成册。
  5 结语
  通过上面这个程序,既可使内业工作变得简单、轻松,也可在计算上起到很好的校对作用,从而确保工程的质量。该程序投放到内业工作中已使用了二、三年,实践证明,该程序确实减轻了内业人员的工作,提高了工作效率。

【参考文献】
[1]郭朝勇等编著.AutoCAD R14(中文版)二次开发技术.北京:清华大学出版社,1999
[2]于凤桐、张维铸、马宗斌等.土地利用规划.北京:中国大地出版社,1999
[3]程雄、万圆、吴爱华.土地利用规划库的建库标准研究.中国地理信息系统协会第八届年会,2004.11

作 者 简 介
范森合(1971—),助理工程师,长期从事城市测绘技术工作。
武建(1954—),助理工程师,长期从事城市测绘技术工作。

地址:广西南宁市建政路5号  邮编:530023  Tel:0771-5606397  Email:webmaster@digitalgx.com
广西基础地理信息中心版权所有 2005-2010 广西基础地理信息中心制作