Python判断海陆点方法
10/21
本文最后更新于
2023年10月21日,已超过
500天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
从网上找到Python判断海陆点的两种方法。
Basemap is_land
利用Basemap工具函数is_land()
from mpl_toolkits.basemap import Basemap
map = Basemap(projection='cyl', resolution='i')
#lon, lat = 130., 30. #ocean
lon, lat = 120., 30. #land
xp,yp = map(lon,lat)
print(map.is_land(xp,yp))
说明:
- is_land(xpt,ypt)接受的参数是basemap建立的地图投影坐标中的(xpt,ypt),所以必须先将经纬度转换成投影坐标位置再传给is_land函数。
- 海陆点判断基于GSHHS海岸线数据(polygon),陆地区域湖上的点不算做陆地点。
- Basemap参数resolution可以指定边界数据库的分辨率,有如下选择:c(crude)/l(low)/i(intermediate)/h(high)/f(full)/None,默认使用c。分辨率越高,判断越准确,但运行速度也更慢。
Basemap说明:https://matplotlib.org/basemap/api/basemap_api.html
global-land-mask
项目地址:https://github.com/toddkarin/global-land-mask
特色
- 使用全球1 km超高分辨率的GLOBE高程数据集制作海陆掩码,数据源(https://www.ngdc.noaa.gov/mgg/topo/gltiles.html)。
- 数据点维数(21600,43200),如果不压缩的话有980MB,通过numpy
savez_compressed
压缩保存只有2.5MB。 - global.is_land使用规则网格上最邻近查表法,速度比Basemap.is_land快很多
示例
globe.is_land(lat,lon)
直接接受经纬度参数,参数可以是标量/数组。
from global_land_mask import globe
import numpy as np
# Check if a point is on land:
lat = 40
lon = -120
is_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 ocean
lat = 40
lon = 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]
速度对比
根据作者提供的范例example_speed_compare.py
,相比Basemap.is_land,globe库在我的机器上测试加速了2472倍左右。
Time to run globe.is_land(): 0.0011701583862304688
Time to run Basemap.is_land(): 2.8924736976623535
Speed up: 2471.865118174409
Fraction agreeing: 0.9856
其它说明
- 其中“湖”被当做陆地。
- 可以看出该方法不是完全准确判断,但满足大部分需求了。

