遥感 RPC, RPB文件相关信息



1. rpc和rpb的区别

提示:rpc和rpb只是格式不一样,内容,基本参数都是一致的。
RPB参数的详细解释: https://blog.csdn.net/BellaLYW/article/details/127201765

(0)RPC文件解释,来源matlab

信息来源: https://fr.mathworks.com/help/map/ref/map.geotiff.rpccoefficienttag.html?searchHighlight=zero

%matlab创建一个默认的RPC信息
%可通过改动结构体不同的内容对rpc进行修改
rpctag = map.geotiff.RPCCoefficientTag;
%  map.geotiff.RPCCoefficientTag这个函数的其他用法是将RPC信息嵌入到tif文件中,不是一个很合适的用法,不需关注

matlab默认的rpc内容为:

RPCCoefficientTag with properties:

                BiasErrorInMeters: -1
              RandomErrorInMeters: -1
                       LineOffset: 1
                     SampleOffset: 1
           GeodeticLatitudeOffset: 0
          GeodeticLongitudeOffset: 0
             GeodeticHeightOffset: 0
                        LineScale: 2
                      SampleScale: 2
            GeodeticLatitudeScale: 1
           GeodeticLongitudeScale: 1
              GeodeticHeightScale: 500
        LineNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      LineDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      SampleNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    SampleDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

(1)RPC文件样例

RPC文件命名格式:filename_rpc.txt 或者 filename_RPC.txt

