如何在python中使用shapely计算重心?
我发现了shapely,但我没有发现如何计算多边形的重心如何在python中使用shapely计算重心?,python,shapely,Python,Shapely,我发现了shapely,但我没有发现如何计算多边形的重心 有人有解决方案吗?如果多边形的密度均匀,则其质心与几何中心重合。在shapely中,质心可直接计算为: from shapely.geometry import Polygon P = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]]) print(P.centroid) #POINT (0.5 0.5) 以上答案是正确的。但有时您不想使用这种格式。因此,要获取您可以使用的值: from shapel
有人有解决方案吗?如果多边形的密度均匀,则其质心与几何中心重合。在shapely中,质心可直接计算为:
from shapely.geometry import Polygon
P = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])
print(P.centroid)
#POINT (0.5 0.5)
以上答案是正确的。但有时您不想使用这种格式。因此,要获取您可以使用的值:
from shapely.geometry import Polygon
centroid = list(Polygon([[0, 0], [1, 0], [1, 1], [0, 1]]).centroid.coords)
#[(0.5, 0.5)]
我已经在更复杂的几何体上测试过这种方法,效果很好 没有shapely
您也可以手动计算,只需使用numpy
import numpy as np
def polygon_area(xs, ys):
"""https://en.wikipedia.org/wiki/Centroid#Of_a_polygon"""
# https://stackoverflow.com/a/30408825/7128154
return 0.5 * (np.dot(xs, np.roll(ys, 1)) - np.dot(ys, np.roll(xs, 1)))
def polygon_centroid(xs, ys):
"""https://en.wikipedia.org/wiki/Centroid#Of_a_polygon"""
xy = np.array([xs, ys])
c = np.dot(xy + np.roll(xy, 1, axis=1),
xs * np.roll(ys, 1) - np.roll(xs, 1) * ys
) / (6 * polygon_area(xs, ys))
return c
print(polygon_centroid(xs=[0, 1, 1, 0], ys=[0, 0, 1, 1]),
'expect: [.5, .5]')
print(polygon_centroid(xs=[0, 0, 2], ys=[1, -1, 0]),
'expect: [2/3, 0]')
print(polygon_centroid(xs=[0, 0, 2], ys=[-1, 1, 0]),
'expect: [2/3, 0]')
# https://wolfram.com/xid/0e5bspgmqyj9a5-cfx5ps
print(polygon_centroid(xs=[0, 1, 1.5, 1, 0, -.5], ys=[0, 0, .5, 1, 1, .5]),
'expect: [.5, .5]')
输出
[0.5 0.5] expect: [.5, .5]
[ 0.66666667 -0. ] expect: [2/3, 0]
[0.66666667 0. ] expect: [2/3, 0]
[0.5 0.5] expect: [.5, .5]