使用polygon裁剪栅格,rasterio.mask报错:ValueError: Input shapes do not overlap raster.

背景:栅格文件tif 和 一个保证被栅格完全覆盖的polygon(shp格式) ,使用rasterio.mask报错:ValueError: Input shapes do not overlap raster.(栅格与形状不重叠)

我用的fiona打开的polygon,代码:

def clipRasterByShapefile(src, shpdatafile, dst, nodata=0):

    with fiona.open(shpdatafile, "r", crs=from_epsg(32718)) as shapefile:
        features = [feature["geometry"] for feature in shapefile]
    src = rasterio.open(src)
    

    print(shapefile.crs, src.crs)
    
    out_image, out_transform = rasterio.mask.mask(src, features,
                                             all_touched=True,
                                             crop=True,
           
<think>好的,用户遇到了Earth Engine中ee.Geometry.Polygon报错,提示需要两个数字的问题。首先,我需要分析可能的原因。根据经验,这个错误通常是因为坐标格式不正确。Polygon的坐标应该是一个嵌套的列表,每个坐标点包含两个数值,即经度和纬度。 用户提到从排序的点生成坐标列表,可能存在几个问题。首先,检查坐标列表的结构是否正确。正确的结构应该是[[[x1,y1],[x2,y2],...,[xn,yn]]],即一个包含多个线性环的列表,其中每个线性环是闭合的,首末点相同。如果用户没有闭合线性环,可能会引发错误。 另外,坐标的数据类型也很重要。Earth Engine要求坐标是数值类型,如果列表中混入了字符串或其他类型,会导致错误。用户需要确保所有坐标点都是数字,例如使用parseFloat进行转换。 还可能存在坐标顺序的问题。虽然排序后的点可能按照某种顺序排列,但必须按照顺时针或逆时针顺序排列,不能交叉或重复,否则会被视为无效的几何图形。 接下来,参考提供的引用资料,虽然引用内容主要涉及3D渲染和图形处理,但可以联想到在几何构造中,正确的数据结构和格式至关重要。例如,引用[2]中提到顶点共享的问题,虽然不直接相关,但强调数据结构优化的重要性。在处理坐标列表时,确保每个顶点正确且不重复,可能有助于避免错误。 需要建议用户逐步检查坐标列表的结构,确保每个点都是两个数字,并且整个列表正确嵌套。提供一个示例代码可能会有帮助,展示如何正确构建坐标列表并创建Polygon。此外,提醒用户在添加首末点相同以闭合多边形,以及处理数据类型问题,都是关键步骤。 最后,用户可能需要了解如何调试Earth Engine中的几何对象,例如打印坐标列表或使用验证工具。这可以帮助他们快速定位问题所在,比如无效的坐标或结构错误。</think>关于Earth Engine中ee.Geometry.Polygon报错"requires two numbers"的解决方案: ### 错误原因分析 1. **坐标层级嵌套错误**:Polygon需要三维嵌套坐标结构(线性环的集合) ```python 正确格式:[[[x1,y1],[x2,y2],...,[x1,y1]]] # 注意首末点闭合 ``` 2. **数据类型不匹配**:坐标值未转换为数值类型(float/int) 3. **坐标维度缺失**:单个坐标点未包含两个数值(经度+纬度) ### 分步解决方法 1. **验证坐标结构**: ```python sorted_points = [[-122.45, 37.78], [-122.43, 37.79], [-122.44, 37.77]] # 添加闭合点(首末点相同) if sorted_points[0] != sorted_points[-1]: sorted_points.append(sorted_points[0]) ``` 2. **构建正确嵌套结构**: ```python coords = [sorted_points] # 创建二维数组包裹坐标点 polygon = ee.Geometry.Polygon(coords) ``` 3. **强制类型转换**(适用于从文本读取坐标时): ```python # 示例:处理字符串坐标列表 str_points = ['-122.45,37.78', '-122.43,37.79'] num_points = [list(map(float, p.split(','))) for p in str_points] ``` 4. **最终验证代码**: ```python def create_polygon(points): if len(points[0]) != 2: raise ValueError("每个坐标点必须包含两个数值") if points[0] != points[-1]: points.append(points[0]) return ee.Geometry.Polygon([points]) # 示例调用 valid_polygon = create_polygon([[-122,37], [-123,38], [-121,39]]) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值