Python:如何将 geotiff 转换为 geopandas?

标签 python geopandas python-xarray geotiff rasterio

我有一个 geotiff 文件。

import xarray as xr
urbanData = xr.open_rasterio('myGeotiff.tif')
plt.imshow(urbanData)

这里是 link到文件。

我可以将文件转换为以坐标为点的数据框

ur  = xr.DataArray(urbanData, name='myData')
ur  = ur.to_dataframe().reset_index() 
gdfur  = gpd.GeoDataFrame(ur, geometry=gpd.points_from_xy(ur.x, ur.y))

但是我想要一个包含像素几何形状的数据框作为多边形而不是点。可能吗?

最佳答案

令我有些惊讶的是,我还没有真正找到一个包装 rasterio.features 的包来获取 DataArrays 并生成 GeoDataFrames。

这些可能非常有用:

https://corteva.github.io/geocube/stable/

https://corteva.github.io/rioxarray/stable/

我通常使用这样的东西:

import affine
import geopandas as gpd
import rasterio.features
import xarray as xr
import shapely.geometry as sg


def polygonize(da: xr.DataArray) -> gpd.GeoDataFrame:
    """
    Polygonize a 2D-DataArray into a GeoDataFrame of polygons.

    Parameters
    ----------
    da : xr.DataArray

    Returns
    -------
    polygonized : geopandas.GeoDataFrame
    """
    if da.dims != ("y", "x"):
        raise ValueError('Dimensions must be ("y", "x")')

    values = da.values
    transform = da.attrs.get("transform", None)
    if transform is None:
        raise ValueError("transform is required in da.attrs")
    transform = affine.Affine(*transform)
    shapes = rasterio.features.shapes(values, transform=transform)

    geometries = []
    colvalues = []
    for (geom, colval) in shapes:
        geometries.append(sg.Polygon(geom["coordinates"][0]))
        colvalues.append(colval)

    gdf = gpd.GeoDataFrame({"value": colvalues, "geometry": geometries})
    gdf.crs = da.attrs.get("crs")
    return gdf

请注意,在使用 xr.open_rasterio 读取它之后,您应该首先从 xarray 中压缩带尺寸以使其成为 2D:

urbanData = xr.open_rasterio('myGeotiff.tif').squeeze('band', drop=True)

关于Python:如何将 geotiff 转换为 geopandas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67487713/

相关文章:

python - 对 Pandas Dataframe 中不同列的多索引

python - 使用 Python 拆分和保存 csv 文件中的文本 block

python - 我似乎无法在 python 上摆脱这个程序的循环

python - 从 xarray 数据集中选择日期列表

python - 关于 read_file() 的 Geopandas 警告

matplotlib - Geopandas & Mapplotlib,如何在没有轮廓的情况下绘制任何形状?

python - 如何删除xarray中的网格点?

python - python 运算符优先级如何与双重比较一起使用?

python - 如何将一个图像垂直切割成两个大小相等的图像

python - 在区域的部分区域添加边框,matplotlib/geopandas