【问题标题】:Apply function to 2D array with x,y coordinates as parameters将函数应用于以 x,y 坐标为参数的二维数组
【发布时间】:2021-12-31 14:12:07
【问题描述】:

我计划按照 [此处][1] 的说明以 3D 形式突出显示高程数据中的一个区域。因此,我需要一个数组,其中所有点都设置为 0 不应突出显示。数据数组如下所示:

y          51.380591   51.380769  ...   51.408314   51.408493
x                                 ...                        
9.171581  223.699997  228.199997  ...  297.500000  297.899994
9.171868  220.199997  223.199997  ...  297.600006  297.600006
9.172156  218.900009  220.600006  ...  296.100006  296.100006
9.172443  218.000000  218.100006  ...  295.000000  295.000000
9.172731  223.400009  220.699997  ...  297.100006  297.100006
             ...         ...  ...         ...         ...
9.212988  252.600006  254.100006  ...  313.100006  313.000000
9.213276  257.399994  260.700012  ...  313.600006  313.200012
9.213563  259.500000  262.700012  ...  314.700012  314.000000
9.213851  261.399994  264.600006  ...  315.800018  315.399994
9.214139  262.500000  265.800018  ...  317.399994  317.300018

[149 rows x 157 columns]

我的目标是仅保留满足基于 x,y 位置条件的值。所有其他值应设置为 0。详细地说,我想定义一个 2D 多边形。不在此多边形内的每个点都应设置为 0。

一个示例多边形如下所示。

coords = [(9.185, 51.38), (9.175, 51.385), (9.175, 51.4), (9.2, 51.395)]
poly = Polygon(coords)

[shapely][2] 提供了检查点是否在多边形内的功能。

from shapely.geometry import Point, Polygon
Point(x,y).within(poly)

所以应该应用于所有单元格的函数如下所示:

def KeepValue(x,y,z,poly):
    if (Point(x,y).within(poly)):
        return z
    return 0

我的问题是我应该使用哪个函数将within 函数应用于所有单元格? 对我来说主要的问题是找到一种方法来移交,尤其是x,y and z 参数。

我尝试过 apply/applymap,但效果不佳。 [1]:How to mark an area in plotly 3D surface plot? [2]:https://automating-gis-processes.github.io/CSC18/lessons/L4/point-in-polygon.html

【问题讨论】:

    标签: python arrays multidimensional-array shapely


    【解决方案1】:

    到目前为止我还没有找到一个好的解决方案,但是迭代列然后值可以正常工作:

    contour_data = pd.read_csv(r"C:\Elevation.xyz", delimiter=' ', names=["x","y","z"])
    Z = contour_data.pivot_table(index='x', columns='y', values='z').T
    X_unique = np.sort(contour_data.x.unique())
    Y_unique = np.sort(contour_data.y.unique())
    
    coords = [(9.185, 51.39), (9.175, 51.39), (9.175, 51.4), (9.2, 51.395)]
    poly = Polygon(coords)
    
    marked_area=Z.copy()
    i=0
    for x in X_unique:
        j=0
        for z in Z.iloc[i]:
            if (Point(x,Y_unique[j]).within(poly)):
                marked_area.iloc[i,j]=z+0.1
            else:
                marked_area.iloc[i,j]=0
            j=j+1
        i=i+1
    

    这可能不是最有效的方法,但这符合我的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      相关资源
      最近更新 更多