如何让proc++识别网格目录?



我还没能真正得到EGM96到WGS84转换在proc++中工作。然而,我已经得到了我想在python中工作的东西,通过pyproj,像这样:

from pyproj import Transformer, CRS
from pyproj.transformer import TransformerGroup, TransformDirection
from pyproj.datadir import append_data_dir, get_data_dir
def main():
lat = 43.70012234
lng = -79.41629234
z = 100

append_data_dir("/absolute_directory_to/proj/")
transformer = Transformer.from_crs("epsg:4326", "epsg:5773",)
results = transformer.transform(lat, lng, z,  None, False, True, TransformDirection.INVERSE)
print(results)


if __name__ == "__main__":
main()

提供结果:

(43.70012234, -79.41629234, 62.71016021909354)

和。/proj/目录下的文件us_nga_egm96_15.tif然而,我在c++中复制的相同内容似乎不起作用。

#include <proj.h> 
#include <filesystem> 
#include <array>  
void main(){
auto proj_context = proj_context_create();
const char * path =  "/absolute_directory_to/proj";
const char * db_path = proj_context_get_database_path(proj_context);
std::filesystem::path db_path_path = std::filesystem::path(db_path);
std::string db_path_str = db_path_path.parent_path().string();
std::array paths = {path, db_path_str.c_str()};
proj_context_set_search_paths(proj_context, paths.size(), paths.data());
std::cout << proj_errno_string(proj_context_errno(proj_context)) << std::endl;
auto temp = proj_create_crs_to_crs (proj_context,
"EPSG:4326",
"EPSG:5773",
NULL);
std::cout << proj_errno_string(proj_errno(temp)) << std::endl;
std::cout << proj_errno_string(proj_context_errno(proj_context)) << std::endl;
auto b = proj_trans(temp, PJ_INV, {43.70012234,-79.41629234,100,0});
std::cout << proj_errno_string(proj_errno(temp)) << std::endl;
std::cout << proj_errno_string(proj_context_errno(proj_context)) << std::endl;
std::cout << b.v[0] << "," << b.v[1] << "," << b.v[2] << "," << b.v[3] << std::endl;
std::cout << proj_errno_string(proj_errno(temp)) << std::endl;
std::cout << proj_errno_string(proj_context_errno(proj_context)) << std::endl;
proj_destroy(temp);
proj_context_destroy(proj_context);
return 0; 
}

它实际上什么也没有打印出来(一些奇怪的字符似乎正在吃掉所有其他字符),在调试模式下,我可以看到b = {inf,inf,inf,inf}。如果我没有手动指定投影位置,也会发生同样的事情(但要确保实际的。tiff位于那里)。

我在这里做错了什么?

我在这里没有提到的是,我正在使用VCPKG,由于https://github.com/microsoft/vcpkg/pull/16169,实际上不可能通过VCPKG在linux上使用PROJ的GEO TIFF我建议根本不要通过VCPKG使用PROJ。在这一点上,阻碍这一点得到解决的问题已经被阻止了好几年,而且似乎不会很快得到解决。

看到数据是如何手动设置在这里:https://raw.githubusercontent.com/Microsoft/vcpkg/master/ports/proj4/portfile.cmake

通过代码步进,问题显然是我设置了正确的文件位置,但是当TIFF_ENABLED未定义时,代码静默失败。

//grids.cpp
if (IsTIFF(header_size, header)) {
#ifdef TIFF_ENABLED
auto set = std::unique_ptr<VerticalShiftGridSet>(
GTiffVGridShiftSet::open(ctx, std::move(fp), actualName));
if (!set)
pj_ctx_set_errno(ctx, PJD_ERR_FAILED_TO_LOAD_GRID);
return set;
#else
pj_log(ctx, PJ_LOG_ERROR,
"TIFF grid, but TIFF support disabled in this build");
return nullptr;
#endif

因为我使用的是VCPKG,所以这是不可能修改的。

最新更新