为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查多边形是否包含一个点?

如何检查多边形是否包含一个点?

POPMUISE 2021-05-30 12:43:00
假设我有from shapely.geometry import Polygon, Pointpolygon = Polygon(((0, 0), (0, 1), (1, 1), (0.5, 0.5), (1, 0)))point = Point(0, 1)我如何检查是否point在里面polygon?
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

有多种针对 shape 实现的关系方法。从我目前所见,它们完全遵循英语:

  • shape_a.contains(shape_b)

  • shape_a.intersects(shape_b)

  • shape_a.overlaps(shape_b)

  • shape_a.touches(shape_b)

代码

为了检查行为,我编写了以下代码:

from shapely.geometry import Polygon, Point


polygon = Polygon(((0, 0), (0, 1), (1, 1), (0.5, 0.5), (1, 0)))

point_on_corner = Point(0, 1)

point_on_edge = Point(0, 0.5)

point_inside = Point(0.25, 0.5)

point_outside_inside_hull = Point(0.75, 0.5)

point_outside_outside_hull = Point(1.1, 0.5)


points = [('point_inside', point_inside),

          ('point_on_corner', point_on_corner),

          ('point_on_edge', point_on_edge),

          ('point_outside_inside_hull', point_outside_inside_hull),

          ('point_outside_outside_hull', point_outside_outside_hull)]

max_len = max([len(name) for name, _ in points])

formatter = '{:<' + str(max_len) + '}: {}'


print('## contains')

for point_name, point in points:

    print(formatter.format(point_name, polygon.contains(point)))


print('## intersection')

for point_name, point in points:

    print(formatter.format(point_name, polygon.intersection(point)))


print('## Reverse order intersection')

for point_name, point in points:

    print(formatter.format(point_name, point.intersection(polygon)))

# Check with the 'geometry.is_empty' attribute (not a function call)


print('## touches')

for point_name, point in points:

    print(formatter.format(point_name, point.touches(polygon)))


print('## intersects')

for point_name, point in points:

    print(formatter.format(point_name, point.intersects(polygon)))


print('## overlaps')

for point_name, point in points:

    print(formatter.format(point_name, point.overlaps(polygon)))

这导致:


## contains

point_inside              : True

point_on_corner           : False

point_on_edge             : False

point_outside_inside_hull : False

point_outside_outside_hull: False


## intersection

point_inside              : POINT (0.25 0.5)

point_on_corner           : POINT (0 1)

point_on_edge             : POINT (0 0.5)

point_outside_inside_hull : GEOMETRYCOLLECTION EMPTY

point_outside_outside_hull: GEOMETRYCOLLECTION EMPTY

## Reverse order intersection

point_inside              : POINT (0.25 0.5)

point_on_corner           : POINT (0 1)

point_on_edge             : POINT (0 0.5)

point_outside_inside_hull : GEOMETRYCOLLECTION EMPTY

point_outside_outside_hull: GEOMETRYCOLLECTION EMPTY


## touches

point_inside              : False

point_on_corner           : True

point_on_edge             : True

point_outside_inside_hull : False

point_outside_outside_hull: False


## intersects

point_inside              : True

point_on_corner           : True

point_on_edge             : True

point_outside_inside_hull : False

point_outside_outside_hull: False


## overlaps

point_inside              : False

point_on_corner           : False

point_on_edge             : False

point_outside_inside_hull : False

point_outside_outside_hull: False



查看完整回答
反对 回复 2021-06-09
  • 1 回答
  • 0 关注
  • 190 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信