LINE_OFF :+8.787000000000000e+03  pixels
SAMP_OFF : +8.787000000000000e+03  pixels
LAT_OFF : +5.197788782488139e+01   degrees
LONG_OFF:  +1.267276217581132e+02   degrees
HEIGHT_OFF: -3.665824527965528e+01   meters
LINE_SCALE: +8.787500000000000e+03  pixels
SAMP_SCALE:  +8.787500000000000e+03  pixels
LAT_SCALE: +1.000000000000000e+01   degrees
LONG_SCALE: +1.000000000000000e+01   degrees
HEIGHT_SCALE :+5.036755360952578e+03   meters
LINE_NUM_COEFF_1:-2.489085287819830e-04
LINE_NUM_COEFF_2:-1.114244712474867e+01
LINE_NUM_COEFF_3:-6.168967195179680e+01
LINE_NUM_COEFF_4:+7.117708104229436e-05
LINE_NUM_COEFF_5:-1.395349820950307e-01
LINE_NUM_COEFF_6:+8.696093392117951e-03
LINE_NUM_COEFF_7:-9.575461257281814e-04
LINE_NUM_COEFF_8:+7.734382012664702e-01
LINE_NUM_COEFF_9:+2.574838134723002e-02
LINE_NUM_COEFF_10:+5.070051498763076e-06
LINE_NUM_COEFF_11:-5.809725628331042e-03
LINE_NUM_COEFF_12:+5.140801824748853e-03
LINE_NUM_COEFF_13:+4.289598645908305e-03
LINE_NUM_COEFF_14:+2.294752920112858e-03
LINE_NUM_COEFF_15:-9.015843957850683e-04
LINE_NUM_COEFF_16:+1.035394535926532e-02
LINE_NUM_COEFF_17:+1.232218463012144e-02
LINE_NUM_COEFF_18:+3.230339260864579e-02
LINE_NUM_COEFF_19:+1.047590959343009e-03
LINE_NUM_COEFF_20:+2.012768440253724e-08
LINE_DEN_COEFF_1:+1.000000000000000e+00
LINE_DEN_COEFF_2:+4.180010565216353e-04
LINE_DEN_COEFF_3:+1.324655197657377e-02
LINE_DEN_COEFF_4:-3.795304837771012e-05
LINE_DEN_COEFF_5:+2.545365596961364e-01
LINE_DEN_COEFF_6:-3.899350380745237e-04
LINE_DEN_COEFF_7:+5.589868166444578e-05
LINE_DEN_COEFF_8:+1.188681625956534e-03
LINE_DEN_COEFF_9:+6.863241299655094e-01
LINE_DEN_COEFF_10:-2.002690706130058e-04
LINE_DEN_COEFF_11:-2.072288733039329e-04
LINE_DEN_COEFF_12:+6.133069607160820e-03
LINE_DEN_COEFF_13:-1.449422536681941e-03
LINE_DEN_COEFF_14:-2.011485529779256e-06
LINE_DEN_COEFF_15:+3.500482182174969e-03
LINE_DEN_COEFF_16:+4.198143375537498e-04
LINE_DEN_COEFF_17:-2.285845110305829e-06
LINE_DEN_COEFF_18:-2.172369339810132e-04
LINE_DEN_COEFF_19:-4.144345265331140e-04
LINE_DEN_COEFF_20:-1.836223330071302e-09
SAMP_NUM_COEFF_1:+3.116290493890969e-03
SAMP_NUM_COEFF_2:+3.762565560709448e+01
SAMP_NUM_COEFF_3:-1.780287250778219e+01
SAMP_NUM_COEFF_4:+4.667388215545534e-02
SAMP_NUM_COEFF_5:-1.418392610803636e+00
SAMP_NUM_COEFF_6:-4.579691619531623e-02
SAMP_NUM_COEFF_7:+3.030408501996984e-02
SAMP_NUM_COEFF_8:-5.911326661297898e-01
SAMP_NUM_COEFF_9:-2.781904253558995e+00
SAMP_NUM_COEFF_10:-9.782108549302553e-05
SAMP_NUM_COEFF_11:+1.239834648584903e-03
SAMP_NUM_COEFF_12:+1.999566996539736e-01
SAMP_NUM_COEFF_13:+6.939464036194087e-02
SAMP_NUM_COEFF_14:-4.737705433260331e-02
SAMP_NUM_COEFF_15:-2.858026398839704e-01
SAMP_NUM_COEFF_16:-9.898030356627813e-03
SAMP_NUM_COEFF_17:+2.240107912228240e-02
SAMP_NUM_COEFF_18:+2.526433759914681e-03
SAMP_NUM_COEFF_19:+4.945279318567586e-03
SAMP_NUM_COEFF_20:-5.870434133733310e-05
SAMP_DEN_COEFF_1:+1.000000000000000e+00
SAMP_DEN_COEFF_2:+3.227373471194835e-01
SAMP_DEN_COEFF_3:+3.944306307994457e-02
SAMP_DEN_COEFF_4:-9.509654358749953e-03
SAMP_DEN_COEFF_5:+1.207778166635094e+01
SAMP_DEN_COEFF_6:-3.232572945854702e-02
SAMP_DEN_COEFF_7:+1.355313365456889e-02
SAMP_DEN_COEFF_8:-1.277420643579939e+01
SAMP_DEN_COEFF_9:-2.837944635154219e+00
SAMP_DEN_COEFF_10:-1.255397137925662e-03
SAMP_DEN_COEFF_11:+8.474582054034840e-02
SAMP_DEN_COEFF_12:+8.587278629665410e-03
SAMP_DEN_COEFF_13:+1.984850060313677e-02
SAMP_DEN_COEFF_14:-6.307604213724449e-04
SAMP_DEN_COEFF_15:+2.407506405453826e-02
SAMP_DEN_COEFF_16:-1.315252027876808e-02
SAMP_DEN_COEFF_17:+2.805758450086238e-05
SAMP_DEN_COEFF_18:-9.639541191512180e-02
SAMP_DEN_COEFF_19:-1.882857688509176e-02
SAMP_DEN_COEFF_20:+1.022672251679239e-05

(2)RPB文件样例

RPB文件命名格式:filename.rpb

