# Creating polygon grid using Geopandas

I'm working with a geodataframe of points and I need to create a grid of rectangular polygons.

I know how to have bounds of the geodataframe with `gdf.geometry.bounds`. Now using this information and with 2 variables length and width (L, W) of rectangular polygon, how can I create a grid ?

There are many solutions.

One of them `````` import geopandas as gpd
from shapely.geometry import Polygon
import numpy as np
xmin,ymin,xmax,ymax =  points.total_bounds
width = 2000
height = 1000
rows = int(np.ceil((ymax-ymin) /  height))
cols = int(np.ceil((xmax-xmin) / width))
XleftOrigin = xmin
XrightOrigin = xmin + width
YtopOrigin = ymax
YbottomOrigin = ymax- height
polygons = []
for i in range(cols):
Ytop = YtopOrigin
Ybottom =YbottomOrigin
for j in range(rows):
polygons.append(Polygon([(XleftOrigin, Ytop), (XrightOrigin, Ytop), (XrightOrigin, Ybottom), (XleftOrigin, Ybottom)]))
Ytop = Ytop - height
Ybottom = Ybottom - height
XleftOrigin = XleftOrigin + width
XrightOrigin = XrightOrigin + width

grid = gpd.GeoDataFrame({'geometry':polygons})
grid.to_file("grid.shp")
`````` You can also truncate the grid (convex hull): But one of the most interesting is to use the module gpd_lite_toolboox)

• For calculating number of columns and rows I add abs() because of possibility to have negative coordinates with wgs84 : `rows = abs(int(np.ceil((ymax-ymin) / height)))` and `cols = abs(int(np.ceil((xmax-xmin) / width)))` – Tim C. Jan 26 '18 at 14:01
• @gene I disagree with you since number will always be positive since it is max minus min, not needing abs. – gcamargo May 18 '18 at 18:45
• Where is `abs` in the answer ? – gene May 19 '18 at 19:15

Previous answer gives correct result, but I allowed myself to improve the code, to avoid many unnecessary lines, as well as iterating on indexes instead of values on the list.

``````import geopandas as gpd
from shapely.geometry import Polygon
import numpy as np

xmin,ymin,xmax,ymax = points.total_bounds

length = 1000
wide = 1200

cols = list(range(int(np.floor(xmin)), int(np.ceil(xmax)), wide))
rows = list(range(int(np.floor(ymin)), int(np.ceil(ymax)), length))
rows.reverse()

polygons = []
for x in cols:
for y in rows:
polygons.append( Polygon([(x,y), (x+wide, y), (x+wide, y-length), (x, y-length)]) )

grid = gpd.GeoDataFrame({'geometry':polygons})
grid.to_file("grid.shp")
``````

The main idea might be the same, but we are creating now much less useless variables and whole code is clearer to understand