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')
是否有其他方法来识别给定网格上的陆地/海洋点?如果解决问题得到解决,它更愿意使用
maskoceans
。可以将maskoceans()
的分辨率提高到Basemap
的分辨率?窗口化的Basemap中的多边形是闭合的,并且包含_点()。