// Boost.Geometry (aka GGL, Generic Geometry Library) // Unit Test // Copyright (c) 2016-2017 Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fisikopoulos, on behalf of Oracle // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include template struct geo_strategies { // Set radius type, but for integer coordinates we want to have floating // point radius type typedef typename bg::promote_floating_point < typename bg::coordinate_type

::type >::type rtype; typedef bg::srs::spheroid stype; typedef bg::strategy::distance::andoyer andoyer_type; typedef bg::strategy::distance::thomas thomas_type; typedef bg::strategy::distance::vincenty vincenty_type; }; template void test_default() //this should use andoyer strategy { for (std::size_t i = 0; i <= 2; ++i) { test_geometry >(poly_data_geo[i], 1116814.237 + 1116152.605); } //since the geodesic distance is the shortest path it should go over the pole //in this case; thus the correct perimeter is the meridian length (below) //and not 40075160 which is the legth of the equator test_geometry >(poly_data_geo[3], 40007834.7139); //force to use equator path test_geometry >(poly_data_geo[4], 40075016.6856); // Multipolygon test_geometry > > (multipoly_data[0], 60011752.0709); // Geometries with length zero test_geometry

("POINT(0 0)", 0); test_geometry >("LINESTRING(0 0,0 1,1 1,1 0,0 0)", 0); } template void test_with_strategy(N exp_length, Strategy strategy) { for (std::size_t i = 0; i <= 2; ++i) { test_geometry >(poly_data_geo[i], exp_length, strategy); } // Geometries with length zero test_geometry

("POINT(0 0)", 0, strategy); test_geometry >("LINESTRING(0 0,0 1,1 1,1 0,0 0)", 0, strategy); } template void test_andoyer() { typename geo_strategies

::andoyer_type andoyer; test_with_strategy

(1116814.237 + 1116152.605, andoyer); } template void test_thomas() { typename geo_strategies

::thomas_type thomas; test_with_strategy

(1116825.795 + 1116158.7417, thomas); } template void test_vincenty() { typename geo_strategies

::vincenty_type vincenty; test_with_strategy

(1116825.857 + 1116159.144, vincenty); } template void test_all() { test_default

(); test_andoyer

(); test_thomas

(); test_vincenty

(); } int test_main(int, char* []) { // Works only for double(?!) //test_all > >(); //test_all > >(); test_all > >(); #if defined(HAVE_TTMATH) test_all >(); #endif return 0; }