【问题标题】:GeoDataFrame is Inverted when I converted from Raster to Vector using RasterIO当我使用 RasterIO 从 Raster 转换为 Vector 时,GeoDataFrame 被反转
【发布时间】:2022-01-06 04:16:36
【问题描述】:

我目前正在使用此代码将栅格文件转换为地理数据框:

import rasterio 
from rasterio.features import shapes
mask = None 

with rasterio.open(#INSERT TIF FILE HERE) as src:
    image = src.read(1) # first band, not sure yet how to do it with multiple bands
    results = (
    {'properties': {'raster_val': v}, 'geometry': s}
    for i, (s, v) 
    in enumerate(
        shapes(image, mask=mask))) geoms = list(results)

import geopandas as gpd
gpd_polygonized_raster = gpd.GeoDataFrame.from_features(geoms)

问题是,地理数据框显示的是颠倒的,而不是其预期的方向。

对此的任何帮助将不胜感激。谢谢!

请注意,TIFF 文件已有 EPSG:4326 的投影。

【问题讨论】:

  • 没有示例 geotiff 的问题有点抽象。愿意分享一个链接吗?

标签: vector raster geopandas shapely rasterio


【解决方案1】:
  • 你可以使用匀称 affine_transform()
  • 已经选择了一个示例 GEOTIFF* 来制作这个工作示例
import rasterio
from rasterio.features import shapes
import geopandas as gpd
from shapely.affinity import affine_transform as T
from pathlib import Path
import plotly.express as px
import requests
from pathlib import Path

# https://www.sciencebase.gov/catalog/item/53f5a87ae4b09d12e0e8547b
url = "https://www.sciencebase.gov/catalog/file/get/53f5a87ae4b09d12e0e8547b?f=__disk__7f%2Fe7%2F94%2F7fe7943c77f2c6c4eb4c129153fd4e80f6079091"
f = Path.cwd().joinpath("FAA_UTM18N_NAD83.tif")
r = requests.get(url, stream=True, headers={"User-Agent": "XY"})
with open(f, "wb") as fd:
    for chunk in r.iter_content(chunk_size=128):
        fd.write(chunk)

results = []

with rasterio.open(f) as src:
    crs = src.crs
    for layer in range(1,20):
        try:
            image = src.read(layer)  # use all bands / layers
            results += [
                {"properties": {"raster_val": v, "layer":layer}, "geometry": s}
                for i, (s, v) in enumerate(shapes(image, mask=src.dataset_mask()))
            ]
        except IndexError as e:
            print(e)
            break


gdf = gpd.GeoDataFrame.from_features(results, crs=crs)

# flip top and bottom using affine transform
gdf["geometry"] = gdf["geometry"].apply(lambda g: T(g, [1, 0, 0, -1, 0, 0]))

# exclude areas where it's white in source TIFF
gdf.to_crs("EPSG:4326").loc[gdf["raster_val"].lt(255)].plot(column="raster_val")

【讨论】:

  • 嗨,罗伯!谢谢你。我会尝试!但只是为了上下文,我目前正在使用这张图片:drive.google.com/file/d/1bcaYoVltRxswWiOuEL_QhqrNag-8FkrX/… 该文件已经位于 epsg:4326。
  • 对于仿射变换,我不确定在 T 之后放什么
  • 它记录在这里:shapely.readthedocs.io/en/stable/… 我试过你的 tif 1) 我不相信它是 EPSG:4326,因为坐标对 EPSG:4326 无效。 2)绘制需要将最后一行修改为:gdf.loc[gdf["raster_val"].gt(0)].plot(aspect=1, column="raster_val")
  • 嗯,这很奇怪。当我在 GIS 软件 (QGIS) 上打开文件时,它显示了正确的位置。无论如何,我会尝试进行仿射变换。
猜你喜欢
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2014-05-16
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多