//编制索引 R_寄存器CCallable(“h3lib”,“latLngToCell”,(DL_FUNC)&latLngToCell); R_RegisterC可调用(“h3lib”、“cellToLatLng”、(DL_FUNC)和cellToLatLng); R_寄存器CCallable(“h3lib”,“单元到边界”,(DL_FUNC)&单元到边界);
以下是我希望您注册并提供的一些C函数 到其他包
//编制索引 内联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); }
取决于: h3库 链接到: h3库
H3错误(*latLngToCell); H3错误(*cellToLatLng); H3错误(*cellToBoundary); …等
#包括“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); 返回细胞; }
图书馆( 卢比 ) 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”