h3r公司

h3r公司是的接口{h3lib}它本身就是优步的包装H3级库。查看他们的开始有关所有详细信息的指南。

包装器都是矢量化的,这意味着每个输入可以获取一个矢量,和/或返回一个矢量。

例如:

h3r公司::拉通至单元格(
  纬度= c(c)(-37.820197,-37.818476)
,液化天然气= c(c)(144.983324,144.967354)
,分辨率= c(c)(1升、14升)
)
#[1]“81be7ffffffffff”“8ebe6356311035f”

大多数H3原料药作为R函数包含在此包中。唯一的例外是

然而,这些都应该可以通过C API访问

设计选择

h3r公司::单元格到LatLng(单元格= c(c)(“8cbe63562a54bff”,“8cbe635631103ff”))
#拉特液化天然气
# 1 -37.82023 144.9832
# 2 -37.81844 144.9674
h3r公司::单元格到边界(单元格= c(c)(“8cbe63562a54bff”,“8cbe635631103ff”))
#$`8cbe63562a54bff美元`
#拉特液化天然气
# 1 -37.82030 144.9833
# 2 -37.82019 144.9833
# 3 -37.82012 144.9832
# 4 -37.82016 144.9831
#5-37.82026 144.9831
#6-37.82033 144.9832
#
#$`8cbe635631103ff美元`
#拉特液化天然气
# 1 -37.81851 144.9675
# 2 -37.81840 144.9675
# 3 -37.81833 144.9674
# 4 -37.81837 144.9673
# 5 -37.81847 144.9673
# 6 -37.81854 144.9674

美国石油学会

要在自己的包中使用源C/C++代码,只需包含inst/include/h3rapi。小时

C API(美国石油学会)

/仪表板/仪表板您将找到一个演示包{h3rc}。这显示了如何将{h3r}中的C代码包含到另一个包中/调用它。

您需要解决的主要组件包括

  1. 描述
  2. src/init。c(c)
  3. src/myCode。c(c)-即,您自己的C代码
  4. R/myR代码。R(右)-即您自己的R代码
  5. 注册动态库

描述

依赖链接到{h3r}(&L)

取决于:h3r公司链接到:h3r公司

src/init。c(c)

定义要从{h3r}导入的函数

SEXP(*h3rLatLngToCell)(SEXP、SEXP、SEXP);

空隙R_init_h3rc(DllInfo*info)

{
R_registerRoutines(信息,空,调用方法,空,空);
使用动态符号(_U)(信息,FALSE);

  /*从h3r进口*/
h3rLatLngToCell=(SEXP(*)(SEXP、SEXP、SE XP))R_GetCCallable(“h3r”,“h3rLatLngToCell”);
}

钢筋混凝土/钢筋混凝土。c(c)

包括“h3rapi.h”标题,然后您可以调用在中注册的函数src/初始化。c(c)

#包括“h3rapi.h”

SEXP h3rcLatLngToCell(SEXP lat、SEXP lng、SEXP res){
  返回h3rLatLngToCell(纬度、液化天然气、资源);
}

雷诺数。R(右)

调用您在中定义的函数h3钢筋。c(c)从R函数内

#“@导出
ll2电池<- 功能(纬度、经度、分辨率){
  .致电(h3rcLatLngToCell,lat,lon,res)
}

R/<某处。风险>

注册您的动态例程。如果使用Roxygen构建和记录您的包,您可以指定

#'@useDynLib h3rc,.registration=TRUE
无效的

它将自动构建并添加到您的NAMESPACE中

C++API

/inst/cppai公司您已经找到了一个演示包{h3rcpp}。这显示了如何将{h3r}中的C++代码包含到另一个包中/调用这些代码。

您需要解决的主要组件包括

  1. 描述
  2. src/myCode.cpp(源代码/我的代码.cpp)-即,您自己的C++代码
  3. R/myR代码。R(右)-即您自己的R代码
  4. 注册动态库

示例包显示了如何做到这一点,它与C例如上面的。所以我不打算重复它。

相反,我将向您展示一个示例,说明您可能希望如何使用它

考虑的输出单元格到边界()

h3r公司::单元格到边界(单元格= c(c)(“8cbe63562a54bff”,“8cbe635631103ff”))
#$`8cbe63562a54bff`
#拉特液化天然气
# 1 -37.82030 144.9833
# 2 -37.82019 144.9833
# 3 -37.82012 144.9832
# 4 -37.82016 144.9831
# 5 -37.82026 144.9831
# 6 -37.82033 144.9832
#
#$`8cbe635631103ff美元`
#拉特液化天然气
# 1 -37.81851 144.9675
#2-37.81840 144.9675
# 3 -37.81833 144.9674
# 4 -37.81837 144.9673
# 5 -37.81847 144.9673
# 6 -37.81854 144.9674

这给出了一个包含2个元素的列表,每个元素都包含纬度/液化天然气坐标。

你可以使用C++h3r::单元格到边界()在您自己的工作流中,并使用允许链接到源代码的其他R包。

在这个示例中,我使用{几何}{sfheaders}转换为有效的{sf}对象。

此函数中的步骤包括:

  1. h3r::单元格到边界-获取每个单元格的边界
  2. 几何体::collapse_list()-制作一个列表,包含三个矢量
  1. sfheaders::sf_polygon()-将结果转换为平方英尺对象

图书馆(卢比)
图书馆(平方英尺)##对于“sf.print”方法
#链接到GEOS 3.11.0、GDAL 3.5.3、PROJ 9.1.0;sf_use_s2()为真

cpp函数(
  
  取决于= c(c)(“h3r”,“几何图形”,“sfheaders”)#您需要安装“sfheaders”
,包括= c(c)(
    '#include“geometries/utils/lists/collapse.hpp”'
,'#include“sfheaders/sf/sf.hpp”'
,'#include“h3rapi.h”'
)
  
,代码= '
  
SEXP sfBoundary(Rcpp::StringVector单元格){
      
R_xlen_t n=Rf_xlength(细胞);
      
//转换为车牌边界
Rcpp::列表边界=h3r::cellToBoundary(cells);
      
//需要解释任何五边形
Rcpp::IntegerVector n_pentagons=h3r::is五角大楼(单元格);
R_xlen_t n_五边形=n_五角形[0];
R_xlen_t行计数=(n_五角大楼*5)+((n-n_五边大楼)*6);
     
//将边界塌陷为三个向量的列表
//列0:id
//第1列:纬度
//col2:lng(液化天然气)
Rcpp::List geometries=几何体::utils::collapse_List(boundaries,row_count);
      
//“sfheaders”api需要data.frame或矩阵
Rcpp::DataFrame df=Rcpp::as(几何图形);

Rcpp::整数向量idCol={0};
Rcpp::整数向量几何Col={1,2};
      
返回sfheaders::api::sf_polygon(df,geometryCol,idCol,R_NilValue,“XY”,false,true);

}
'
)


sf边界(单元格= c(c)(“8cbe63562a54bff”,“8cbe635631103ff”))
#具有2个功能和1个字段的简单功能集合
#几何体类型:POLYGON
#尺寸:XY
#边界框:xmin:37.82033 ymin:144.9673 xmax:37.81833 ymax:144.9833
#CRS:不适用
#id几何
#1 1个多边形(-37.8203 144.9833。。。
#2 2多边形((-37.81851 144.967。。。