Hi all,

I'm struggling with the construction of polygons in boost::geometry, hopefully someone can shed some light on this.

Consider the following code to create a polygon (defined using 4 coordinates in clockwise order) around the 180 degree meridian, and subsequently test whether some locations are contained in it (namespace bg = boost::geometry):

typedef bg::model::point<double, 2, bg::cs::geographic<bg::degree> > point_type;
bg::model::polygon<point_type> polygon_across_180;
bg::read_wkt("POLYGON((170 40, -150 40, -150 5, 170 5))", polygon_across_180);

// Majuro (west of the 180 degree meridian, but within the polygon)
double majuro_lon = 171.266667;
double majuro_lat = 7.066667;
point_type majuro(majuro_lon, majuro_lat);

// Honolulu, Hawaii (east of the 180 degree meridian, but within the polygon)
double honolulu_lon = -157.816667;
double honolulu_lat = 21.3;
point_type honolulu(honolulu_lon, honolulu_lat);

// New Delhi: far west of the polygon
double newdelhi_lon = 77.208889;
double newdelhi_lat = 28.613889;
point_type newdelhi(newdelhi_lon, newdelhi_lat);

assert(bg::within(majuro, polygon_across_180));
assert(bg::within(honolulu, polygon_across_180));
assert(!bg::within(newdelhi, polygon_across_180));

The first two assertions are fine, but the third assertion (note the negation) fails. However, New Delhi is not even close to the polygon. After altering the order of the polygon coordinates, the assertions are valid:
bg::read_wkt("POLYGON((-150 40, -150 5, 170 5, 170 40))", polygon_across_180);

Is this behaviour expected, and if so: can someone please explain it to me (or point me to some documentation)? I have a dataset with a large number of polygon definitions, but can't get the 'within' method to work properly.

Many, many thanks!

  Bas