satId = "XXX";
bandId = "XXX";
SpecId = "XXX";
BEGIN_GROUP = IMAGE
	errBias =   1.0;
	errRand =    0.0;
	lineOffset = 	+8.787000000000000e+03
	sampOffset = 	+8.787000000000000e+03
	latOffset = 	+5.197788782488139e+01
	longOffset = 	+1.267276217581132e+02
	heightOffset = 	-3.665824527965528e+01
	lineScale = 	+8.787500000000000e+03
	sampScale = 	+8.787500000000000e+03
	latScale = 	+1.000000000000000e+01
	longScale = 	+1.000000000000000e+01
	heightScale = 	+5.036755360952578e+03
	lineNumCoef = (
		-2.489085287819830e-04,
		-1.114244712474867e+01,
		-6.168967195179680e+01,
		+7.117708104229436e-05,
		-1.395349820950307e-01,
		+8.696093392117951e-03,
		-9.575461257281814e-04,
		+7.734382012664702e-01,
		+2.574838134723002e-02,
		+5.070051498763076e-06,
		-5.809725628331042e-03,
		+5.140801824748853e-03,
		+4.289598645908305e-03,
		+2.294752920112858e-03,
		-9.015843957850683e-04,
		+1.035394535926532e-02,
		+1.232218463012144e-02,
		+3.230339260864579e-02,
		+1.047590959343009e-03,
		+2.012768440253724e-08);
	lineDenCoef = (
		+1.000000000000000e+00,
		+4.180010565216353e-04,
		+1.324655197657377e-02,
		-3.795304837771012e-05,
		+2.545365596961364e-01,
		-3.899350380745237e-04,
		+5.589868166444578e-05,
		+1.188681625956534e-03,
		+6.863241299655094e-01,
		-2.002690706130058e-04,
		-2.072288733039329e-04,
		+6.133069607160820e-03,
		-1.449422536681941e-03,
		-2.011485529779256e-06,
		+3.500482182174969e-03,
		+4.198143375537498e-04,
		-2.285845110305829e-06,
		-2.172369339810132e-04,
		-4.144345265331140e-04,
		-1.836223330071302e-09);
	sampNumCoef = (
		+3.116290493890969e-03,
		+3.762565560709448e+01,
		-1.780287250778219e+01,
		+4.667388215545534e-02,
		-1.418392610803636e+00,
		-4.579691619531623e-02,
		+3.030408501996984e-02,
		-5.911326661297898e-01,
		-2.781904253558995e+00,
		-9.782108549302553e-05,
		+1.239834648584903e-03,
		+1.999566996539736e-01,
		+6.939464036194087e-02,
		-4.737705433260331e-02,
		-2.858026398839704e-01,
		-9.898030356627813e-03,
		+2.240107912228240e-02,
		+2.526433759914681e-03,
		+4.945279318567586e-03,
		-5.870434133733310e-05);
	sampDenCoef = (
		+1.000000000000000e+00,
		+3.227373471194835e-01,
		+3.944306307994457e-02,
		-9.509654358749953e-03,
		+1.207778166635094e+01,
		-3.232572945854702e-02,
		+1.355313365456889e-02,
		-1.277420643579939e+01,
		-2.837944635154219e+00,
		-1.255397137925662e-03,
		+8.474582054034840e-02,
		+8.587278629665410e-03,
		+1.984850060313677e-02,
		-6.307604213724449e-04,
		+2.407506405453826e-02,
		-1.315252027876808e-02,
		+2.805758450086238e-05,
		-9.639541191512180e-02,
		-1.882857688509176e-02,
		+1.022672251679239e-05);
END_GROUP = IMAGE
END;

(3)rpc和rpb文件转换函数

% lizijia  2022_4_18
% f_in_name: the input rpc or rpb file name
% f_out_name: the output rpb or rpc file name
% transform:  1 : rpb to rpc
%             2 : rpc to rpb
% use_example: 
% rpb2rpc_li(f_in_name,f_out_name,1);  % rpb 2 rpc
% rpb2rpc_li(f_in_name,f_out_name,2);  % rpc 2 rpb



