找到距离海洋的距离/向量的交点

时间:2013-02-20 16:23:41

标签: matlab gps maps distance

我感兴趣的是美国大陆的许多地方的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

2 个答案:

答案 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的精确切割。

更新:Bearing formula

答案 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