Plotting a map using geopandas and matplotlib

后端 未结 3 1167

I have small csv that has 6 coordinates from Birmingham England. I read the csv with pandas then transformed it into GeoPandas DataFrame changing my latitude and longitude colu

3条回答
  •  梦毁少年i
    2021-02-09 15:15

    The GeoPandas documentation contains an example on how to add a background to a map (https://geopandas.readthedocs.io/en/latest/gallery/plotting_basemap_background.html), which is explained in more detail below.


    You will have to deal with tiles, that are (png) images served through a web server, with a URL like

    http://.../Z/X/Y.png, where Z is the zoom level, and X and Y identify the tile

    And geopandas's doc shows how to set tiles as backgrounds for your plots, fetching the correct ones and doing all the otherwise difficult job of spatial syncing, etc...


    Installation

    Assuming GeoPandas is already installed, you need the contextily package in addition. If you are under windows, you may want to pick a look at How to install Contextily?

    Use case

    Create a python script and define the contextily helper function

    import contextily as ctx
    
    def add_basemap(ax, zoom, url='http://tile.stamen.com/terrain/tileZ/tileX/tileY.png'):
        xmin, xmax, ymin, ymax = ax.axis()
        basemap, extent = ctx.bounds2img(xmin, ymin, xmax, ymax, zoom=zoom, url=url)
        ax.imshow(basemap, extent=extent, interpolation='bilinear')
        # restore original x/y limits
        ax.axis((xmin, xmax, ymin, ymax))
    

    and play

    import matplotlib.pyplot as plt
    from shapely.geometry import Point
    import geopandas as gpd
    import pandas as pd
    
    # Let's define our raw data, whose epsg is 4326
    df = pd.DataFrame({
        'LAT'  :[-22.266415, -20.684157],
        'LONG' :[166.452764, 164.956089],
    })
    df['coords'] = list(zip(df.LONG, df.LAT))
    
    # ... turn them into geodataframe, and convert our
    # epsg into 3857, since web map tiles are typically
    # provided as such.
    geo_df = gpd.GeoDataFrame(
        df, crs  ={'init': 'epsg:4326'},
        geometry = df['coords'].apply(Point)
    ).to_crs(epsg=3857)
    
    # ... and make the plot
    ax = geo_df.plot(
        figsize= (5, 5),
        alpha  = 1
    )
    add_basemap(ax, zoom=10)
    ax.set_axis_off()
    plt.title('Kaledonia : From Hienghène to Nouméa')
    plt.show()
    


    Note: you can play with the zoom to find the good resolution for the map. E.g./I.e. :

    ... and such resolutions implicitly call for changing the x/y limits.

提交回复
热议问题