Python 需要检测地图';s陆地/海洋点的精度高于马斯科塞人(网格=1.25,分辨率=';f';)

Python 需要检测地图';s陆地/海洋点的精度高于马斯科塞人(网格=1.25,分辨率=';f';),python,matplotlib,matplotlib-basemap,Python,Matplotlib,Matplotlib Basemap,我在地图上有一个点的网格,我想检测哪个点在陆地上还是海洋上。我试过三种方法,但都不满意 使用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,l

我在地图上有一个点的网格,我想检测哪个点在陆地上还是海洋上。我试过三种方法,但都不满意

  • 使用
    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)
    
    # 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
    
  • 现在我有了
    MaskedArray
    ,海洋上的位置都被屏蔽了。与其他方法相比,该方法速度非常快,但在小尺度的海岸附近不准确。在下图中,红点被标识为陆地,黑点被标识为海洋。正如您所看到的,即使我使用了
    分辨率
    (完整分辨率)和最小的屏蔽网格(
    网格=1.25
    ),海洋中也有红色标记为陆地的腐蚀点。似乎
    f
    马斯科齐人的
    f
    分辨率与
    Basemap
    f
    分辨率的顺序不同

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

    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)
    
    # 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
    
  • 这是最准确的方法。如下图所示,所有点都被正确检测到。
    的最大问题是_land()
    的速度非常慢。对于大型网格,此方法需要几分钟(对于非常大的网格,大约需要一小时),而
    maskoceans
    只需不到一秒钟

  • 使用多边形。包含点。请看一个例子。这对我来说不起作用,因为海岸线的多边形应该是闭合的,以便使用
    圆锥面\ u点
    。因此,
    映射
    对象应在整个地球仪上用

     map = Basemap(projection='aeqd',lon_0=0,resolution='f')
    
  • 如果地图是在lon和lat窗口上定义的,则海岸线多边形不会闭合。但是加载具有完整分辨率的完整地图需要很长的时间和内存,甚至检测一个点也需要很长时间


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

    窗口化的Basemap中的多边形是闭合的,并且
    包含_点()。