如何为带x,y坐标的2D高程数组应用point-in-polygon判断函数
问题描述
我打算在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库提供:
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和z参数,我尝试过apply/applymap方法但没有得到理想结果。
解决方案
推荐用stack将二维表格转为长格式后批量判断,比逐单元格apply效率高很多,具体实现如下:
import pandas as pd from shapely.geometry import Point, Polygon, MultiPoint # 假设你的原始数据存储在名为df的DataFrame中 # 1. 转为长表,每一行对应一组(x,y,z)坐标 df_long = df.stack().rename('z').reset_index() # 2. 批量判断所有点是否在多边形内 points = MultiPoint(df_long[['x', 'y']].values) mask = [p.within(poly) for p in points.geoms] # 3. 非目标区域置0后转回原二维结构 df_long['z'] = df_long['z'].where(mask, 0) df_result = df_long.pivot(index='x', columns='y', values='z').reindex_like(df)
如果数据量不大,也可以用更直观的双重循环实现:
df_result = df.copy() for x in df.index: for y in df.columns: if not Point(x, y).within(poly): df_result.loc[x, y] = 0
最终得到的df_result就是非目标区域全为0的高程数组,可直接用于3D曲面高亮绘制。
内容的提问来源于stack exchange,提问作者MaxWolodin
相关产品推荐
相关产品推荐

