背景
我正在处理一组包含在csv文件中的8000个地理点。一方面,我创建了一个用这些点构建的Voronoi图的可视化-这是用D3库完成的。另一方面,我使用Scipy在Python中计算这些Voronoi图。在
我的工作逻辑很简单——我在Python方面处理数据,制作热图、分析等等,然后用D3可视化效果。但今天我无意中发现,夏比和D3绘制的沃罗诺图是不同的。我注意到在使用地理JSON.io绘制用Python制作的Voronois的GeoJsons,看看我是否能把那里的一切都可视化。在
正如我所说,Voronois是不同的-有些有不同的角度,有些甚至有额外的顶点。在
问题:
为什么会这样?这两个库(D3和Scipy)计算的Voronoi图为什么不同?在
进一步说明
如何在D3侧实现这一点:基于chriszetter的示例http://chriszetter.com/blog/2014/06/15/building-a-voronoi-map-with-d3-and-leaflet/我将纬度和经度转换为自定义投影,以便在mapbox地图上可视化。在
var voronoi = d3.geom.voronoi()
.x(function(d) { return d.x; })
.y(function(d) { return d.y; })
.clipExtent([[N_W.x , N_W.y],[S_E.x, S_E.y]])
我创建Voronoi基于在地图边界内可见的点+一些填充(filteredPoints)
^{pr2}$如何在Python端实现:我使用scipy.spatial.Voronoi公司. 在
from scipy.spatial import Voronoi
def create_voronois():
points = numpy.array(points_list)
vor = Voronoi(points)
其中“points_list”是我的8000个地理点的列表。在
编辑:
从我的视觉化截图-黑色边框是沃罗诺斯与D3,白色的是由scipy.spatial.Voronoi公司. 我们可以看出,西皮是错的。以前有人比较过这两个库吗?在
要运行的代码。它用计算错误的Voronois打印GeoJson。在
import numpy
from scipy.spatial import Voronoi
from geojson import FeatureCollection, Feature, Polygon
points = [
[22.7433333333000, 53.4869444444000],
[23.2530555556000, 53.5683333333000],
[23.1066666667000, 53.7200000000000],
[22.8452777778000, 53.7758333333000],
[23.0952777778000, 53.4413888889000],
[23.4152777778000, 53.5233333333000],
[22.9175000000000, 53.5322222222000],
[22.7197222222000 ,53.7322222222000],
[22.9586111111000, 53.4594444444000],
[23.3425000000000, 53.6541666667000],
[23.0900000000000, 53.5777777778000],
[23.2283333333000, 53.4713888889000],
[23.3488888889000, 53.5072222222000],
[23.3647222222000 ,53.6447222222000]]
def create_voronois(points_list):
points = numpy.array(points_list)
vor = Voronoi(points)
point_voronoi_list = []
feature_list = []
for region in range(len(vor.regions) - 1):
vertice_list = []
for x in vor.regions[region]:
vertice = vor.vertices[x]
vertice = (vertice[1], vertice[0])
vertice_list.append(vertice)
polygon = Polygon([vertice_list])
feature = Feature(geometry=polygon, properties={})
feature_list.append(feature)
feature_collection = FeatureCollection(feature_list)
print feature_collection
create_voronois(points)
显然,在计算Voronoi图之前,javascript代码正在对数据进行转换。此转换不会保留点的相对距离,因此不会生成与scipy代码相同的结果。注意,我并不是说你的d3版本不正确。假设数据是经纬度,那么您在javascript代码中所做的可能是正确的。但要将其与scipy代码进行比较,如果希望得到相同的Voronoi图,则必须执行相同的转换。在
下面的脚本显示,如果保留输入点的相对距离,scipy的Voronoi函数和d3。沃罗诺几何生成相同的图表。在
下面是一个使用scipy的Voronoi代码的脚本:
它生成以下绘图:
下面是一个使用d3的javascript程序。沃罗诺几何公司名称:
^{pr2}$它产生:
基于对结果的目视检查,我认为他们正在生成相同的Voronoi图。在
相关问题 更多 >
编程相关推荐