Search code examples
pythonmatplotlibgeopandaspyproj

How do I change the crs projection using Geopandas in Python?


I'm trying to change the .crs from a cilindrical projection (WGS84 (lat/lon)) to a Mercator-projection. Some information can be found here (https://geopandas.org/projections.html). However it doesn't seem to work for me for this shapefile of Belgium. (the example on the geopandas-website for the world worked well so all libraries are installed correctly) Someone an idea what the problem might be? -> My .crs stays cilindrical and does not change to Mercator-projection for this shapefile of Belgium. (dataset 'BELGIUM__Municipalities.shp' -> https://hub.arcgis.com/datasets/esribeluxdata::belgium-municipalities-1)

Example-code:

import geopandas
import fiona
import matplotlib.pyplot as plt
import pandas as pd

def records(filename, list):
    list = sorted(list)
    with fiona.open(filename) as source: 
        for i, feature in enumerate(sourceô:max(list)+1):
            if i in list:
                yield feature

a = list(range(588))
municipalities = geopandas.GeoDataFrame.from_features(records("BELGIUM__Municipalities.shp",a))

municipalities.crs = "epsg:4326"  #WGS84(lat/lon)-projection
municipalities.plot(facecolor = 'lightgrey', linewidth = 0.05, edgecolor = 'black', alpha = 0.25)

municipalities.to_crs("epsg:3395") #Mercator-projection
municipalities.plot(facecolor = 'lightgrey', linewidth = 0.05, edgecolor = 'black', alpha = 0.25)

plt.show()

EDIT:

import geopandas
import fiona
import matplotlib.pyplot as plt
import pandas as pd

def records(filename, list):
    list = sorted(list)
    with fiona.open(filename) as source: 
        for i, feature in enumerate(sourceô:max(list)+1):
            if i in list:
                yield feature

a = list(range(588))
municipalities = geopandas.GeoDataFrame.from_features(records("BELGIUM__Municipalities.shp",a))

municipalities.crs = "epsg:4326"  #WGS84(lat/lon)-projection
municipalities.plot(facecolor = 'lightgrey', linewidth = 0.05, edgecolor = 'black', alpha = 0.25)

municipalities = municipalities.to_crs("epsg:3395") #Mercator-projection
municipalities.plot(facecolor = 'lightgrey', linewidth = 0.05, edgecolor = 'black', alpha = 0.25)

plt.show()

Solution

  • GeoDataFrame.to_crs() does not re-project inplace, it returns a new object. You have to assign it back to municipalities if you want to use your code like this.

    municipalities = municipalities.to_crs("epsg:3395") #Mercator-projection
    

    On top of that, your plotting code will not work, the correct syntax is this:

    municipalities.plot(facecolor = 'lightgrey', linewidth = 0.05, edgecolor = 'black', alpha = 0.25)
    

    Note the . instead of , in numbers.