【问题标题】:How to get PROJ C++ to recognize grid directory?如何让 PROJ C++ 识别网格目录?
【发布时间】:2021-11-30 12:58:03
【问题描述】:

我实际上无法将 EGM96 转换为 WGS84 以在 PROJ C++ 中工作。然而,我已经通过 pyproj 得到了我想要在 python 中工作的东西,如下所示:

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)

而文件us_nga_egm96_15.tif 位于./proj/ 目录中 但是,我在 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 位于那里),也会发生同样的事情。

我在这里做错了什么?

【问题讨论】:

    标签: c++ path proj pyproj


    【解决方案1】:

    我在这里没有提到的一点是,我使用的是 VCPKG,由于 https://github.com/microsoft/vcpkg/pull/16169,实际上 不可能通过 VCPKG 在 linux 上使用 GEO TIFF 用于 PROJ 我建议根本不完全通过 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,所以无法修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2010-11-26
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      相关资源
      最近更新 更多