米国本土の多くの地点の海までの西、北西、南西の距離に興味があります。テスト目的で、500 m (32x32 ピクセル) GMTED2010と垂直海岸線で 1/8 度の dem をループしています。このサイトを見回した結果、 pdist2 関数を実装しましたが、期待どおりの結果が得られません。だから私の最初の質問は、私が概念的に間違っているかどうかであり、2 番目の質問は私の pdist2 実装が間違っているかどうかです。私は他の解決策にもオープンです。
方向の制約が与えられた場合、3 方向すべてで同じパターンが見られると思います。ピクセルの最も西の列は同じ距離になり、次の列は同じになります。そのため、dlong
使用する 32x32 マトリックスをプロットするimagesc
と、左から右、低から高への勾配が得られます。
%**************
%For those truly interested, you can download the DEM and get Z and R accordingly:
[Z120,R120]=geotiffread('~/path/to/tif/GMTED2010N30W120_150/30n120w_20101117_gmted_mea150.tif');
[Z150,R150]=geotiffread('~/path/to/tif/GMTED2010N30W150_150/30n150w_20101117_gmted_mea150.tif');
Z=[Z150 Z120];
R=R120;
Z=Z(:,6001:4800+7200); %crop Z from -100 to -125. use latlon2pix to confirm between sub-z and z
R.Lonlim=[-125, -100];
R.RasterSize=size(Z);
clear Z150 Z120 R150 R120
%******* HERE STARTS THE ALGORITHM
%coastline (ultimately will be from the coast library)
latlim=[0.25:.25:60];
lonlim=ones(length(latlim),1)*-110
%variables r and c are the row and column indices for the point I'm interested in. r and c are relative to a DEM for the entire western USA so a point in Colorado is something like 2370,4350.
rstart=2370;
cstart=4350;
for r=2370:2370+31
for c=4350:4350+31
%rows and cols are the vectors in the NW direction from point r,c.
%in the SW direction, rows=r+[1:min(r,c)-1]. cols is the same.
%W direction, rows=ones(r,1)*r; cols=c-[1:c-1];
rows= r-[1:min(r,c)-1];
cols= c-[1:min(r,c)-1];
%Use referencing object R for DEM Z of the western USA to convert rows and cols to lat and long.
[NWcoord(:,1) NWcoord(:,2)]=pix2latlon(R,rows,cols);
%use pdist2 to find the shortest distance between any two points in the two vectors
[D,i]=pdist2(lonlim,NWcoord(:,2),'euclidean','smallest',1);
[~, mi]=min(D);
sta.NWcoast=[latlim(i(mi)) lonlim(i(mi))];
dlong(r-rstart+1,c-cstart+1)=distance(lat,long,latlim(i(mi)),lonlim(i(mi))); %great arc distance on earth's surface. radians
end
end