【问题标题】:using boost::geometry to convert from Latitude and longitude to UTM使用 boost::geometry 将纬度和经度转换为 UTM
【发布时间】:2021-05-21 21:12:55
【问题描述】:

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

【问题讨论】:

    标签: c++ boost geospatial geo boost-geometry


    【解决方案1】:

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

    似乎所有球形(SRS)都只是......根本没有记录。文档生成器可能有问题。

    不管怎样,我通过测试代码进行了几次繁琐的搜索,我偶然发现了一个可行的答案。

    这里是例子

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

    更加磕磕绊绊地在https://epsg.io/?q=UTM+31N上找到了对应的EPSG代码:

    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”链接已经严重过时/不是最终实现的方式。

    【讨论】:

    • Disclaimer 部分引用了谁?或者,这不是报价单?
    • @LuisTavares 我使用降价来表达。块引号就是这样。我经常将它们用作“旁白”。我很欣赏 - 显然 - 这有时会导致轻微的混乱,所以我会记住这一点。但是,只要看看我的一些答案,你就会明白,如果我出于纯粹的原因而避免使用一些印刷选项,那么许多人会受到结构清晰度下降的影响。
    • 我是投票的人...答案和您的评论。
    • @LuisTavares 干杯。我没想到——那是整整 4 周前的事了。很确定有人过来了,也许确实发现了问题(或者可能只是噪音。鼠标滑倒发生了,但在一个月前的低流量标签中并没有很多:))
    • 供您参考,视频的 PDF 版本可用:archive.fosdem.org/2019/schedule/event/geo_spatialboostgeometry/… / 一般来说,如果您在 Google 上搜索视频会议的标题,您可能会找到 PDF 格式的幻灯片,尤其是技术会议。跨度>
    【解决方案2】:

    我对@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);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-09
      • 2011-02-11
      • 2010-09-15
      • 2016-07-30
      • 2019-03-01
      • 2018-02-03
      • 2011-02-10
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多