我感兴趣的是美国大陆的许多地方的W,NW,SW到海洋的距离。出于测试目的,我正在以500米(32x32像素)GMTED2010和垂直海岸线的1/8度进行循环。我浏览了这个网站并因此实现了pdist2功能但是我没有得到我期望的结果。所以我的第一个问题是,如果我在概念上是错误的,那么第二个是我的pdist2实现不正确吗?我也对其他解决方案持开放态度。
我期望在给定方向约束的情况下看到所有3个方向的相同模式。最西边的像素列将具有相同的距离,下一列将是相同的,所以当我使用dlong
绘制imagesc
的32x32矩阵时,我得到一个从低到高的渐变,左边是右。
%**************
%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
答案 0 :(得分:1)
我的建议:
解决它 DEM 。
1)您已经给出了一个位置,其中latidude和经度为十进制度WGS84 2)你已经在WGS84中给了大衣线多边形,到了。
现在找到从loc到polygon的东西距离:
您想要找到loc的纬度值与border poly(当前位置的东边)的交叉点:
从边界多边形点0的开头开始:
找到border[i].lat<= loc.lat and border[i+1] > loc.lat AND border[i].longitude >= loc.longitude
所在的行。如果找到该线,则在(i和i + 1)之间进行线性插值,以找到精确(纬度/经度)交点。
现在你有了海洋的交汇点:
计算距离loc - &gt;与haversine
公式交叉。
(一旦这个工作,您可以稍后决定是否要加快二进制搜索速度)
与其他3个方向相同,交换纬度/长度和更大/更小
对于NW和其他人: 沿海洋边界点运行并计算从地点到边界点的方位(搜索航空公式或更大的圆形轴承计算)
存储线路/或两个承受台阶超过315度的点。 然后该线与315°相交,此外可以是不止一条这样的线 存储所有这些行,并采取最接近位置的那一行(
现在插入两个点以获得315的精确切割。
答案 1 :(得分:0)
如果您有一个引用对象,以下情况有效。感谢@AlexWein的方位角想法。在之前发布的图片中条纹的原因是沿海矢量的比例。注意我使用0.0042度增量(与dem分辨率相同)。 5个条纹表明我只是使用5个沿海坐标点找到了距离,并且发生了阶梯式条纹,因为我从下面的最近点到上面和后面的最近点反弹。
latlim=[0.25:.0042:60];
lonlim=ones(length(latlim),1)*-110
for r=1:32
for c=1:32
[lat long]=pix2latlon(R,r,c)
[d, az]=distance(lat,long,latlim,lonlim);
[~, azi]=min(abs(az-270));
sta_o.Wd2O=d(azi);
sta_o.Waz=az(azi);
[~, azi]=min(abs(az-315));
sta_o.NWd2O=d(azi);
sta_o.NWaz=az(azi);
[~, azi]=min(abs(az-225));
sta_o.SWd2O=d(azi);
sta_o.SWaz=az(azi);
end
end