Voronoi.py 2.8 KB
# coding=utf-8
#author:        4N
#createtime:    2021/6/9
#email:         nheweijun@sina.com

from osgeo.ogr import *
from osgeo.gdal import *
#
from osgeo import ogr
import random
import time

from scipy.spatial import Voronoi,voronoi_plot_2d
import numpy as np
import random
import os
import time

print(os.path.abspath(__file__))
begin_time = time.time()


create_feature=100000

layer_name="voronoixian"
work_dir = r"E:/Data/bigdata"
# work_dir =os.path.dirname(os.path.abspath(__file__))

driver:Driver = ogr.GetDriverByName("ESRI Shapefile")

#打开广东边界
ds: DataSource = driver.Open("E:\Data\广东边界\gdxian.shp", 1)
if not ds:
    raise Exception("打开数据失败!")
layer: Layer = ds.GetLayer(0)

each_piece_features = create_feature*1.0/layer.GetFeatureCount()

data_source=None
outLayer=None

for feat in layer:
    geo:Geometry=feat.GetGeometryRef()



    extent = geo.GetEnvelope()
    points = []
    i=0
    while i<each_piece_features:
        point = ogr.Geometry(ogr.wkbPoint)

        x = (extent[1]-extent[0])*random.random()+extent[0]
        y = (extent[3]-extent[2])*random.random()+extent[2]
        point.AddPoint_2D(x,y)
        # print(geo.Intersect(point))
        if geo.Intersect(point):
            points.append([x,y])
            i+=1


    array = np.array(points)

    # 沃罗诺伊图
    vor = Voronoi(array,furthest_site=False, incremental=True, qhull_options=None)


    # 泰森多边形的顶点
    vertices = vor.vertices


    regions = vor.regions





    if not data_source:
        data_source: DataSource = driver.CreateDataSource(os.path.join(work_dir,"{}.shp".format(layer_name)))
    if not outLayer:
        outLayer = data_source.CreateLayer(layer_name, geom_type=ogr.wkbPolygon )


    print(time.time()-begin_time)
    print("here")
    vonoi_time = time.time()


    for index,r in enumerate(regions):
        if len(r) == 0:
            continue
        if -1 in r:
            continue
        angulars = []
        for id in r:
            angulars.append(vertices[id])
        angulars.append(vertices[r[0]])


        ring = ogr.Geometry(ogr.wkbLinearRing)
        for point in angulars:
            ring.AddPoint(point[0],point[1])


        # Create polygon
        poly = ogr.Geometry(ogr.wkbPolygon)
        poly.AddGeometry(ring)

        poly:Geometry= geo.Intersection(poly)
        if poly:
            if poly.IsEmpty():
                continue

            featureDefn = outLayer.GetLayerDefn()
            outFeature = ogr.Feature(featureDefn)
            outFeature.SetGeometry(poly)

            outLayer.CreateFeature(outFeature)
            outFeature = None

    print(time.time()-vonoi_time)
data_source.Destroy()
ds.Destroy()