VoronoiGrid.py 3.7 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()




work_dir = r"E:/Data/bigdata"


driver:Driver = ogr.GetDriverByName("OpenFileGDB")



ds: DataSource = driver.Open("", 1)
if not ds:
    raise Exception("打开数据失败!")

layer: Layer = ds.GetLayer(0)
feat=layer.GetFeature(0)
gdsample:Geometry=feat.GetGeometryRef()
extent = gdsample.GetEnvelope()



#裁切网格
grid_list=[]

each_x=(extent[1]-extent[0])/grid_num
each_y=(extent[3]-extent[2])/grid_num

for xn in range(grid_num+1):

    for yn in range(grid_num + 1):

        ring = ogr.Geometry(ogr.wkbLinearRing)

        ring.AddPoint(extent[0] + xn * each_x, extent[2] + yn * each_y)
        ring.AddPoint(extent[0] + xn * each_x, extent[2] + yn * each_y + each_y)
        ring.AddPoint(extent[0] + xn * each_x + each_x, extent[2] + yn * each_y + each_y)
        ring.AddPoint(extent[0] + xn * each_x + each_x, extent[2] + yn * each_y)
        ring.AddPoint(extent[0] + xn * each_x, extent[2] + yn * each_y)

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

        inter_grid:Geometry = gdsample.Intersection(grid)

        if inter_grid:
            if not inter_grid.IsEmpty():
                if inter_grid.Area()/grid.Area()>0.5:
                    grid_list.append(inter_grid)

each_piece_features = create_feature*1.0/len(grid_list)



data_source: DataSource = driver.CreateDataSource(os.path.join(work_dir, "{}.shp".format(layer_name)))

outLayer = data_source.CreateLayer(layer_name, geom_type=ogr.wkbPolygon)

passnum=1
for geo in grid_list:
    passnum+=1
    if passnum%10==0:
        continue
    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)

        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


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

    add = True

    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 add:
            # add =False
            if poly:
                if poly.IsEmpty():
                    continue

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

                outLayer.CreateFeature(outFeature)
                outFeature = None
        else:
            add=True

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