测绘-编写数字高程模型(DEM)内插程序

本文介绍了一种使用移动二次曲面法进行数字高程模型(DEM)内插的方法。通过10个已知坐标点,计算未知点(110,110)的高程值。具体步骤包括建立局部坐标系、构造误差方程、求解系数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

、 实习目的

掌握移动曲面法数字高程模型内插原理及其内插子程序的设计方法,了解其它逐点高程内插方法的基本原理。

二、 实习内容

根据提供的10个数据点的坐标(Xn,Yn,Zn)和待求点的平面坐标(Xp,Yp),要求利用移动二次曲面拟合法,由格网点PXp,Yp)周围的10个已知点内插出待求格网点P的高程,编制相应的程序并进行调试,最后解算出格网点P的高程并提交源程序代码。

三、资料准备

已知数据点坐标

点号

X

Y

Z

1

102

110

15

2

109

113

18

3

105

115

19

4

103

103

17

5

108

105

21

6

105

108

15

7

115

104

20

8

118

108

15

9

116

113

17

10

113

118

22

 

编程计算点(110,110)上的高程。

四. 操作步骤

     1、读入已知点的坐标,建立以待定点为原点的局部坐标系;

     2、建立误差方程式:

3、组成法方程,解算六个系数:

4、整理计算结果,以实习报告的形式递交成果。


程序:

// 摄影测量实习2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;


void InverseMatrix(double a[],int n)
{
	int *is,*js,i,j,k,l,u,v;
	double d,p;
	is = (int*)malloc(n * sizeof(int));
	js = (int*)malloc(n * sizeof(int));
	for(k = 0; k <= n - 1;k++){
		d = 0.0;
		for(i = k; i <= n - 1; i++)
			for(j = k; j <= n - 1; j++){ 
				l = i * n + j; 
				p = fabs(a[l]);
				if(p > d){ 
					d = p; 
					is[k] = i; 
					js[k] = j;


				}
			}


			if(d + 1.0 == 1.0){ 
				free(is); 
				free(js); 
				printf("err**not inv\n");
				return ;


			}


			if(is[k] != k)
				for(j = 0; j <= n - 1;j++){ 
					u = k * n + j; 
					v = is[k] * n + j;
					p = a[u]; 
					a[u] = a[v]; 
					a[v] = p;


				}


				if(js[k] != k)
					for(i = 0; i <= n - 1; i++){ 
						u = i * n + k; 
						v = i * n + js[k];
						p = a[u]; 
						a[u] = a[v]; 
						a[v] = p;


					}


					l = k * n + k;
					a[l] = 1.0/a[l];


					for(j = 0; j <= n - 1;j++)
						if(j != k){ 
							u = k * n + j; 
							a[u] = a[u] * a[l];


						}


						for(i = 0; i <= n - 1;i++)
							if(i != k)
								for(j = 0; j <= n - 1;j++)
									if(j != k){ 
										u = i * n + j;
										a[u] = a[u] - a[i * n + k] * a[k * n + j];


									}


									for(i = 0; i <= n - 1;i++)
										if(i != k){
											u = i * n + k; 
											a[u] = -a[u] * a[l];


										}
	}


	for(k = n - 1;k >= 0;k--){ 
		if (js[k] != k)
			for (j = 0;j <= n - 1;j++){ 
				u = k * n + j; 
				v = js[k] * n + j;
				p = a[u]; 
				a[u] = a[v]; 
				a[v] = p;
			}
			if(is[k] != k)
				for(i = 0; i <= n - 1; i++){ 
					u = i * n + k; 
					v = i * n + is[k];
					p = a[u]; 
					a[u] = a[v]; 
					a[v] = p;
				}
	}
	free(is); 
	free(js);
}


typedef struct 
{
	double X;
	double Y;
	double Z;
}DATA;


int _tmain(int argc, _TCHAR* argv[])
{
	    FILE *fp1;                                                                                                                 
		DATA data[10];                                                               
		fp1=fopen("Table.txt","r");                                                                                                       
		if(fp1==0)                                                                                                                     
		{                                                                                                                                
			printf("Error!Can't open it!\n");                                                                                            
			return 0;                                                                                                                    
		}    
		for(int i=0;!feof(fp1);i++)                                                                                                          
		{                                                                                                                                
			fscanf(fp1,"%lf %lf  %lf",&data[i].X,&data[i].Y,&data[i].Z);   
			data[i].X=data[i].X-110;
			data[i].Y=data[i].Y-110;
		}                                                                                                                      
		fclose(fp1);
		double L1[10];
		double result[6]={0};
		for(int i=0;i<10;i++)
		{
			L1[i]=data[i].Z;
		}


	
		double A[10][6];
		for(int i=0;i<10;i++)
		{
			A[i][0]=data[i].X*data[i].X;
			A[i][1]=data[i].X*data[i].Y;
			A[i][2]=data[i].Y*data[i].Y;
			A[i][3]=data[i].X;
			A[i][4]=data[i].Y;
			A[i][5]=1;
		}


		double AT[6][10];
		for(int i=0;i<10;i++)
		{
			for(int j=0;j<6;j++)
			{
              AT[j][i]=A[i][j];
			}
		}
		double t;
		double ATA[6][6];
      for(int i=0;i<6;i++)
		{
			for (int m=0;m<6;m++)
			{
				t=0;
				for (int j=0;j<10;j++)
				{
					t=AT[i][j]*A[j][m]+t;	 
				}
				ATA[i][m]=t;
			}	
		} 


	  InverseMatrix(*ATA,6);


	  double A1[6][10];
	  double tt;
		for(int i=0;i<6;i++)
		{
			for (int m=0;m<10;m++)
			{
				tt=0;
				for (int j=0;j<6;j++)
				{
					tt=ATA[i][j]*AT[j][m]+tt;	 
				}
				A1[i][m]=tt;
			}	
		}
		for(int  i=0;i<6;i++)
		{  
			double o=0;
			for( int j=0;j<10;j++)
			{
				o=A1[i][j]*L1[j]+o;
			}
			result[i]=o;
		}


		printf("%f %f %f %f %f %f ",result[0],result[1],result[2],result[3],result[4],result[5]);
		system("pause");
	return 0;
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值