从GeoJSON创建Polygon对象时出现LinearRing坐标元组不足报错
报错原文:
ValueError: A LinearRing must have at least 3 coordinate tuples
中文翻译:值错误:线性环必须包含至少3个坐标元组
报错原因
两个问题共同导致这个报错:
- 第一是坐标格式不匹配:GeoJSON中Polygon类型的坐标是三层嵌套结构,最外层包裹外环和所有内环(洞)的坐标,你直接把整个三层坐标数组传给Shapely的
Polygon构造方法时,库会把第二层的数组元素当成单个坐标点解析,根本识别不到具体的经纬度元组,自然凑不够构成环需要的至少3个点。 - 第二是循环逻辑有问题:双层循环会重复追加多边形坐标,比如j=0时会追加第2个到最后一个要素的坐标,j=1时又会追加第3个到最后一个要素的坐标,最后geom数组里存的不是一一对应的单个多边形坐标,混了大量重复数据。
修复方法
不要自己手动拆GeoJSON的坐标嵌套,直接用Shapely自带的shape工具方法解析几何对象就行,自动适配格式,不会出嵌套层级的错,同时把冗余的双层循环改成单层遍历,避免重复读数据:
from shapely.geometry import shape def check_overlap(): raw_coords = [] polygons = [] # 单层遍历所有要素即可,不需要双层循环 for feature in data['features']: # 存原始坐标 raw_coords.append(feature['geometry']['coordinates']) # 直接解析成Shapely几何对象,自动兼容带洞多边形、多部件多边形等格式 poly = shape(feature['geometry']) polygons.append(poly) polygon1 = polygons[0] print(polygon1) print(raw_coords[1]) # 相交判断直接取polygons里的对象调用方法即可 # print(polygon1.intersects(polygons[1]))
补充说明
如果你的GeoJSON里存在MultiPolygon(多面片)类型的要素,手动拆坐标很容易出格式错误,shape方法会自动识别为MultiPolygon类型,空间计算的调用方法和普通Polygon完全一致,兼容性更好。
内容的提问来源于stack exchange,提问作者Where_am_I
相关产品推荐
相关产品推荐

