将函数应用于以 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
这可能不是最有效的方法,但符合我的需要。
我计划按照 [此处][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]:
到目前为止我还没有找到好的解决方案,但是迭代列然后值可以正常工作:
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
这可能不是最有效的方法,但符合我的需要。