This page was generated from source/notebooks/L2/geopandas-geometries.ipynb.
Binder badge
Binder badge CSC badge

Creating new layers

Since geopandas takes advantage of Shapely geometric objects, it is possible to create spatial data from a scratch by passing Shapely’s geometric objects into the GeoDataFrame. This is useful as it makes it easy to convert e.g. a text file that contains coordinates into spatial data layers. Next we will see how to create a new GeoDataFrame from scratch and save it into a Shapefile. Our goal is to define a geometry that represents the outlines of the Senate square in Helsinki, Finland.

  • Start by importing necessary modules:
[1]:
import geopandas as gpd
from shapely.geometry import Point, Polygon
from pyproj import CRS
  • Let’s create an empty GeoDataFrame:
[2]:
newdata = gpd.GeoDataFrame()
[3]:
print(newdata)
Empty GeoDataFrame
Columns: []
Index: []

We have an empty GeoDataFrame! A geodataframe is basically a pandas DataFrame that should have one column dedicated for geometries. By default, the geometry-column should be named geometry (geopandas looks for geometries from this column).

  • Let’s create the geometry column:
[4]:
# Create a new column called 'geometry' to the GeoDataFrame
newdata['geometry'] = None
[5]:
print(newdata)
Empty GeoDataFrame
Columns: [geometry]
Index: []

Now we have a geometry column in our GeoDataFrame but we still don’t have any data.

  • Let’s create a Shapely Polygon repsenting the Helsinki Senate square that we can later insert to our GeoDataFrame:
[6]:
# Coordinates of the Helsinki Senate square in decimal degrees
coordinates = [(24.950899, 60.169158), (24.953492, 60.169158), (24.953510, 60.170104), (24.950958, 60.169990)]
[7]:
# Create a Shapely polygon from the coordinate-tuple list
poly = Polygon(coordinates)
[8]:
# Check the polyogon
print(poly)
POLYGON ((24.950899 60.169158, 24.953492 60.169158, 24.95351 60.170104, 24.950958 60.16999, 24.950899 60.169158))

Okay, now we have an appropriate Polygon -object.

  • Let’s insert the polygon into our ‘geometry’ column of our GeoDataFrame on the first row:
[9]:
# Insert the polygon into 'geometry' -column at row 0
newdata.at[0, 'geometry'] = poly
[10]:
# Let's see what we have now
print(newdata)
                                            geometry
0  POLYGON ((24.95090 60.16916, 24.95349 60.16916...

Great, now we have a GeoDataFrame with a Polygon that we could already now export to a Shapefile. However, typically you might want to include some attribute information with the geometry.

  • Let’s add another column to our GeoDataFrame called location with text Senaatintori that describes the location of the feature.
[11]:
# Add a new column and insert data
newdata.at[0, 'location'] = 'Senaatintori'

# Let's check the data
print(newdata)
                                            geometry      location
0  POLYGON ((24.95090 60.16916, 24.95349 60.16916...  Senaatintori

Okay, now we have additional information that is useful for recognicing what the feature represents.

Before exporting the data it is always good (basically necessary) to determine the coordinate reference system (projection) for the GeoDataFrame. GeoDataFrame has an attribute called .crs that shows the coordinate system of the data which is empty (None) in our case since we are creating the data from the scratch (more about projection on next tutorial):

[12]:
print(newdata.crs)
None

Let’s add a crs for our GeoDataFrame. We passed the coordinates as latitude and longitude decimal degrees, so the correct CRS is WGS84 (epsg code: 4326).

  • add CRS definition to newdata in wkt format using pyproj CRS:
[13]:
# Set the GeoDataFrame's coordinate system to WGS84 (i.e. epsg code 4326)
newdata.crs = CRS.from_epsg(4326).to_wkt()

As we can see, now we have added coordinate reference system information into our GeoDataFrame. The CRS information is necessary for creating a .prj file for our output Shapefile.

  • Finally, we can export the GeoDataFrame using .to_file() -function. The function works quite similarly as the export functions in pandas, but here we only need to provide the output path for the Shapefile. Easy isn’t it!:
[14]:
# Determine the output path for the Shapefile
outfp = "L2_data/Senaatintori.shp"

# Write the data into that Shapefile
newdata.to_file(outfp)

Now we have successfully created a Shapefile from scratch using only Python programming. Similar approach can be used to for example to read coordinates from a text file (e.g. points) and create Shapefiles from those automatically.

TASK

Check the output Shapefile by reading it with geopandas and make sure that the attribute table and geometry seems correct.

EXTRA TASK

Re-project the data to ETRS-TM35FIN (EPSG:3067) and save again!

[ ]: