问题描述
我有一个应用程序可以解析 pj_get_def
的输出,将 epsg 标识符转换为一些有用的键/值对。
根据the migration guide,替换为proj_pj_info
。但是,我返回的 PJ_PROJ_INFO
有一个空的 deFinition
,而 description
是一个不明确的(如果人类可读的)字符串。
这是测试代码:
#include <proj.h>
#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
#include <proj_api.h>
#include <iostream>
#include <string>
void test_pj(int crs)
{
auto const arg = "+init=epsg:" + std::to_string(crs);
auto* const proj = pj_init_plus(arg.c_str());
auto* const text = pj_get_def(proj,0);
std::cout << "PROJ 4\n";
std::cout << "text: '" << text << "'\n";
}
void test_proj(int crs)
{
auto const arg = "epsg:" + std::to_string(crs);
auto* const proj = proj_create(nullptr,arg.c_str());
auto const& info = proj_pj_info(proj);
std::cout << "PROJ 5\n";
// std::cout << "id: '" << info.id << "'\n"; crash?
std::cout << "deFinition: '" << info.deFinition << "'\n";
std::cout << "description: '" << info.description << "'\n";
}
int main()
{
test_pj(4326);
test_proj(4326);
}
这是输出:
PROJ 4
text: ' +init=epsg:4326 +proj=longlat +datum=wgs84 +no_defs +ellps=wgs84 +towgs84=0,0'
PROJ 5
deFinition: ''
description: 'WGS 84'
pj_get_def
的替代品是什么?如何将 PJ
分解为我可以在 PROJ 4 中获得的有趣信息?
解决方法
好吧,文档是错误的。正确的替换不是 proj_pj_info
,而是 proj_as_proj_string
。
但是有一点需要注意:在 PROJ 4 中,这包括椭球。在 PROJ 6 中,它没有。如果需要椭圆体,则需要额外调用 proj_get_ellipsoid
(后跟另一个 proj_as_proj_string
)。
编辑:所以,事实证明 proj_pj_info
确实 工作...但仅在 PROJ 5(不是 PROJ 6)中,并且仅使用 +init=epsg:N
(这不是PROJ 6 支持)。
我没有深入挖掘,但我怀疑 PROJ 5 根本不支持 EPSG:N
语法,这使得 5 和 6 之间的兼容性中断,显然无法编写代码这适用于两个版本,无需诉诸版本条件逻辑。