前言
由光电测距仪测量得到的距离是两点间的倾斜距离初始值,要得到实际倾斜距离需要加上气象改正,得到水平距离还要加上倾斜改正。下面将两种改正的推导公式进行详细说明。
气象改正
根据光速与传播时间可知距离公式为:
(1)
而光在大气中传播的速度为:
(2)
式子中:为真空中光速,n为大气折射率。
由式(1)、(2)得:
(3)
式(3)中n是采用假定大气状态下的大气折射率,而实际测距时大气状态一般不同于假定大气状态,由于
,所以必须加气象改正。
用有限增量代替微分量,可得:
(4)
假设由观测得到的距离为,经气象改正后的距离为
,则:
(5)
公式敲起来太麻烦了,需要详细过程的请参考:
《测量学》(第三版) 武汉测绘科技大学《测量学》编写组 编著 Page:303-306.
头文件
#pragma once
class DistanceCorrecte
{
double temperature_; //摄氏度
double AtmPressure_; //毫米汞柱
double lamda_; //微米
double SDistance_; //公里
double HDistance_;
double erfa_;
double VAngle_; //弧度
public:
DistanceCorrecte();
~DistanceCorrecte();
void setTemperature(double _temprature = 12){
temperature_ = _temprature;
}
void setAtmPressure(double _atmPressure = 760){
temperature_ = _atmPressure;
}
void setLamda(double _lamda = 0.93){
lamda_ = _lamda;
}
void setDist(double _dist){
SDistance_ = _dist;
}
void setVAngle(double _angle = 0){
VAngle_ = _angle;
}
double getNg();
double getN0();
double getDetaD();
double getDistanceCorrected();
double getHDistance();
};
源文件
#include "distancecorrecte.h"
#include <math.h>
DistanceCorrecte::DistanceCorrecte()
{
temperature_ = 12;
AtmPressure_ = 760;
lamda_ = 0.93;
erfa_ = 1 / 273.2;
SDistance_ = 0;
}
DistanceCorrecte::~DistanceCorrecte()
{
}
double DistanceCorrecte::getNg()
{
return 1 + (2876.04 + 48.864 / pow(lamda_, 2) + 0.68 / pow(lamda_, 4))*pow(10.0, -7);
}
double DistanceCorrecte::getN0()
{
double ng = getNg();
return 1 + ((ng - 1) / (1 + erfa_*temperature_))*(AtmPressure_ / 760.0);
}
double DistanceCorrecte::getDetaD(){
double n0 = getN0();
double ng = getNg();
return ((n0 - 1) * 1000000 - (ng - 1) * 1000000 / 760.0*AtmPressure_ / (1 + 0.0037*temperature_))*SDistance_;
}
double DistanceCorrecte::getDistanceCorrected(){
return SDistance_ + getDetaD();
}
double DistanceCorrecte::getHDistance()
{
return getDistanceCorrected()*cos(VAngle_);
}
使用方法
#include <iostream>
#include <iomanip>
#include "distancecorrecte.h"
void main()
{
DistanceCorrecte dc;
dc.setAtmPressure(757*133.3224);
dc.setTemperature(12);
dc.setLamda(0.885);
dc.setVAngle(0);
dc.setDist(962.887/1000.0);
//std::cout <<std::setprecision(10)<< dc.getNg() << std::endl;
//std::cout << dc.getN0() << std::endl;
std::cout << dc.getDetaD() << std::endl;
}