跳到内容

SymbolixAU/h3lib

h3库

是什么h3库?

h3库是R包装。但它也是R包。

没有任何R函数可以调用,也不能导入将as-i打包成您自己的。

那么,什么 h3库?

h3库暴露优步H3源文件(写入C) 通过Callable例程。

这些例程可以在您自己的包中使用。

我如何调用这些例程?

首先,看看/src/init。c(c)。你会看到一大堆R_寄存器C调用()电话:

//编制索引R_寄存器CCallable(“h3lib”,“latLngToCell”,(DL_FUNC)&latLngToCell);R_RegisterC可调用(“h3lib”、“cellToLatLng”、(DL_FUNC)和cellToLatLng);R_寄存器CCallable(“h3lib”,“单元到边界”,(DL_FUNC)&单元到边界);

这些基本上是说

以下是我希望您注册并提供的一些C函数到其他包

现在往里看/inst/include/h3libapi。小时。在这里您将看到所有功能这些注册例程的定义

//编制索引内联H3Error latLngToCell(const LatLng*g,int res,H3Index*out){H3错误(*fun)(常量LatLng*,int,H3索引*)=(H3Error(*)(const LatLng*,int,H3Index*))R_GetCCallable(“h3lib”,“latLngToCell”);返回乐趣(g,res,out);}

中注册的例程初始化。c(c)和中的定义h3libapi。小时应该匹配。如果有什么遗漏,请告诉我们!

这解释了哪些例程可以有人打电话给你,但你还没说怎样给他们打电话?

是的,我要开始了。

演示如何实际呼叫这些例程,让我们使用h3r公司包作为示例。

以下是调用拉通至单元格例程定义于h3库

描述

描述需要链接到{h3lib}的文件

取决于:h3库链接到:h3库

src/init。c(c)

如果你看一下/src公司/您将看到各种目录.c类文件夹。

这个初始化。c(c)还包含一些R_寄存器C调用()(因为它也是将其部分C代码暴露给更广泛的R生态系统)。

但它也定义了它想要的例程进口

H3错误(*latLngToCell);H3错误(*cellToLatLng);H3错误(*cellToBoundary);…等

src/h3r索引。c(c)

然后在.c文件中,需要包含h3libapi。小时文件,这是它!

(我强调了调用拉通至单元格例行程序)

#包括“h3libapi.h”SEXP h3rLatLngToCell(SEXP lat、SEXP lon、SEXP-res){R_xlen_t n=Rf_x长度(lat);R_xlen_t i;SEXP细胞=保护(Rf_allocVector(STRSXP,n));车床车床;H3指数h3指数;//char str[17];对于(i=0;i<n;i++){int ires=整数(res)[i];sexpToLatLng(&latLng,lat,lon,i);h3error(latLngToCell(&latLng,ires,&h3Index),i);//<--看这里;这是呼叫h3lib latLngToCell//h3ToString(h3Index,str,17);SET_STRING_ELT(单元格,i,h3ToSexpString(h3Index));}不受保护(1);返回细胞;}

工作示例

让我们构建自己的示例,使用单元格到LatLng建造{sf}多边形。

为此,我们可以链接到这两者{h3lib}{sfheaders}

图书馆(卢比)cpp函数(取决于 =c(c)("h3库","几何图形"  ##<-必需,因为sfheaders依赖于它,"sfheaders(sf标头)"   ##<-用于通过C++代码构建sf对象),包括 =c(c)('#包括“h3libapi.h”','#包括“sfheaders/sfg/polygon/sfg_polygon.hpp”'),代码 = '
SEXP单元到多边形(SEXP h3){
    
R_xlen_t n=Rf_x长度(h3);
R_xlen_t i,j;
      
Rcpp::列出poylgons(n);//用于存储sfg_polygons
      
对于(i=0;i<n;++i){
H3指数idx;
细胞边界cb;
        
//将SEXP单元(stringVector)转换为H3Index
int e1=字符串ToH3(CHAR(字符串_ELT(h3,i)),&idx);
//TODO:处理错误代码`e1`
        
//将H3Index转换为CellBoundary对象
int e2=单元格到边界(idx,&cb);
//TODO:处理错误代码`e2`;
        
//将CellBoundary转换为sfg_polygon
//其中sfheaders::sfg_polygon接受矩阵或数据帧
Rcpp::NumericMatrix latLng(cb.numVerts,2);
对于(j=0;j<cb.numVerts;++j){
latLng(j,0)=radsToDegs(cb.vert[i].lng);
latLng(j,1)=radsToDegs(cb.verts[j].lat);
}
poylgons[i]=sfheaders::sfg::sfg_polygon(latLng,“XY”);
}
返回poylgons;
}
  ')单元格到多边形(c("8cbe63562a54折","8cbe635631103ff号"))#[[1]]
#[[1]]
#[,1]      [,2]
#[1,] 144.9833 -37.82030
#[2,] 144.9833 -37.82019
#[3,] 144.9833 -37.82012
#[4,] 144.9833 -37.82016
#[5,] 144.9833 -37.82026
#[6,] 144.9833 -37.82033
#[7,] 144.9833 -37.82030
# 
#attr(,“类”)
#[1] “XY”“POLYGON”“sfg”
# 
#[[2]]
#[[1]]
#[,1]      [,2]
#[1,] 144.9675 -37.81851
#[2,] 144.9675 -37.81840
#[3,] 144.9675 -37.81833
#[4,] 144.9675 -37.81837
#[5,] 144.9675 -37.81847
#[6,] 144.9675 -37.81854
#[7,] 144.9675 -37.81851
# 
#attr(,“类”)
#[1] “XY”“POLYGON”“sfg”

关于

未提供描述、网站或主题。

资源

许可证

未知,找到MIT许可证

找到的许可证

未知
许可证
麻省理工学院
许可.md

星星

观察者

叉子

发布

未发布版本

包装

未发布包