我在地图上有一个网格点,我想知道哪一个点在陆地上还是海洋里。我试过用三种方法来做这件事,但都不令人满意。在
使用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
),海洋中的腐蚀点也被标记为红色的陆地。似乎maskoceans
的f
分辨率与Basemap
的f
分辨率顺序不同。在
Image of points detected with maskoceans
使用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
使用Polygon.contains_point
。请参见示例here。这对我不起作用,因为为了使用conians_point
,海岸线的多边形应该闭合。因此,map
对象应该用
map = Basemap(projection='aeqd',lon_0=0,resolution='f')
如果地图定义在lon和lat的窗口上,则海岸线多边形不会闭合。但是加载具有全分辨率的完整地图需要很长的时间和内存,甚至检测到一个点也需要很长时间。在
有没有其他方法可以在给定的网格上识别陆地/海洋点?如果解决问题得到解决,它更愿意使用maskoceans
。是否可以将maskoceans()
的分辨率提高到Basemap
的分辨率?在
目前没有回答
相关问题 更多 >
编程相关推荐