12 个不稳定版本 (4 个破坏性更新)
0.7.1 | 2022年11月7日 |
---|---|
0.5.1 | 2022年4月1日 |
0.5.0 | 2022年3月24日 |
0.4.0 | 2021年12月2日 |
0.2.1 | 2021年6月14日 |
#121 在 地理空间
每月41次 下载
490KB
769 行
Roaring Landmask
你是否曾需要快速知道你是在海洋中还是在陆地上?并且你不需要使用太多的内存或磁盘?那么试试 Roaring Landmask!
roaring landmask 是一个 Rust + Python 包,用于快速确定给定经纬度的点是否在陆地上。陆地掩码存储在一个由 Roaring Bitmaps 构成的树中。靠近海岸的点可能仍然在海洋中,因此正数将与海岸线的矢量形状进行校验。
(源代码)
陆地掩码由 GSHHG 海岸线数据库(Wessel, P.,和 W. H. F. Smith,全球自洽、分级的、高分辨率海岸线数据库,J. Geophys. Res.,101,8741-8743,1996)生成。
另一个选择是 opendrift-landmask-data,它稍微快一些,是纯 Python,但需要更多的内存和磁盘空间(内存映射 3.7Gb)。
性能
微基准测试
test tests::test_contains_in_ocean ... bench: 24 ns/iter (+/- 0)
test tests::test_contains_on_land ... bench: 3,795 ns/iter (+/- 214)
许多点,通过 Python
------------------------------------------------------------------------------------------------------ benchmark: 5 tests -----------------------------------------------------------------------------------------------------
Name (time in us) Min Max Mean StdDev Median IQR Outliers OPS Rounds Iterations
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_landmask_many_par 34,335.6220 (>1000.0) 39,922.9660 (>1000.0) 36,167.6438 (>1000.0) 1,602.6359 (>1000.0) 35,658.2270 (>1000.0) 1,722.6990 (>1000.0) 9;1 27.6490 (0.00) 30 1
test_landmask_many 130,760.1480 (>1000.0) 131,155.3400 (>1000.0) 130,863.7110 (>1000.0) 137.1064 (598.03) 130,809.7410 (>1000.0) 135.3770 (>1000.0) 1;1 7.6415 (0.00) 8 1
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
并行版本明显更快,而顺序版本略慢于 opendrift-landmask-data
的等效基准,后者使用大约 120 ms
。
从 Python 使用
from roaring_landmask import RoaringLandmask
l = RoaringLandmask.new()
x = np.arange(-180, 180, .5)
y = np.arange(-90, 90, .5)
xx, yy = np.meshgrid(x,y)
print ("points:", len(xx.ravel()))
on_land = l.contains_many(xx.ravel(), yy.ravel())
构建和安装
预构建的轮子在 PyPI 上可用
pip install roaring-landmask
要从源代码构建,可以使用 pip
pip install.
或 maturin
-
安装 maturin。
-
构建和安装
maturin build --release
pip install target/wheels/... # choose your whl
依赖关系
~11–21MB
~316K SLoC