从 .TIF 构建 Shapely 点对象

Build Shapely point objects from .TIF

我想将图像 (.tiff) 转换为形状点。有 4500 万像素,我需要一种无需循环即可完成此操作的方法(目前需要 15 多个小时)

例如,我有一个 .tiff 文件,打开后是一个 5000x9000 的数组。这些值是范围从 1 到 215 的像素值(颜色)。 我用 rasterio.open(xxxx.tif) 打开 tif。 想要的 epsg 是 32615

我需要保留像素值同时附加地理空间定位。这是为了能够连接多边形以查看点是否在内部。我可以在处理后处理转换,但我无法想出一种没有循环的方法来完成此操作。任何帮助将不胜感激!

如果您只想要一个布尔数组来指示这些点是否在几何体的 any 范围内,我会将这些形状分解为单个 MultiPolygon 然后使用 shapely.vectorized.contains . shapely.vectorized 模块目前未包含在文档中,但了解它真的很好!

类似于

# for a gridded dataset with 2-D arrays lats, lons
# and a list of shapely polygons/multipolygons all_shapes

XX = lons.ravel()
YY = lats.ravel()

single_multipolygon = shapely.ops.unary_union(all_shapes)

in_any_shape = shapely.vectorized.contains(single_multipolygon, XX, YY)

如果您要确定 点所在的 形状,请使用 geopandas.points_from_xy to convert your x, y point coordinates into a GeometryArray, then use geopandas.sjoin 查找对应于每个 (x, y) 的形状的索引点数:

geoarray = geopandas.points_from_xy(XX, YY)
points_gdf = geopandas.GeoDataFrame(geometry=geoarray)

shapes_gdf = geopandas.GeoDataFrame(geometry=all_shapes)

shape_index_by_point = geopandas.sjoin(
    shapes_gdf, points_gdf, how='right', predicate='contains',
)

这仍然是一个大型操作,但它是矢量化的,并且比循环解决方案快得多。如果您想转换数据的投影或使用其他 geopandas 功能,geopandas 路线也是一个不错的选择。