我正在尝试着色使用创建的Voronoi图scipy.spatial.Voronoi.这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d
# make up data points
points = np.random.rand(15,2)
# compute Voronoi tesselation
vor = Voronoi(points)
# plot
voronoi_plot_2d(vor)
# colorize
for region in vor.regions:
if not -1 in region:
polygon = [vor.vertices[i] for i in region]
plt.fill(*zip(*polygon))
plt.show()
Run Code Online (Sandbox Code Playgroud)
结果图像:

正如您所看到的,图像边界处的一些Voronoi区域没有着色.这是因为这些区域的Voronoi顶点的一些索引被设置为-1,即,对于Voronoi图之外的那些顶点.根据文件:
区域:(整数列表,形状(nregions,*))形成每个Voronoi区域的Voronoi顶点的索引.-1表示Voronoi图外的顶点.
为了使这些区域着色,我试图从多边形中删除这些"外部"顶点,但这不起作用.我想,我需要在图像区域的边界填写一些点,但我似乎无法弄清楚如何合理地实现这一点.
有人可以帮忙吗?
我正在从一组点计算voronoi图,如下所示:
from scipy.spatial import Voronoi
import numpy as np
np.random.seed(0)
points = np.random.uniform(-0.5, 0.5, (100, 2))
// Compute Voronoi
v = Voronoi(points)
voronoi_plot_2d(v)
plt.show()
Run Code Online (Sandbox Code Playgroud)
这将创建如下图像:
可以看出,这是创建无限远(虚线)的顶点,也是创建点的原始边界框之外的顶点:
bbox = np.array([[-0.5, -0.5], [0.5, -0.5], [0.5, 0.5], [-0.5, 0.5]])
Run Code Online (Sandbox Code Playgroud)
我想要做的是将voronoi图剪辑到此边界框,即将出界和无限顶点投影到此边界框上的适当位置.因此,需要重新排列顶点并将其投影回来自无限远或有限顶点的适当交叉点,但这些顶点超出了剪切区域的界限.
我有北京地区人员流动的GPS坐标。我想将地理空间划分为例如 2 平方公里(增量)的矩形网格,并访问网格内任何点的索引位置。单元格的大小不需要完全相同,在我的情况下可以使用近似值。
我的地理区域具有以下边界框坐标(纬度、经度)。
Bottom Left (x1,y1) = 39.77750000, 116.17944444
Top Left (x1,y2) = 40.04722222, 116.58888889
Bottom Right (x2,y1) = 39.77750000, 116.58888889
Top Right (x2,y2) = 40.04722222, 116.17944444
Run Code Online (Sandbox Code Playgroud)
这是 30 公里 x 34 公里的矩形区域。我心中的解决方案是取delta为2km,以delta增加纬度和经度值,直到达到上限。
要访问 GPS 点 p 的索引位置,令 BL 为矩形区域的左下点
Row = Distance [(p.lat,BL.long), (BL.lat, BL.long)] / delta
Column = Distance [(BL.lat,p.long), (BL.lat, BL.long)] / delta
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法或支持库来解决这个问题?最好是行和列(x,y)的组合,这样我就可以通过在笛卡尔坐标系中找到两个网格单元之间的距离来测量网格单元的紧密程度。示例图像和输入数据集可以让您清楚地了解描述。
链接中给出的输入数据集https://drive.google.com/file/d/1JjvS7igTmrtLA4E5Rs5D6tsdAXqzpYqX/view