function rpb2rpc_lzj(f_in_name,f_out_name,transform_type)


   if uint8(transform_type)==1
  

    % 1 读取RPB文件内容
    
    fid1=fopen(f_in_name,'r');
    
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    errBias=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    errRand=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    lineOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    sampOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    latOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    longOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    heightOffset=char(temp(2));
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    linescale=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    samplescale=char(temp(2));
    
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    latScale  =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    longScale =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    heightScale =char(temp(2));
    
    read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        lineNumCoef{i}=temp(1);
    end
    read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        lineDenCoef{i}=temp(1);
    end
     read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        sampNumCoef{i}=temp(1);
    end
     read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        sampDenCoef{i}=temp(1);
    end
    fclose(fid1);
  
      % 2 将rpb文件写为rpc文件
      fid2=fopen(f_out_name,'w');
 

    fprintf(fid2,['LINE_OFF: ',strtrim(char(lineOffset)),'  pixels']);
    fprintf(fid2,'\n');
    fprintf(fid2,['SAMP_OFF: ',strtrim(char(sampOffset )),'  pixels']);
    fprintf(fid2,'\n');
    fprintf(fid2,['LAT_OFF: ',strtrim(char(latOffset)),'   degrees']);
    fprintf(fid2,'\n');
    fprintf(fid2,['LONG_OFF: ',strtrim(char(longOffset )),'   degrees']);
    fprintf(fid2,'\n');
    fprintf(fid2,['HEIGHT_OFF: ',strtrim(char(heightOffset )),'   meters']);
    fprintf(fid2,'\n');
    fprintf(fid2,['LINE_SCALE: ',strtrim(char(linescale)),'  pixels']);
    fprintf(fid2,'\n');
    fprintf(fid2,['SAMP_SCALE: ',strtrim(char(samplescale)),'  pixels']);
    fprintf(fid2,'\n');
    fprintf(fid2,['LAT_SCALE: ',strtrim(char(latScale)),'   degrees']);
    fprintf(fid2,'\n');
    fprintf(fid2,['LONG_SCALE: ',strtrim(char(longScale )),'   degrees']);
    fprintf(fid2,'\n');
    fprintf(fid2,['HEIGHT_SCALE: ',strtrim(char(heightScale )),'   meters']);
    fprintf(fid2,'\n');

    %fprintf(fid2,'     lineNumCoef = (\r\n');
    for i=1:20
        fprintf(fid2,['LINE_NUM_COEFF_',num2str(i),': ',strtrim(char(lineNumCoef{i}))]);
        fprintf(fid2,'\n');
    end
    
    for i=1:20
        fprintf(fid2,['LINE_DEN_COEFF_',num2str(i),': ',strtrim(char(lineDenCoef{i}))]);
        fprintf(fid2,'\n');
    end
    
    for i=1:20
        fprintf(fid2,['SAMP_NUM_COEFF_',num2str(i),': ',strtrim(char(sampNumCoef{i}))]);
        fprintf(fid2,'\n');
    end
    
    for i=1:20
        fprintf(fid2,['SAMP_DEN_COEFF_',num2str(i),': ',strtrim(char(sampDenCoef{i}))]);
        fprintf(fid2,'\n');
    end
    
    fclose(fid2);
    
    
   elseif uint8(transform_type)==2
      
   % 1 读取RPC文件内容
    
    fid1=fopen(f_in_name,'r');
   

    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    lineOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    sampOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    latOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    longOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    heightOffset=char(temp(2));
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    linescale=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    samplescale=char(temp(2));
    
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    latScale  =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    longScale =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
    heightScale =char(temp(2));
    
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
        lineNumCoef{i}=temp(2);
    end
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
        lineDenCoef{i}=temp(2);
    end

    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
        sampNumCoef{i}=temp(2);
    end

    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',',','p','d','m',':'});
        sampDenCoef{i}=temp(2);
    end
    fclose(fid1);
  
    % 2 将rpc文件写为rpb文件
    fid2=fopen(f_out_name,'w');
    fprintf(fid2,'satId = "XXX";');
    fprintf(fid2,'\n');
    fprintf(fid2,'bandId = "XXX";');
    fprintf(fid2,'\n');
    fprintf(fid2,'SpecId = "XXX";');
    fprintf(fid2,'\n');
    fprintf(fid2,'BEGIN_GROUP = IMAGE');
    fprintf(fid2,'\n');
    fprintf(fid2,'	errBias =   1.0;');
    fprintf(fid2,'\n');
    fprintf(fid2,'	errRand =    0.0;');
    fprintf(fid2,'\n');
    
    fprintf(fid2,['	lineOffset = ',strtrim(char(lineOffset))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	sampOffset = ',strtrim(char(sampOffset ))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	latOffset =  ',strtrim(char(latOffset))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	longOffset =  ',strtrim(char(longOffset ))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	heightOffset =  ',strtrim(char(heightOffset ))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	lineScale =  ',strtrim(char(linescale))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	sampScale =  ',strtrim(char(samplescale))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	latScale = ',strtrim(char(latScale))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	longScale =  ',strtrim(char(longScale ))]);
    fprintf(fid2,'\n');
    fprintf(fid2,['	heightScale = ',strtrim(char(heightScale ))]);
    fprintf(fid2,'\n');
    
    fprintf(fid2,'	lineNumCoef = (');
    fprintf(fid2,'\n');
    for i=1:19
        fprintf(fid2,['			',strtrim(char(lineNumCoef{i})),',']);
        fprintf(fid2,'\n');
    end
    fprintf(fid2,['			',strtrim(char(lineNumCoef{20})),')',';']);
    fprintf(fid2,'\n');
    
    fprintf(fid2,'	lineDenCoef = (');
    fprintf(fid2,'\n');
    for i=1:19
        fprintf(fid2,['			',strtrim(char(lineDenCoef{i})),',']);
        fprintf(fid2,'\n');
    end
    fprintf(fid2,['			',strtrim(char(lineDenCoef{20})),')',';']);
    fprintf(fid2,'\n');
    
    fprintf(fid2,'	sampNumCoef = (');
    fprintf(fid2,'\n');
    for i=1:19
        fprintf(fid2,['			',strtrim(char(sampNumCoef{i})),',']);
        fprintf(fid2,'\n');
    end
    fprintf(fid2,['			',strtrim(char(sampNumCoef{20})),')',';']);
    fprintf(fid2,'\n');
    
    
    fprintf(fid2,'	sampDenCoef = (');
    fprintf(fid2,'\n');
    for i=1:19
        fprintf(fid2,['			',strtrim(char(sampDenCoef{i})),',']);
        fprintf(fid2,'\n');
    end
    fprintf(fid2,['			',strtrim(char(sampDenCoef{20})),')',';']);
    fprintf(fid2,'\n');
    
    fprintf(fid2,'END_GROUP = IMAGE');
    fprintf(fid2,'\n');
    fprintf(fid2,'END;');
    fclose(fid2);
 
   end
