在给定方向上包裹等间距点

时间:2015-01-29 06:53:58

标签: java r algorithm geospatial graph-algorithm

让我们考虑一个2-D(纬度,经度)点集。该组中的点是等间距(近似),相互距离为0.1度\次0.1度。该组中的每个点是边长0.1度的正方形网格的中心(即,正方形的两个对角线的交叉点)。每个广场都与相邻的广场相邻。

我们的目标是获取由给定方向的方格网格的边界边形成的轮廓多边形的坐标(将用图示出)。此多边形内部有无孔

让我们考虑一个大小为10(点集)的样本数据集。

lat_x <- c(21.00749, 21.02675, 21.00396, 21.04602, 21.02317, 
           21.06524, 21.00008, 21.04247, 21.08454, 21.0192)

lon_y <- c(88.21993, 88.25369, 88.31292, 88.28740, 88.34669, 
           88.32118, 88.40608, 88.38045, 88.35494, 88.43984) 

以下是上述几点的粗略图,后面是一些插图,enter image description here

黑点是上述样本中的(lat,lon)点。

蓝色方框是方格。

方块的给定方向(\ theta)是$ theta $ = 50度。

我们的目标是获得轮廓多边形的有序(顺时针或逆时针)坐标(黄色)。

注意:此问题与this非常相似,并且@laune给出了一个很好的答案。目标是获得没有方向(或0度方向)的轮廓多边形。但是在当前的设置中,我需要在绘制方格网格和结果多边形时包括方向(非零)。

我将非常感谢任何解决上述问题的人给出的任何建议,java或R代码或有用的参考。

1 个答案:

答案 0 :(得分:2)

我会这样做:

grid outline

  1. 可能是某些2D阵列点分组以匹配网格

    应加快以下所有操作。

  2. 计算平均网格尺寸(左起img1)

    作为两个载体

  3. 创建蓝点(img2)

    as:gray_point (+/-) 0.5*blue_vector

  4. 创建红点(img3)

    as:blue_point (+/-) 0.5*red_vector

  5. 创建灰线列表(img4)

    取所有2个原始(灰色)点,其距离接近平均网格距离并为它们添加线

  6. 创建红线列表(img4)

    取所有距离接近平均网格距离的2个原始(灰色)点,如果它不与灰线的任何线相交,则为它们添加线

  7. 重新排列线点以匹配多边形缠绕......

  8. <强>角度

  9. 红色矢量的计算角度(通过atan2)
    蓝色矢量的计算角度(通过atan2)
    返回绝对值较小的那个

    [edit1]对评论的回复

    网格尺寸

    找到几个彼此最接近的点,因此选择任何一点并找到所有最近点。可能的距离应该接近:

    sqrt(1.0)*d,sqrt(1+1)*d,sqrt(1+2)*d,sqrt(2+2)*d,...
    

    其中d是网格大小,因此计算d几个拾取点。记住找到的第一个最小的d,扔掉所有与最小的一个不相似的东西。取平均值,然后调用它d

    网格向量

    取任意点A并找到离B附近距离最近的点d。例如+/-10%比较:|(|A-B|-d)|<=0.1*d现在网格矢量为(B-A)。找到其中几个(选择不同的A,B)并将x,y坐标分组为4组。

    然后通过否定一个组向量将负方向组连接在一起,这样你就可以得到2个向量列表(红色,蓝色方向)并从中得到平均向量(红色,蓝色向量)

    转换点

    你接受任何一点A并将一半的红色或蓝色矢量添加或减去它(不是它的大小!!!),例如:

    A.x+=0.5*red_vector.x;
    A.y+=0.5*red_vector.y;
    

    行列表

    为每个2点组合for制作2个嵌套A,B s(灰线原稿,红色轮廓线红色)并添加距离条件

    |(|A-B|-d)|<=0.1*d
    

    如果true在列表中添加行(A,B)。这里伪C ++示例:

        int i,j,N=?;       // N is number of input points in pnt[]
        double x,y,d=?,dd=d*d,de=0.1*d; // d is the avg grid size
        double pnt[N][2]=?;    // your 2D points
        for (i=0;i<N;i++)      // i - all points
         for (j=i+1;j<N;j++)   // j - just the rest no need to test already tested combinations
           {
           x=pnt[i][0]-pnt[j][0];
           y=pnt[i][1]-pnt[j][1];
           if (fabs((x*x)+(y*y)-dd)<=de) ... // add line pnt[i],pnt[j] to the list...
           }