在 Python 中按栅格范围裁剪地理数据框点

Clipping geodataframe points by raster extent in Python

背景

感谢在此处回答我之前问题的好心人:,我已成功将我的大型块模型导入为地理数据框。这是通过以下代码完成的:

import dask_geopandas 
import dask
from dask import dataframe as dd
import geopandas as gpd  

BM = dd.read_csv(BM_path, skiprows=2, names=["X","Y","Z","Lith"])
BM["geometry"] = dask_geopandas.points_from_xy(BM,"X","Y")
BM = dask_geopandas.from_dask_dataframe(BM,geometry="geometry")
BM = BM.compute()

我什至能够在这里找到将我的栅格转换为地理数据框的代码!:

import rasterio as rio

with rio.Env():
    with rio.open(RAS_path) as src:
        crs = src.crs
        xmin, ymax = np.around(src.xy(0.00,0.00),9)
        xmax, ymin = np.around(src.xy(src.height-1, src.width-1),9)
        x = np.linspace(xmin, xmax, src.width)
        y = np.linspace(ymax, ymin, src.height)
        
        xs, ys = np.meshgrid(x,y)
        zs = src.read(1)
        
        mask = src.read_masks(1) > 0
        xs, ys, zs = xs[mask], ys[mask], zs[mask]
  
data = {'X': pd.Series(xs.ravel()),
        'Y': pd.Series(ys.ravel()),
        'Z': pd.Series(zs.ravel())}
          
df = pd.DataFrame(data=data)
geometry = gpd.points_from_xy(df.X,df.Y)
gdf = gpd.GeoDataFrame(df, crs=crs, geometry=geometry)

虽然我不确定如何使用这个地理数据框来裁剪我的块模型,所以它可能没用...

我知道如何在 ArcGIS 中执行此操作,但它又慢又笨重。我想在 python 中简化整个过程,甚至不打开 Esri 产品。

问题

我一直在努力寻找一种可靠的方法来根据我从 ArcGIS 导出的栅格的 X-Y 范围裁剪我的块模型 (BM)(此栅格具有浮点类型值,不确定是否相关)。

使用 clip() 我运气不好,因为我认为在此工具中不能使用栅格来裁剪点(必须转换为多边形?)。我想知道是否有人知道将我的地理数据框点(作为常规数据框或地理数据框)剪切到栅格范围的可靠方法?

最初我认为我可以从我的栅格范围创建一个平坦的单一多边形并将其与 clip() 工具一起使用但是我也不知道如何打开栅格并在不读取它的情况下更改值作为包含 rasterio.open()rasterio.read()

的列表

您想如何使用网格?你想使用整个网格吗?还是网格里面有面具?

如果您想进行空间剪辑,您可能需要创建一个表示网格扩展边界的向量(其他方法需要两个数据集的 X 和 Y 重合)。如果要使用整个光栅的扩展,请使用光栅(通过使用例如 src.transform)获取光栅的角。使用这些值创建一个形状优美的多边形。 https://shapely.readthedocs.io/en/stable/manual.html#Polygon

然后 BM.clip([polygon])

如果要在 geotiff 中使用不规则蒙版进行裁剪,请使用 rasterio.features.shapes 从栅格创建多边形。 https://rasterio.readthedocs.io/en/latest/api/rasterio.features.html#rasterio.features.shapes 您可以将这些转换为 geopandas.GeoDataFrame 的易用性。 geopandas.GeoDataFrame.from_features(geoms)

您还需要决定如何处理网格内可能存在的孔洞。 如果您只想要外部 shell,您也许可以尝试获得最大的多边形。