end



(4)读取RPB/RPC文件函数,进行RPC正算(经纬度高程–>像素坐标)

这里写的是读取RPB文件。当然也可以自行加上上面RPC和RPB文件转换的函数。实现是RPB,RPC文件的读取及坐标正算


function pixel_position=RS_read_rpb(f_in_name,llh)
   %author  lizijia
   %2022-4-28
   % 读取遥感RPB文件,输入经纬度,获取经纬度值对象的像素坐标。
   
   %f_in_name: 输入RPB,RPC文件名称
   %llh: [lat,lon,height]
   %pixel_position: [line,sample]
   

    lat=llh(1);
    lon=llh(2);
    h=llh(3);
    
    % 1 读取RPB文件内容
    fid1=fopen(f_in_name,'r');
    
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    errBias=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    errRand=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    lineOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    sampOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',});
    latOffset =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    longOffset=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    heightOffset=char(temp(2));
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    linescale=char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    samplescale=char(temp(2));
    
    
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    latScale  =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    longScale =char(temp(2));
    
    read_one_line = fgetl(fid1);
    temp=strsplit(read_one_line,{';','=',')',','});
    heightScale =char(temp(2));
    
    read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        lineNumCoef{i}=temp(1);
    end
    read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        lineDenCoef{i}=temp(1);
    end
     read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        sampNumCoef{i}=temp(1);
    end
     read_one_line = fgetl(fid1); 
    for i=1:20
         read_one_line = fgetl(fid1);
        temp=strsplit(read_one_line,{';','=',')',','});
        sampDenCoef{i}=temp(1);
    end
    fclose(fid1);

