需要比maskoceans(grid=1.25,resolution='f')更准确地检测地图的陆地/海洋点

2024-09-29 17:13:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在地图上有一个网格点,我想知道哪一个点在陆地上还是海洋里。我试过用三种方法来做这件事,但都不令人满意。在

  1. 使用maskoceans,一个简单的例子是:

    from mpl_toolkits.basemap import maskoceans
    import numpy
    # my grid is given by lons and lats 1D arrays.
    Array = numpy.ma.zeros((lats.size,lons,size))
    Lons,Lats = numpy.meshgrid(lons,lats)
    MaskedArray = maskoceans(Lons,Lats,Array,resolution='f',grid=1.25)
    

现在我有了MaskedArray海洋上的位置被屏蔽了。与其它方法相比,该方法的计算速度很快,但在海岸附近的小尺度下,这种方法不准确。在下面的图中,红点表示陆地,黑点表示海洋。正如你所看到的,即使我使用了resolution='f'(完全解析)和最小屏蔽网格(grid=1.25),海洋中的腐蚀点也被标记为红色的陆地。似乎maskoceansf分辨率与Basemapf分辨率顺序不同。在

Image of points detected with maskoceans

  1. 使用basemap.is_land()。例如:

    # Create a basemap object, this takes a while!
    MinLat = numpy.min(lats) - 0.01
    MinLon = numpy.min(lons) - 0.01
    MaxLat = numpy.max(lats) + 0.01
    MaxLon = numpy.max(lons) + 0.01
    MidLat = numpy.mean(lats)
    MidLon = numpy.mean(lons)
    from mpl_tookits.basemap import Basemap
    map = Basemap(projection='aeqd',llcrnrlat=MinLat,llcrnrlon=MinLon,urcrnrlat=MaxLat,urcrnrlon=MaxLon,area_thresh=0.01,lon_0=MidLon,lat_0=MidLat,resolution='f')
    Array = numpy.zeros((lats.size,lons.size),dtype=bool)
    for j in range(lats.size):
        for i in range(lons.size):
            x,y = map(lon[i],lat[j])
            if map.is_land(x,y):
                Array[j,i] = True
    

这是最准确的方法。如下图所示,所有点都被正确地检测到。is_land()的一个大问题是它的速度非常慢。对于大型网格,此方法需要几分钟(对于非常大的网格,以小时为单位),而maskoceans所用时间不到一秒。在

Image of points detected with Basemap.is_land

  1. 使用Polygon.contains_point。请参见示例here。这对我不起作用,因为为了使用conians_point,海岸线的多边形应该闭合。因此,map对象应该用

     map = Basemap(projection='aeqd',lon_0=0,resolution='f')
    

如果地图定义在lon和lat的窗口上,则海岸线多边形不会闭合。但是加载具有全分辨率的完整地图需要很长的时间和内存,甚至检测到一个点也需要很长时间。在

有没有其他方法可以在给定的网格上识别陆地/海洋点?如果解决问题得到解决,它更愿意使用maskoceans。是否可以将maskoceans()的分辨率提高到Basemap的分辨率?在


Tags: 方法numpy网格mapsizeis分辨率array

热门问题