检查陆地上或海上的LAT/Lon点

global-land-mask的Python项目详细描述


全球陆地面罩

检查地球上任何一点的纬度/经度点是否在陆地上。

说明

这个python模块,global land mask,包含用于检查lat/lon点是在陆地上还是在海上的脚本。为了做到这一点,我们使用地球数据集,它以1km的分辨率对整个地球进行采样。然后,我们简单地从这个立面图中提取所有“无效”值并保存到文件中。

全局掩码是形状的(2160043200),在不压缩的情况下保存时约等于980mb。使用numpy savez_compressed可以将这些数据压缩到2.5 MB,从而使包非常紧凑。

全球数据集的原始高程数据可以从 https://www.ngdc.noaa.gov/mgg/topo/gltiles.html 无需下载此数据即可使用全局土地掩码。但是,通过下载,可以使用提供的函数构建全局高程数据集。

此包提供globe.is_land(),它是basemap.is_land()的一个属性。对于10000个数据点,globe.is_land的速度大约是basemap.is_land的6000倍。

简单示例

下面是一个简单的例子,显示了使用global_land_mask检查纬度/经度点是否在陆地上。

fromglobal_land_maskimportglobeimportnumpyasnp# Check if a point is on land:lat=40lon=-120is_on_land=globe.is_land(lat,lon)print('lat={}, lon={} is on land: {}'.format(lat,lon,is_on_land))# lat=40, lon=-120 is on land: True# Check if several points are in the oceanlat=40lon=np.linspace(-150,-110,3)is_in_ocean=globe.is_ocean(lat,lon)print('lat={}, lon={} is in ocean: {}'.format(lat,lon,is_in_ocean))# lat=40, lon=[-150. -130. -110.] is in ocean: [ True  True False]

速度测试

比较global_land_mask和basemap的性能。

fromglobal_land_maskimportglobefrommpl_toolkits.basemapimportBasemapimportmatplotlibmatplotlib.use('TkAgg')importnumpyasnpimporttime# Lat/lon points to getlat=np.linspace(-20,50,100)lon=np.linspace(-130,-70,100)# Make a gridlon_grid,lat_grid=np.meshgrid(lon,lat)# Get whether the points are on land using globe.is_landstart_time=time.time()globe_land_mask=globe.is_land(lat_grid,lon_grid)globe_run_time=time.time()-start_timeprint('Time to run globe.is_land(): {}'.format(globe_run_time))# Get whether the points are on land using Basemap.is_land# bm = Basemap(projection='cyl',resolution='i')bm=Basemap(projection='cyl',llcrnrlat=-60,urcrnrlat=90, \
            llcrnrlon=-180,urcrnrlon=180,resolution='c')f=np.vectorize(bm.is_land)start_time=time.time()xpt,ypt=bm(lon_grid,lat_grid)basemap_land_mask=f(xpt,ypt)basemap_run_time=time.time()-start_timeprint('Time to run Basemap.is_land(): {}'.format(basemap_run_time))print('Speed up: {}'.format(basemap_run_time/globe_run_time))# Check agreement (note there is a different treatment for lakesfraction_agreed=np.sum(globe_land_mask==basemap_land_mask)/len(globe_land_mask.flatten())print('Fraction agreeing: {}'.format(fraction_agreed))

我们上方的地图示例

尝试运行

fromglobal_land_maskimportglobefrommpl_toolkits.basemapimportBasemapimportnumpyasnpimportmatplotlibmatplotlib.use('TkAgg')importmatplotlib.pyplotasplt# Lat/lon points to getlat=np.linspace(-20,90,1000)lon=np.linspace(-130,-60,1002)# Make a gridlon_grid,lat_grid=np.meshgrid(lon,lat)# Get whether the points are on land.z=globe.is_land(lat_grid,lon_grid)# Set up mapfig=plt.figure(0,figsize=(5.5,4.5))plt.clf()ax=fig.add_axes([0.1,0.1,0.8,0.8])m=Basemap(llcrnrlon=-119,llcrnrlat=22,urcrnrlon=-64,urcrnrlat=49,projection='lcc',lat_1=33,lat_2=45,lon_0=-95,area_thresh=200,resolution='i')m.drawstates(linewidth=0.2)m.drawcoastlines(linewidth=0.2)m.drawcountries(linewidth=0.2)cs=m.contourf(lon_grid,lat_grid,z,levels=[-0.5,0.5,1.5],cmap="jet",latlon=True)plt.show()plt.savefig('example_plot_globe_map_us.png',bbox_inches='tight',dpi=400)

要为美国创建二进制掩码,如下图所示:

Map of Land Mask

请注意,湖泊被列为“陆地上的”,分辨率并不完美,但它足够好的许多目的!

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java获取textview的文本并将其粘贴到另一个上   java ImageIO。write()不保存文件   java H2数据库排序字符串时间戳,格式为yyyyMMdd'T'hh:mm:ss。SSSSSSS'Z'   java匿名类与静态字段   java将一个句子拆分为字符串数组,并保留特殊字符或空格   JavaBIRT报告引擎。计算Javascript表达式时出错   日志表的java MySQL隔离级别读取未提交   java Android调用意图权限   java如何在iText 7中查找文本位置和边界   从Groovy调用Java类主方法时,避免参数数量不正确   java libGDX:在批处理调用stage constructor时,为舞台上的演员绘制纹理作为背景   java randoop可以利用usermade JUnit测试生成测试吗?   java Eclipse工作区将不再显示我的项目