检查陆地上或海上的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在SearchView上获取空对象引用   使用参数从命令行运行java Maven项目时出错   java如何根据其他属性对属性进行排序?   java MongoDB不会为嵌套文档的_id字段保存空值   xml如何使用Java从SOAP响应中检索元素值?   java根据给定的DateTimeFieldType对DateTime进行取整   java标识是否已打开JDialog   在WLS/JDeveloper中部署简单java文件   java如何处理带有最终字段的空构造函数   java如何从单张图生成矢量图像   java Swing工作线程在大型XML解析期间导致延迟   H2数据库中@GeneratedValue的java问题   JavaSpring表达式语言检查字符串列表中是否包含字符串   java检查二叉树中的节点是否有子节点?   java为多个几乎相似的片段重用同一适配器   java libgdx处理cam外部的对象   RecycleView Android/Java中的可自定义适配器存在问题   java总是调用线程。currentThread()。中断();当捕捉到中断异常时?   多线程在java中顺序的含义是什么?