将函数应用于以 x,y 坐标为参数的二维数组

Apply function to 2D array with x,y coordinates as parameters

我计划按照 [此处][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]: [2]: https://automating-gis-processes.github.io/CSC18/lessons/L4/point-in-polygon.html

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

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

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