使用 boost::geometry 从纬度和经度转换为 UTM 免责声明:

问题描述

boost::geometry seems to have support to convert from lat/lon to UTM。不幸的是,我找不到任何关于如何做到这一点的例子。 有人愿意分享一个例子吗?

解决方法

我只是花了很多时间来寻找这个(几个小时)。

似乎所有球形 (SRS) 都只是……根本没有记录。也许文档生成器出了点问题。

无论如何,通过测试代码进行了几次乏味的搜索,我偶然发现了一个有效的答案。

示例如下

  • Amsterdam(UTM 629144.77 Easting 5803996.66 Northing in zone 31U)
  • Barcelona(UTM 430887.56 东,4581837.85 北,31T 区)

我在https://epsg.io/?q=UTM+31N上找到了相应的EPSG代码:enter image description here

Live On Compiler Explorer

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/geometries/point_xy.hpp>

#include <boost/geometry/srs/epsg.hpp>
#ifdef COLIRU
#include <boost/geometry/srs/projection.hpp>
#endif

namespace bg = boost::geometry;
namespace bm = bg::model::d2;
namespace srs = bg::srs;

using LongLat = bm::point_xy<double,bg::cs::geographic<bg::degree> >;
using UTM     = bm::point_xy<double/*,srs::static_epsg<3043>*/>;

constexpr LongLat Amsterdam() { return { 4.897,52.371}; }
constexpr LongLat Barcelona() { return { 2.1734,41.3851 }; }

void report(LongLat src,auto const& prj) {
    UTM r {};
    prj.forward(src,r);
    std::cout << std::fixed << bg::wkt(src) << " -> " << bg::wkt(r) << "\n";
}

int main() {
#ifndef COLIRU
    // dynamic projection factory too heavy on Coliru
    srs::projection<> zone31 = srs::proj4("+proj=utm +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5 +zone=31");
    report(Amsterdam(),zone31);
    report(Barcelona(),zone31);
#endif

    srs::projection<srs::static_epsg<3043> > epsg3043;
    report(Amsterdam(),epsg3043);
    report(Barcelona(),epsg3043);
}

印刷品

POINT(4.897000 52.371000) -> POINT(629144.771310 5803996.656944)
POINT(2.173400 41.385100) -> POINT(430887.564331 4581837.853239)
POINT(4.897000 52.371000) -> POINT(629144.771310 5803996.656944)
POINT(2.173400 41.385100) -> POINT(430887.564331 4581837.853239)

免责声明:

我实际上并不相信我定义的 UTMtype 有多大意义。我认为任何可以接收 2 个坐标的点类型都可以。至少作为坐标系的 srs::... 似乎没有做任何事情 - bg::convert、bg::assign 和朋友们无论如何都不神奇地知道如何应用投影。我认为您包含的“doxygen_z_article09”链接已经过时了/不是最终实现的方式。

,

我对@sehe 的回答进行了一些小的修改,使其能够与 VS 2019/C++14 一起编译:

#include <boost/geometry.hpp>
#include <boost/geometry/core/coordinate_system.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <iostream>

#include <boost/geometry/srs/epsg.hpp>
#ifdef COLIRU
#include <boost/geometry/srs/projection.hpp>
#endif

namespace bg  = boost::geometry;
namespace bm  = bg::model::d2;
namespace srs = bg::srs;

using LongLat = bm::point_xy<double,bg::cs::geographic<bg::degree>>;
using UTM     = bm::point_xy<double /*,srs::static_epsg<3043>*/>;

LongLat Barcelona{2.1734,41.3851};
LongLat Amsterdam{4.897,52.371};

template <typename T> void report(LongLat src,T const &prj) {
    UTM r{};
    prj.forward(src,r);
    std::cout << std::fixed << bg::wkt(src) << " -> " << bg::wkt(r) << "\n";
}

int main() {
#ifndef COLIRU
    // dynamic projection factory too heavy on Coliru
    srs::projection<> zone31 = srs::proj4("+proj=utm +ellps=GRS80 +lat_1=0.5 +lat_2=2 +n=0.5 +zone=31");
    report(Amsterdam,zone31);
    report(Barcelona,zone31);
#endif

    srs::projection<srs::static_epsg<3043>> epsg3043;
    report(Amsterdam,epsg3043);
    report(Barcelona,epsg3043);
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...