【代码】判断某点是否在带孔多边形的内部?

遥感图像的空间分辨率

首先先说什么是多边形的内孔,然后再说怎么判断某点是否在多边形上?

什么是多边形的内孔?

多边形的内孔(也称为内环、洞)是指位于多边形内部的封闭区域,该区域不属于多边形的主要区域,而是一个被排除在外的区域。简单来说,内孔是多边形内的一个或多个子多边形,这些子多边形表示该区域中的空洞或不包含在多边形主体中的区域。

例如,如果你有一个多边形表示一个湖的边界,而湖中心有一个岛屿,那么湖的边界就是主要多边形,而岛屿的边界就是一个内孔。

怎么判断某点是否在多边形内部

可以使用几何库(如 Shapely)来进行这个判断。以下是一个示例代码,演示如何使用 Shapely 判断点是否在多边形的边界内部:

from shapely.geometry import Polygon
from shapely.geometry import Point

# 带孔多边形
ext = [(0, 0), (0, 5), (5, 5), (5, 0), (0, 0)]
int = [(1, 1), (1, 1.5), (1.5, 1.5), (1.5, 1)]
myPoly = Polygon(ext,[int])

# 判断点1是否在该带孔多边形内部
myPoint = Point(1.25, 1.25)
print(myPoint.within(myPoly))  # returns 'False'

# 判断点2是否在该带孔多边形内部
myOtherPoint = Point(0.5, 0.5)
print(myOtherPoint.within(myPoly))  # returns 'True'

image-20240603102702617

可视化

增加一些可视化的代码,完善以上代码。具体如下:

import matplotlib.pyplot as plt
from shapely.geometry import Polygon, Point
from shapely.geometry.polygon import LinearRing

# 带孔多边形
ext = [(0, 0), (0, 5), (5, 5), (5, 0), (0, 0)]
int = [(1, 1), (1, 1.5), (1.5, 1.5), (1.5, 1)]
myPoly = Polygon(ext, [int])

# 判断点1是否在该带孔多边形内部
myPoint = Point(1.25, 1.25)
print(myPoint.within(myPoly))  # returns 'False'

# 判断点2是否在该带孔多边形内部
myOtherPoint = Point(0.5, 0.5)
print(myOtherPoint.within(myPoly))  # returns 'True'

# 绘制多边形
x, y = myPoly.exterior.xy
plt.fill(x, y, color='lightblue', alpha=0.5, label='Polygon Exterior')

# 绘制内孔
interior = LinearRing(int)
x_int, y_int = interior.xy
plt.fill(x_int, y_int, color='white', alpha=1.0, label='Polygon Interior Hole')

# 绘制点
plt.plot(myPoint.x, myPoint.y, 'ro', label='Point (1.25, 1.25)')
plt.plot(myOtherPoint.x, myOtherPoint.y, 'go', label='Point (0.5, 0.5)')

# 显示图例
plt.legend()

# 显示图形
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Polygon with a Hole and Points')
plt.grid(True)
plt.show()

image-20240603103124804