使用 boost::geometry 将纬度和经度转换为 UTM
using boost::geometry to convert from Latitude and longitude to UTM
boost::geometryseems to have support to convert from lat/lon to UTM。不幸的是,我找不到任何关于如何做到这一点的例子。
有人有愿意分享的例子吗?
我只是花了很多时间来寻找这个(好几个小时)。
似乎所有球形 (SRS) 都只是......根本没有记录。也许文档生成器出了问题。
无论如何,通过测试代码进行了几次乏味的搜索,我偶然发现了一个有效的答案。
示例如下
更磕磕绊绊地在https://epsg.io/?q=UTM+31N:
上找到了相应的EPSG代码
#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)
免责声明:
我实际上并不相信我定义的 UTM
点 type 很有意义。我认为任何可以接收 2 个坐标的点类型都可以。至少作为坐标系的 srs::...
似乎没有做任何事情 - bg::convert、bg::assign 和朋友们不知道如何应用投影。我认为您包含的“doxygen_z_article09”link 与 date/not 事情的最终实施方式完全不符。
我对@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);
}
boost::geometryseems to have support to convert from lat/lon to UTM。不幸的是,我找不到任何关于如何做到这一点的例子。 有人有愿意分享的例子吗?
我只是花了很多时间来寻找这个(好几个小时)。
似乎所有球形 (SRS) 都只是......根本没有记录。也许文档生成器出了问题。
无论如何,通过测试代码进行了几次乏味的搜索,我偶然发现了一个有效的答案。
示例如下
更磕磕绊绊地在https://epsg.io/?q=UTM+31N:
#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)
免责声明:
我实际上并不相信我定义的 UTM
点 type 很有意义。我认为任何可以接收 2 个坐标的点类型都可以。至少作为坐标系的 srs::...
似乎没有做任何事情 - bg::convert、bg::assign 和朋友们不知道如何应用投影。我认为您包含的“doxygen_z_article09”link 与 date/not 事情的最终实施方式完全不符。
我对@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);
}