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

时间:2018-09-03 11:39:30

标签: shapely

假设我有

from shapely.geometry import Polygon, Point

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

如何检查point是否在polygon内部?

1 个答案:

答案 0 :(得分:1)

有多个relational methods implemented for shapes。从目前为止我所看到的,它们完全遵循英语:

  • 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