明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1651|回复: 5

用反距离加权算法插值出格网点高程

[复制链接]
发表于 2016-5-11 22:25:38 | 显示全部楼层 |阅读模式
建立规则格网的DEM
原数据是TXT文件
已经TXT文件的高程点展在CAD上了,画好规则格网了
问题:(1)怎么记录这些离散点在哪个方格里
2)用反距离加权插值法计算格网点高程,4-6个离散点参与运算(怎么找出是那几个离散点,怎么记录这些离散点)
设置d<20时是否满足4-6个点,满足则记录这些点(d为离散点到格网点距离)
不满足时,将距离d+5或者d-5


希望大家看到的,有些想法和思路的能够告诉我,谢谢!
发表于 2016-5-15 15:51:15 | 显示全部楼层
  1. Option Explicit


  2. Dim L As Integer '离散点数量
  3. Dim H() As Double, X() As Double, Y() As Double, Z() As Double '离散点号,x坐标,y坐标,z坐标
  4. Dim dblD As Double '网格边长
  5. Dim M As Integer    '网格的列数
  6. Dim N As Integer    '网格的行数
  7. Dim IREG() As Double    '定义一个二维数组,存储网格中点的链表的第一个点号
  8. Dim IP() As Long    '设一个链数组,存储网格中点的链表的第二个点号至最后一个点号

  9. Sub txt_read()
  10. Dim txtname As String

  11. Dim Xmax As Double, Xmin As Double, Ymax As Double, Ymin As Double
  12. dblD = 20
  13. ReDim H(100), X(100), Y(100), Z(100)

  14.     '读取文件
  15.     L = 0    '初始值
  16.     Xmax = -1.7976931348623E+308: Xmin = 1.7976931348623E+308
  17.     Ymax = -1.7976931348623E+308: Ymin = 1.7976931348623E+308
  18.     Open "D:\Personal\Desktop\demdata.txt" For Input As #1    '打开输入文件
  19.     Do While Not EOF(1)    '文件读取循环
  20.         If L > UBound(H) Then ReDim Preserve H(UBound(H) + 100), X(UBound(X) + 100), Y(UBound(Y) + 100), Z(UBound(Z) + 100)

  21.         Input #1, H(L), X(L), Y(L), Z(L)    '读取文件数据, H贮存点序号,XYZ为坐标

  22.         If X(L) >= Xmax Then
  23.             Xmax = X(L)
  24.         End If
  25.         If Y(L) >= Ymax Then
  26.             Ymax = Y(L)
  27.         End If
  28.         If X(L) <= Xmin Then
  29.             Xmin = X(L)
  30.         End If
  31.         If Y(L) <= Ymin Then
  32.             Ymin = Y(L)
  33.         End If
  34.         L = L + 1    '个数加1

  35.     Loop    '文件读取循环
  36.     Close #1    '关闭文件

  37.     Open "D:\Personal\Desktop\zuizhi.txt" For Output As #1
  38.     Print #1, Xmax, Ymax, Xmin, Ymin
  39.     Close #1    '关闭文件

  40.     '绘制格网
  41.     Dim i  As Integer, j As Integer      '设置两个i,j循环变量
  42.     Dim XlineObj As AcadLWPolyline    '创建水平格数Xlineobj变量
  43.     Dim YlineObj As AcadLWPolyline    '创建竖直格数Ylineobj 变量
  44.     Dim Xpoints(0 To 3) As Double
  45.     Dim Ypoints(0 To 3) As Double

  46.     N = Fix((Xmax - Xmin) / dblD) + 1
  47.     M = Fix((Ymax - Ymin) / dblD) + 1

  48.     '画水平上的方格总数
  49.     For i = 0 To M
  50.         Xpoints(0) = Xmin: Xpoints(1) = Ymin + dblD * i
  51.         Xpoints(2) = Xmin + N * dblD: Xpoints(3) = Xpoints(1)
  52.         Set XlineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(Xpoints)
  53.     Next
  54.     '画竖直上的方格总数
  55.     For j = 0 To N
  56.         Ypoints(0) = Xmin + dblD * j: Ypoints(1) = Ymin
  57.         Ypoints(2) = Xmin + dblD * j: Ypoints(3) = Ymin + dblD * M
  58.         Set YlineObj = ThisDrawing.ModelSpace.AddLightWeightPolyline(Ypoints)
  59.     Next
  60.     'ZoomAll
  61. End Sub



  62. Sub RecordPointPosition() '记录点在哪个网格
  63.     Dim NX As Integer, NY As Integer    '离散点所在网格的列'离散点所在网格的行
  64.     Dim Xmax As Double, Xmin As Double, Ymax As Double, Ymin As Double
  65.     Dim i As Integer, j As Integer

  66.     dblD = 20
  67.     Open "D:\Personal\Desktop\zuizhi.txt" For Input As #1    '打开输入文件
  68.     Input #1, Xmax, Ymax, Xmin, Ymin    '读取文件数据
  69.     Close #1


  70.     ReDim IP(L), IREG(N - 1, M - 1)

  71.     '循环判断
  72.     For i = 0 To L - 1
  73.         '计算样点所在网格
  74.         NX = Fix((X(i) - Xmin) / dblD)
  75.         NY = Fix((Y(i) - Ymin) / dblD)
  76.         If IREG(NX, NY) = 0 Then
  77.             IREG(NX, NY) = H(i) '记录点号
  78.         Else
  79.             j = IREG(NX, NY)
  80.             '导找链表的末端
  81.             Do
  82.                 If IP(j) = 0 Then
  83.                     IP(j) = H(i) '记录点号
  84.                     Exit Do
  85.                 Else
  86.                     j = IP(j)
  87.                 End If
  88.             Loop
  89.             
  90.         End If
  91.     Next i
  92. End Sub

  93. Public Sub ss() '测试运行
  94.     txt_read
  95.     RecordPointPosition
  96.    
  97.     '以下检查点在网格中位置
  98.     Dim i As Integer, j As Integer
  99.     Dim intTmp As Integer
  100.     For i = 0 To N - 1
  101.         For j = 0 To M - 1
  102.             If IREG(i, j) <> 0 Then
  103.                 intTmp = IREG(i, j)
  104.                 Do
  105.                     Debug.Print intTmp; ",";
  106.                     intTmp = IP(intTmp)
  107.                 Loop While intTmp > 0
  108.             
  109.                 Debug.Print , "在网格" & i & ":" & j & "内"
  110.             End If
  111.         Next j
  112.     Next i
  113. End Sub

发表于 2016-5-15 15:51:56 | 显示全部楼层
以上为第一个问题
 楼主| 发表于 2016-5-16 07:53:49 | 显示全部楼层
zzyong00 发表于 2016-5-15 15:51
以上为第一个问题

那我上次改的记录格网点的位置对吗

点评

你说呢  发表于 2016-5-16 10:32
 楼主| 发表于 2016-5-16 08:40:49 | 显示全部楼层
zzyong00 发表于 2016-5-15 15:51
以上为第一个问题

If L > UBound(H) Then ReDim Preserve H(UBound(H) + 100), X(UBound(X) + 100), Y(UBound(Y) + 100), Z(UBound(Z) + 100)
这个是什么意思
发表于 2016-5-16 12:42:16 来自手机 | 显示全部楼层
馨馨 发表于 2016-5-16 08:40
If L > UBound(H) Then ReDim Preserve H(UBound(H) + 100), X(UBound(X) + 100), Y(UBound(Y) + 100),  ...

如果点数多,原来定义的数组不够大,就再增加100个空间
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-29 01:52 , Processed in 0.847066 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表