地理坐标系中某个点的 boost::geometry::内 失败---原因

boost::geometry::within for a point in a geographic coordinate system fails --- why?

本文关键字:geometry 失败 原因 boost 坐标系      更新时间:2023-10-16

Code:我正在使用boost_1_61_0。 我正在将库的几何部分用于 GIS 应用程序。 这个想法是在定义的区域(在本例中为矩形)内查找点。 这有时有效,但并非总是如此。 下面是一个示例,其中点应该在矩形内,但不是...

我有以下测试用例:

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/geometry/multi/geometries/multi_polygon.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <iostream>
#include <boost/geometry/io/wkt/wkt.hpp>
class wxPoint
{
public :
    double  getx() const
    {
        return m_x;
    }
    double gety() const
    {
        return m_y;
    }
    void setx( double in)
    {
        m_x = in;
    }
    void sety(double in)
    {
        m_y = in;
    }
private:
    double m_x;
    double m_y;
};
BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(
    wxPoint,
    double,
    boost::geometry::cs::geographic<boost::geometry::degree>,
    wxPoint::getx,
    wxPoint::gety,
    wxPoint::setx,
    wxPoint::sety )
int main()
{
    boost::geometry::model::polygon< wxPoint > poly;
    boost::geometry::read_wkt( "POLYGON((0 89, 180 89, 180 0, 0 0, 0 89 ))", poly );  
    wxPoint point;
    point.setx( 150 );
    point.sety( 88 );
    bool within = boost::geometry::within( point, poly );

    return 0;
}

我希望withintrue但它是false. 为什么false

在进一步调查中,请参阅我对另一个答案的评论,这似乎是增强几何体如何构建您赋予它的多边形的差异。

当我们给出一个点为 0 0 到 180 0 时,在这种情况下,提升土地实际上将世界包裹在西方,而不是我和我相信你所期待的东方。

为了防止这种情况发生,我建议插入一个额外的点来分解经度分量大于或等于 180 度的任何单个顶点。 这会强制增强以按预期方向而不是最短距离绘制。

如果不按顺时针顺序排列点,则boost::geometry::within可能未定义。

改为尝试boost::geometry::read_wkt( "POLYGON((0 89, 0 0, 180 0, 180 89, 0 89 ))", poly );