You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 22:54:02