pj_get_def 的替代品?

Replacement for pj_get_def?

我有一个应用程序可以解析 pj_get_def 的输出,将 EPSG 标识符转换为一些有用的 key/value 对。

根据the migration guide,替换为proj_pj_info。但是,我返回的 PJ_PROJ_INFO 有一个空的 definitiondescription 是一个不明确的(如果人类可读的话)字符串。

测试代码如下:

#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,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 之间的兼容性严重中断,显然,没有办法编写适用于两个版本的代码,而无需诉诸版本条件逻辑。