Plot only on continent in matplotlib

前端 未结 5 765
清歌不尽
清歌不尽 2020-11-27 07:13

I am drawing a map using basemap from matplotlib. The data are spreaded all over the world, but I just want to retain all the data on the continent and drop those on the oce

5条回答
  •  失恋的感觉
    2020-11-27 08:00

    is_land() will loop all the polygons to check whether it's land or not. For large data size, it's very slow. You can use points_inside_poly() from matplotlib to check an array of points quickly. Here is the code. It doesn't check lakepolygons, if you want remove points in lakes, you can add your self.

    It took 2.7 seconds to check 100000 points on my PC. If you want more speed, you can convert the polygons into a bitmap, but it's a little difficult to do this. Please tell me if the following code is not fast enought for your dataset.

    from mpl_toolkits.basemap import Basemap
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.nxutils as nx
    
    def points_in_polys(points, polys):
        result = []
        for poly in polys:
            mask = nx.points_inside_poly(points, poly)
            result.extend(points[mask])
            points = points[~mask]
        return np.array(result)
    
    points = np.random.randint(0, 90, size=(100000, 2))
    m = Basemap(projection='moll',lon_0=0,resolution='c')
    m.drawcoastlines()
    m.fillcontinents(color='coral',lake_color='aqua')
    x, y = m(points[:,0], points[:,1])
    loc = np.c_[x, y]
    polys = [p.boundary for p in m.landpolygons]
    land_loc = points_in_polys(loc, polys)
    m.plot(land_loc[:, 0], land_loc[:, 1],'ro')
    plt.show()
    

提交回复
热议问题