让我们考虑一个二维(纬度,经度)点集。集合中的点是等距的(大约),相互距离为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)

以下是上述各点的大致示意图,并附有一些说明,
黑点是上述样本中的(纬度,经度)点。
蓝色的方格是方格。
正方形的给定方向(\theta)是$theta$=50度。
我们的目标是得到轮廓多边形(黄色)的有序(顺时针或逆时针)坐标。
注意:这个问题与this非常相似,由@laune给出了一个很好的答案。目标是得到无方向(或0度方向)的轮廓多边形。但是在当前的设置中,我需要在绘制正方形网格和生成的多边形时包含方向(非零)。
我将非常感谢任何人提出的建议,java或R代码或有帮助的参考,解决上述问题。

最佳答案

我想这样做:
可能是一些二维数组点分组以匹配网格
这将加速以下所有操作。
计算平均网格大小(从左起img1)
作为两个向量
创建蓝色点(IMG2)
作为:gray_point (+/-) 0.5*blue_vector
创建红点(img3)
作为:blue_point (+/-) 0.5*red_vector
创建灰线列表(IMG4)
取距离接近平均栅格距离的所有2个原始(灰色)点,并为它们添加直线
创建红线列表(img4)
取距离接近平均网格距离的所有2个原始(灰色)点,如果与灰色线中的任何线都不相交,则为它们添加线
重新排列线条点以匹配多边形缠绕…

计算红色矢量的角度(通过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坐标符号将它们分成4组。
然后,通过对一个组向量求反,将负方向组连接在一起,这样您将有两个向量列表(红色、蓝色方向),并从中生成平均向量(红色、蓝色向量)
移动点
取任意点x,y并对其加上或减去红色或蓝色向量的一半(而不是其大小!)!!)例如:
A.x+=0.5*red_vector.x;
A.y+=0.5*red_vector.y;

行列表
每2个点组合设置2个嵌套Asfor(灰色线为原始值,红色轮廓线为移动的红色值),并添加距离条件
|(|A-B|-d)|<=0.1*d

如果是A,B则将linetrue添加到列表中这里是伪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...
       }

07-24 09:47
查看更多