#point #whether #earth #ocean #bitmap #memory #landmask

bin+lib roaring-landmask

基于 GSHHG 的快速且内存占用有限的陆地掩码结构,用于确定地球上的一个点是在陆地上还是在海洋中

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次 下载

MIT 许可证

490KB
769

Crates.io Documentation PyPI Actions Status

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 上可用

  1. pip install roaring-landmask

要从源代码构建,可以使用 pip

  1. pip install.

或 maturin

  1. 安装 maturin

  2. 构建和安装

maturin build --release
pip install target/wheels/... # choose your whl

依赖关系

~11–21MB
~316K SLoC