P=(lat-str2num(latOffset))/str2num(latScale);
L=(lon-str2num(longOffset))/str2num(longScale);
H=(h-str2num(heightOffset))/str2num(heightScale);
% X,Y的归一化公式
%X=(sample-str2num(sampOffset))/str2num(samplescale);
%Y=(line-str2num(lineOffset))/str2num(linescale);



num_l_coef=[];
for i=1:20
  num_l_coef=[num_l_coef,str2num(char(lineNumCoef{i}))]  ;
end
den_l_coef=[];
for i=1:20
  den_l_coef=[den_l_coef,str2num(char(lineDenCoef{i}))]  ;
end

num_s_coef=[];
for i=1:20
  num_s_coef=[num_s_coef,str2num(char(sampNumCoef{i}))]  ;
end
den_s_coef=[];
for i=1:20
  den_s_coef=[den_s_coef,str2num(char(sampDenCoef{i}))] ; 
end


xishu=[1,L,P,H,L*P,L*H,P*H,L*L,P*P,H*H,P*L*H,L*L*L,L*P*P,L*H*H,L*L*P,P*P*P,P*H*H,L*L*H,P*P*H,H*H*H];


line=((num_l_coef*xishu')/(den_l_coef*xishu'))*str2num(char(linescale))+str2num(char(lineOffset));
sample=(num_s_coef*xishu')/(den_s_coef*xishu')*str2num(char(samplescale))+str2num(char(sampOffset));

pixel_position=[line,sample];
end

2. c++(visual_studio)安装gdal

(1)安装配置:

https://blog.csdn.net/qq_40996400/article/details/89322848

(2)一个版本不合适导致的报错。

*vs配置GDAL库遇到“ fatal error U1050: PROJ_INCLUDE should be defined. PROJ >= 6 is a required depende”的错误*
解决方法:
https://blog.csdn.net/leo_csdn_/article/details/97137348

3. gdal的使用

(1)

https://www.cnblogs.com/bigbigtree/archive/2011/11/19/2255495.html

(2)python+gdal rpc批量正射校正

https://blog.csdn.net/weishaodong/article/details/121189467

4.gdal rpc正反算

(1)从行列号推算其经纬度。

https://www.cnblogs.com/xiaowangba/p/6313898.html

5.介绍rpc参数很详细的一篇文章

卫星遥感影像RPC参数求解算法研究_张过

6.RPC-ENVI注意事项:

(1)ENVI读取RPC影像某个像素的经纬度值不准确!!!
在这里插入图片描述

使用envi读取附带RPC信息的影像,通过pixel_locater可以读取某个特征点的经纬度信息。
注意注意:这个经纬度信息不准确,因为这个计算出来的经纬度没有添加高程信息!!!
解决方法:准确的RPC影像,像素->经纬度,请通过gdal的RPC反算来获取!!!

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值