替换 pj_get_def?

问题描述

我有一个应用程序可以解析 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 之间的兼容性中断,显然无法编写代码这适用于两个版本,无需诉诸版本条件逻辑。