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()
均被整除的情况: 均不被整除的情况: