boost::geometry::within 地理坐标系中的某个点失败 --- 为什么?
boost::geometry::within for a point in a geographic coordinate system fails --- why?
代码:
我正在使用 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;
}
我希望 within
是 true
但它是 false
。为什么是false
?
如果您不按顺时针顺序放置点,则 boost::geometry::within
可能未定义。
改用boost::geometry::read_wkt( "POLYGON((0 89, 0 0, 180 0, 180 89, 0 89 ))", poly );
在进一步调查中,请参阅我对其他答案的评论,这似乎是 boost geometry 如何构建您提供的多边形的不同之处。
当我们给出一个 0 0 到 180 0 的点时,在这种情况下,boost land 实际上将世界包裹在西方,而不是像我和我相信你所期待的东方。
为了防止这种情况发生,我建议插入一个额外的点来分解经度分量大于或等于 180 度的任何单个顶点。这会强制 boost 以您想要的方向而不是最短距离绘制。
代码: 我正在使用 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;
}
我希望 within
是 true
但它是 false
。为什么是false
?
如果您不按顺时针顺序放置点,则 boost::geometry::within
可能未定义。
改用boost::geometry::read_wkt( "POLYGON((0 89, 0 0, 180 0, 180 89, 0 89 ))", poly );
在进一步调查中,请参阅我对其他答案的评论,这似乎是 boost geometry 如何构建您提供的多边形的不同之处。
当我们给出一个 0 0 到 180 0 的点时,在这种情况下,boost land 实际上将世界包裹在西方,而不是像我和我相信你所期待的东方。
为了防止这种情况发生,我建议插入一个额外的点来分解经度分量大于或等于 180 度的任何单个顶点。这会强制 boost 以您想要的方向而不是最短距离绘制。