pj_get_def 的替代品?
Replacement for pj_get_def?
我有一个应用程序可以解析 pj_get_def
的输出,将 EPSG 标识符转换为一些有用的 key/value 对。
根据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,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 之间的兼容性严重中断,显然,没有办法编写适用于两个版本的代码,而无需诉诸版本条件逻辑。
我有一个应用程序可以解析 pj_get_def
的输出,将 EPSG 标识符转换为一些有用的 key/value 对。
根据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,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 之间的兼容性严重中断,显然,没有办法编写适用于两个版本的代码,而无需诉诸版本条件逻辑。