如何从 2D numpy (lat,lon) 数组中删除扇区/切片?

Posted

技术标签:

【中文标题】如何从 2D numpy (lat,lon) 数组中删除扇区/切片?【英文标题】:How would I remove a sector/slice from a 2D numpy (lat,lon) array? 【发布时间】:2018-12-19 06:43:03 【问题描述】:

我在一个 numpy 数组中有一个网格网格 (lat,lon) 数据的二维数组。从这个数组中的一个指定点开始,我想在不同的方向上延伸两条线,这样两条线之间的区域就形成了一个圆的扇区。这在下面的可视化中得到了最好的解释:

图像中的数字没有任何意义,它们只是为了可视化。

我希望将扇区内的所有点转换为 NaN 值,以便可以捕获红色零的索引。 (在图像中更容易将这些绘制为红色零,但 NaN 更可取。我真正追求的是它们的索引。)它的输入将是数组、圆弧的中心点和角度每条线相对于水平(或垂直)。如图所示,线条应超出 (lat,lon) 区域的边缘。

谁能建议一种让我开始的方法,哪些 numpy 例程最有帮助?诚然,我有点难过。

编辑:我还有一个网格网格纬度和网格网格经度的匹配数组。中心点的整数索引是已知的(因为我知道中心点的纬度/经度)。在这种情况下,“角度”和“线”指的是文字地理空间。

【问题讨论】:

问题没有明确定义。要将数组项转换为任何内容,您需要项的整数索引。你计算这些指数的公式是什么? 文字混乱。它会帮助您知道如何检查一个点是否在多边形(三角形)中吗?如果是的话,是一个很好的选择:-) 马丁,是的,我相信这会有所帮助!我想我可以单独测试每个点是否包含在三角形/弧中。 您的圆弧可能有多大(例如 45、90、180 度)? MBo,圆弧的大小理论上是可以指定的,但是如果可以帮助您解决问题,请继续选择任意圆弧大小。我相信我以后可以概括一下。 【参考方案1】:

让你有中心索引cx, cy

预先计算扇区的起始和结束角度值:

  S_Cos = Cos(Start)
  S_Sin = Sin(Start)
  E_Cos = Cos(End)
  E_Sin = Sin(End)

并使用边框条件将floodfill 设为零:

 (x-cx) * S_Sin - (y-cy) * S_Cos >= 0   //point is left to starting ray
 (x-cx) * E_Sin - (y-cy) * E_Cos <= 0   //point is right to ending ray
 x >= minx, y>=miny, x<=maxx, y<=maxy   //coordinate is inside array

以前的做法:

对于小弧度(

选择填充方向 - 大多数情况下水平线是不错的选择,而对于某些开始/结束方向垂直填充更方便(例如:350度 - 10度)

使用Bresenham line algorithm 从中心沿射线进行遍历。对于每个 Y 步,在光线之间或光线与矩形(阵列)边界之间用零水平线填充

对于较大的圆弧 - 按 OX、OY 轴将圆弧分成一些较小的圆弧。

【讨论】:

非常感谢!诚然,我需要一些时间来理解这个答案,但是是的,效果很好。我使用了第一种方法。 :)

以上是关于如何从 2D numpy (lat,lon) 数组中删除扇区/切片?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 terra SpatRaster 构建 lon、lat、值数据框

对 lon\lat 点的排序列表,从最近的开始

如何从 Census FIPS 转换为 Lat Lon?

从 Lat Lon 数据创建距离海岸 (km) 变量?

从 shapefile 将 EPSG 3035 转换为 EPSG 4326(lon lat)

谷歌地图方向使用lat / lon