zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python进行网格分割

Python 进行 分割 网格
2023-09-14 09:10:02 时间
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes
from shapely.geometry import Polygon

def make_mesh(box,w,h): #按照w,h对box进行网格划分
    [xmin,ymin,xmax,ymax]=box
    list_x=np.arange(xmin,xmax,w)
    list_y=np.arange(ymin,ymax,h)
    #list_x中第i项和list_y中第j项所代表的网格为[list_x[i],list_y[j],list_x[i+1],list_y[j+1]]
    fig, ax = plt.subplots()
    ax.set_xbound(xmin, xmax)
    ax.set_ybound(ymin, ymax)
    color=['red', 'black', 'yellow','blue','green','purple']
    for i in range(len(list_x)):
        for j in range(len(list_y)):
            xleft=list_x[i]
            ydown=list_y[j]
            if i==len(list_x)-1:
                xright=xmax
            else:
                xright=list_x[i+1]
            if j==len(list_y)-1:
                yup=ymax
            else:
                yup=list_y[j+1]
            print((xleft,ydown,xright,yup))
            rect = mpathes.Rectangle([xleft,ydown], w, h, color=color[(i+j%5)%5])
            ax.add_patch(rect)
    print("************************")
    print(list_x)
    print(list_y)
    plt.show()
make_mesh([0,0,1.4,1.2],0.22,0.33)

将这些网格转化为GIS中的PolyGon,如下

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon
import geopandas as gpd

def make_mesh(box,w,h): #按照w,h对box进行网格划分
    [xmin,ymin,xmax,ymax]=box
    list_x=np.arange(xmin,xmax,w)
    list_y=np.arange(ymin,ymax,h)
    rect=gpd.GeoSeries(Polygon([(xmin, ymin), (xmax+w, ymin), (xmax+w, ymax+h), (xmin, ymax+h)]))
    ax=rect.plot(color='white')
    color=['red', 'black', 'yellow','blue','green','purple']
    for i in range(len(list_x)):
        for j in range(len(list_y)):
            xleft=list_x[i]
            ydown=list_y[j]
            if i==len(list_x)-1:
                xright=xmax
            else:
                xright=list_x[i+1]
            if j==len(list_y)-1:
                yup=ymax
            else:
                yup=list_y[j+1]
            rectangle=gpd.GeoSeries(Polygon([(xleft, ydown), (xright, ydown), (xright, yup), (xleft, yup)]))
            print(rectangle)
            rectangle.plot(ax=ax,color=color[(i+j%5)%5])

    print("************************")
    print(list_x)
    print(list_y)
    plt.show()
make_mesh([0,0,1.4,1.2],0.22,0.33)

这是大矩形框的高和宽均不能被网格高和宽整除的情况:
在这里插入图片描述
这是两者都能被整除的情况:
在这里插入图片描述
返回geopandas中的GeoSeries:

import numpy as np
import matplotlib.pyplot as plt
from shapely.geometry import Polygon
import geopandas as gpd
import math

def make_mesh(box,w,h): #按照w,h对box进行网格划分
    [xmin,ymin,xmax,ymax]=box
    list_x=np.arange(xmin,xmax,w)
    list_y=np.arange(ymin,ymax,h)
    polygon_list=[]
    for i in range(len(list_x)):
        for j in range(len(list_y)):
            xleft=list_x[i]
            ydown=list_y[j]
            if i==len(list_x)-1:
                xright=xmax
            else:
                xright=list_x[i+1]
            if j==len(list_y)-1:
                yup=ymax
            else:
                yup=list_y[j+1]
            rectangle=Polygon([(xleft, ydown), (xright, ydown), (xright, yup), (xleft, yup)])
            polygon_list.append(rectangle)

    return gpd.GeoSeries(polygon_list)

[xmin,ymin,xmax,ymax]=eval(input("输入box:"))
[w,h]=eval(input("输入网格宽和高:"))
gdf=make_mesh([xmin,ymin,xmax,ymax],w,h)
print(gdf)
print(math.ceil((xmax-xmin)/w)*math.ceil((ymax-ymin)/h))
gdf.boundary.plot()
plt.show()

均被整除的情况:
在这里插入图片描述
均不被整除的情况:
在这里插入图片描述