如何在Python中使用Shapely计算重心?

17

我发现了shapely,但是我没有找到如何计算多边形的重心!

有人知道解决方法吗?

3个回答

33

如果你的多边形密度均匀,它的重心与它的中心点重合。在shapely中,中心点可以直接计算为:

from shapely.geometry import Polygon

P = Polygon([[0, 0], [1, 0], [1, 1], [0, 1]])

print(P.centroid)
#POINT (0.5 0.5)

13

以上答案是正确的。但有时您不想使用这种格式。因此,要获取值,您可以使用:

from shapely.geometry import Polygon
centroid =   list(Polygon([[0, 0], [1, 0], [1, 1], [0, 1]]).centroid.coords)
#[(0.5, 0.5)]

我已经对更复杂的几何形状进行了测试,结果表现得很好。


5

没有使用shapely的解决方案

您也可以仅使用numpy手动计算它。

import numpy as np

def polygon_area(xs, ys):
    """https://en.wikipedia.org/wiki/Centroid#Of_a_polygon"""
    # https://dev59.com/B2Af5IYBdhLWcg3wmztL#30408825
    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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接