Python - 检查 Shapely Polygon 是否为矩形
Python - Check if Shapely Polygon is a rectangle
经过Polygon的分割等操作后,我想验证它是一个矩形
我已经尝试 simplify
然后计算 coords
的数量是否为 5...
>>> from shapely.geometry import Polygon
>>> from shapely.ops import split
>>>
>>> poly1 = Polygon([(0, 0), (0, 1), (0, 3), (2, 3), (2, 2), (2, 0), (0, 0)])
>>>
>>> poly_check=poly1.simplify(0)
>>> if len(poly_check.exterior.coords)==5:
>>> print 'Yes, it is a rectangle...'
>>> else:
>>> print 'No, it is not a rectangle...'
>>>
Yes, it is a rectangle...
但是如果起点在边的中间就不行了
>>> #poly2 is actually a rectangle
>>> poly2 = Polygon([(0, 1), (0, 3), (2, 3), (2, 2), (2, 0), (0, 0), (0, 1)])
>>>
>>> poly_check=poly2.simplify(0)
>>> if len(poly_check.exterior.coords)==5:
>>> print 'Yes, it is a rectangle...'
>>> else:
>>> print 'No, it is not a rectangle...'
>>>
No, it is not a rectangle...
我该如何检查?
谢谢
如果多边形的面积与其最小外接矩形的面积相匹配,则多边形是矩形。这是一个已知的形状指数,称为矩形。
if poly.area == poly.minimum_rotated_rectangle.area:
return True
编辑:考虑到下面关于浮点误差的评论,您可以直接测量矩形度并将所有 > .99 的东西都视为矩形,或者进行近似比较(例如舍入)。
if (poly.area / poly.minimum_rotated_rectangle.area) > .99:
return True
编辑 2:最好只使用 math.isclose 函数来确定两个变量的相等性。前面比较中的除法降低了比较的整体精度,我们这里避免:
import math
if math.isclose(poly.minimum_rotated_rectangle.area, poly.area):
return True
经过Polygon的分割等操作后,我想验证它是一个矩形
我已经尝试 simplify
然后计算 coords
的数量是否为 5...
>>> from shapely.geometry import Polygon
>>> from shapely.ops import split
>>>
>>> poly1 = Polygon([(0, 0), (0, 1), (0, 3), (2, 3), (2, 2), (2, 0), (0, 0)])
>>>
>>> poly_check=poly1.simplify(0)
>>> if len(poly_check.exterior.coords)==5:
>>> print 'Yes, it is a rectangle...'
>>> else:
>>> print 'No, it is not a rectangle...'
>>>
Yes, it is a rectangle...
但是如果起点在边的中间就不行了
>>> #poly2 is actually a rectangle
>>> poly2 = Polygon([(0, 1), (0, 3), (2, 3), (2, 2), (2, 0), (0, 0), (0, 1)])
>>>
>>> poly_check=poly2.simplify(0)
>>> if len(poly_check.exterior.coords)==5:
>>> print 'Yes, it is a rectangle...'
>>> else:
>>> print 'No, it is not a rectangle...'
>>>
No, it is not a rectangle...
我该如何检查?
谢谢
如果多边形的面积与其最小外接矩形的面积相匹配,则多边形是矩形。这是一个已知的形状指数,称为矩形。
if poly.area == poly.minimum_rotated_rectangle.area:
return True
编辑:考虑到下面关于浮点误差的评论,您可以直接测量矩形度并将所有 > .99 的东西都视为矩形,或者进行近似比较(例如舍入)。
if (poly.area / poly.minimum_rotated_rectangle.area) > .99:
return True
编辑 2:最好只使用 math.isclose 函数来确定两个变量的相等性。前面比较中的除法降低了比较的整体精度,我们这里避免:
import math
if math.isclose(poly.minimum_rotated_rectangle.area, poly.area):
return True