diff --git a/doc/release_notes.qbk b/doc/release_notes.qbk
index 3d68894b5..df3a5fe49 100644
--- a/doc/release_notes.qbk
+++ b/doc/release_notes.qbk
@@ -28,6 +28,8 @@
* The support for C++11 `std::initializer_list` in geometries models.
* Disjoint and intersects support the following geometry combinations: multipoint/linestring, multipoint/multilinestring.
* Added relate() and relation() algorithms.
+* Intersection has been implemented for combinations of pointlike and linear geometries
+* Added implementation for difference(pointlike, linear)
[*Improvements]
diff --git a/extensions/test/gis/projections/Jamfile.v2 b/extensions/test/gis/projections/Jamfile.v2
index b57c8ebf5..8e68c39a3 100644
--- a/extensions/test/gis/projections/Jamfile.v2
+++ b/extensions/test/gis/projections/Jamfile.v2
@@ -12,5 +12,7 @@ test-suite boost-geometry-extensions-gis-projections
:
[ run projection.cpp ]
[ run projections.cpp ]
+ [ run projections_combined.cpp ]
+ [ run projections_static.cpp ]
[ run projection_epsg.cpp ]
;
diff --git a/extensions/test/gis/projections/projections.cpp b/extensions/test/gis/projections/projections.cpp
index 180acc3eb..6b7e2f6fc 100644
--- a/extensions/test/gis/projections/projections.cpp
+++ b/extensions/test/gis/projections/projections.cpp
@@ -132,6 +132,7 @@ void test_all()
test_forward
("eck6", 4.897000, 52.371000, 342737.885307, 6363364.830847, "+proj=eck6 +ellps=WGS84 +units=m");
test_forward
("eqc", 4.897000, 52.371000, 545131.546415, 5829913.052335, "+proj=eqc +ellps=WGS84 +units=m");
test_forward
("eqdc", 4.897000, 52.371000, 307874.536263, 5810915.646438, "+proj=eqdc +ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
+ test_forward
("etmerc", 4.897000, 52.371000, 333425.492123, 5815921.814393, "+proj=etmerc +ellps=WGS84 +units=m");
test_forward
("euler", 4.897000, 52.371000, 338753.024859, 5836825.984893, "+proj=euler +ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
test_forward
("fahey", 4.897000, 52.371000, 388824.354103, 5705638.873094, "+proj=fahey +ellps=WGS84 +units=m");
test_forward
("fouc", 4.897000, 52.371000, 268017.369817, 6272855.564674, "+proj=fouc +ellps=WGS84 +units=m");
@@ -149,6 +150,7 @@ void test_all()
test_forward
("hammer", 4.897000, 52.371000, 370843.923425, 5630047.232233, "+proj=hammer +ellps=WGS84 +units=m");
test_forward
("hatano", 4.897000, 52.371000, 383644.128560, 6290117.704632, "+proj=hatano +ellps=WGS84 +units=m");
test_forward
("imw_p", 4.897000, 52.371000, 318784.808056, 3594184.939568, "+proj=imw_p +ellps=WGS84 +units=m +lat_1=20n +lat_2=60n +lon_1=5");
+ test_forward
("isea", 4.897000, 52.371000, -413613.639976, 9218173.701546, "+proj=isea +ellps=WGS84 +units=m");
test_forward
("kav5", 4.897000, 52.371000, 383646.088858, 5997047.888175, "+proj=kav5 +ellps=WGS84 +units=m");
test_forward
("kav7", 4.897000, 52.371000, 407769.043907, 5829913.052335, "+proj=kav7 +ellps=WGS84 +units=m");
test_forward
("krovak", 14.416667, 50.083333, -743286.779768, -1043498.912060, "+proj=krovak +ellps=WGS84 +units=m");
@@ -256,6 +258,7 @@ void test_all()
test_inverse
("eck6", 342737.885307, 6363364.830847, 4.897000, 52.371000, "+proj=eck6 +ellps=WGS84 +units=m");
test_inverse
("eqc", 545131.546415, 5829913.052335, 4.897000, 52.371000, "+proj=eqc +ellps=WGS84 +units=m");
test_inverse
("eqdc", 307874.536263, 5810915.646438, 4.897000, 52.371000, "+proj=eqdc +ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
+ test_inverse
("etmerc", 333425.492123, 5815921.814393, 4.897000, 52.371000, "+proj=etmerc +ellps=WGS84 +units=m");
test_inverse
("euler", 338753.024859, 5836825.984893, 4.897000, 52.371000, "+proj=euler +ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
test_inverse
("fahey", 388824.354103, 5705638.873094, 4.897000, 52.371000, "+proj=fahey +ellps=WGS84 +units=m");
test_inverse
("fouc", 268017.369817, 6272855.564674, 4.897000, 52.371000, "+proj=fouc +ellps=WGS84 +units=m");
diff --git a/extensions/test/gis/projections/projections_combined.cpp b/extensions/test/gis/projections/projections_combined.cpp
new file mode 100644
index 000000000..9cec9b905
--- /dev/null
+++ b/extensions/test/gis/projections/projections_combined.cpp
@@ -0,0 +1,134 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Unit Test
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// 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)
+
+
+#if defined(_MSC_VER)
+#pragma warning( disable : 4305 ) // truncation double -> float
+#endif // defined(_MSC_VER)
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+
+template class Projection, typename GeoPoint>
+void test_forward(GeoPoint const& geo_point1, GeoPoint const& geo_point2,
+ std::string const& parameters, int deviation = 1)
+{
+ typedef typename bg::coordinate_type::type coordinate_type;
+ typedef bg::model::d2::point_xy cartesian_point_type;
+ typedef Projection projection_type;
+
+ // TEMPORARY (will replaced by the internal name of the projection - this is ugly and does not work for Windows or many other compilers)
+ std::string name = typeid(projection_type).name();
+ boost::replace_all(name, "N5boost8geometry11projections", "");
+ boost::replace_all(name, "INS0_5model2ll5pointINS0_6degreeEdNS0_2cs10geographicELm2EEENS3_2d28point_xyIdNS7_9cartesianEEENS1_10parametersEEE", "");
+ boost::replace_all(name, "11", "");
+ boost::replace_all(name, "12", "");
+ boost::replace_all(name, "13", "");
+ boost::replace_all(name, "14", "");
+ boost::replace_all(name, "15", "");
+ boost::replace_all(name, "16", "");
+ boost::replace_all(name, "17", "");
+ boost::replace_all(name, "18", "");
+
+ try
+ {
+ bg::projections::parameters par = bg::projections::detail::pj_init_plus(parameters);
+
+ projection_type prj(par);
+
+ cartesian_point_type xy1, xy2;
+ prj.forward(geo_point1, xy1);
+ prj.forward(geo_point2, xy2);
+
+ // Calculate distances in KM
+ int const distance_expected = static_cast(bg::distance(geo_point1, geo_point2) / 1000.0);
+ int const distance_found = static_cast(bg::distance(xy1, xy2) / 1000.0);
+
+ int const difference = std::abs(distance_expected - distance_found);
+ BOOST_CHECK_MESSAGE(difference <= 1 || difference == deviation,
+ " projection: " << name
+ << " distance found: " << distance_found
+ << " expected: " << distance_expected);
+
+// For debug:
+// std::cout << name << " " << distance_expected
+// << " " << distance_found
+// << " " << (difference > 1 && difference != deviation ? " *** WRONG ***" : "")
+// << " " << difference
+// << std::endl;
+ }
+ catch(bg::projections::proj_exception const& e)
+ {
+ std::cout << "Exception in " << name << " : " << e.code() << std::endl;
+ }
+ catch(...)
+ {
+ std::cout << "Exception (unknown) in " << name << std::endl;
+ }
+}
+
+template
+void test_all()
+{
+ typedef bg::model::ll::point geo_point_type;
+
+ geo_point_type amsterdam = bg::make(4.8925, 52.3731);
+ geo_point_type utrecht = bg::make(5.1213, 52.0907);
+
+ geo_point_type anchorage = bg::make(-149.90, 61.22);
+ geo_point_type juneau = bg::make(-134.42, 58.30);
+
+ geo_point_type auckland = bg::make(174.74, -36.84);
+ geo_point_type wellington = bg::make(177.78, -41.29);
+
+ geo_point_type aspen = bg::make(-106.84, 39.19);
+ geo_point_type denver = bg::make(-104.88, 39.76);
+
+ // IGH (internally using moll/sinu)
+ test_forward(amsterdam, utrecht, "+ellps=sphere +units=m", 5);
+ test_forward(aspen, denver, "+ellps=sphere +units=m", 3);
+ test_forward(auckland, wellington, "+ellps=sphere +units=m", 152);
+ test_forward(anchorage, juneau, "+ellps=sphere +units=m", 28);
+
+ // Using moll
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +o_proj=moll +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +o_proj=moll +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 5);
+ test_forward(aspen, denver, "+ellps=WGS84 +units=m +o_proj=moll +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 19);
+ test_forward(aspen, denver, "+ellps=WGS84 +units=m +o_proj=moll +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 19);
+
+ // Using sinu
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +o_proj=sinu +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +o_proj=sinu +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 4);
+ test_forward(aspen, denver, "+ellps=WGS84 +units=m +o_proj=sinu +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 14);
+ test_forward(aspen, denver, "+ellps=WGS84 +units=m +o_proj=sinu +o_lat_p=10 +o_lon_p=90 +o_lon_o=11.50", 6);
+
+}
+
+int test_main(int, char* [])
+{
+ test_all();
+
+ return 0;
+}
diff --git a/extensions/test/gis/projections/projections_static.cpp b/extensions/test/gis/projections/projections_static.cpp
new file mode 100644
index 000000000..1f7432eb0
--- /dev/null
+++ b/extensions/test/gis/projections/projections_static.cpp
@@ -0,0 +1,385 @@
+// Boost.Geometry (aka GGL, Generic Geometry Library)
+// Unit Test
+
+// Copyright (c) 2015 Barend Gehrels, Amsterdam, the Netherlands.
+
+// 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)
+
+
+#if defined(_MSC_VER)
+#pragma warning( disable : 4305 ) // truncation double -> float
+#endif // defined(_MSC_VER)
+
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+//#include -> in combined
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+//#include -> in combined
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+
+template class Projection, typename GeoPoint>
+void test_forward(GeoPoint const& geo_point1, GeoPoint const& geo_point2,
+ std::string const& parameters, int deviation = 1)
+{
+ typedef typename bg::coordinate_type::type coordinate_type;
+ typedef bg::model::d2::point_xy cartesian_point_type;
+ typedef Projection projection_type;
+
+ // TEMPORARY (will replaced by the internal name of the projection - this is ugly and does not work for Windows or many other compilers)
+ std::string name = typeid(projection_type).name();
+ boost::replace_all(name, "N5boost8geometry11projections", "");
+ boost::replace_all(name, "INS0_5model2ll5pointINS0_6degreeEdNS0_2cs10geographicELm2EEENS3_2d28point_xyIdNS7_9cartesianEEENS1_10parametersEEE", "");
+ boost::replace_all(name, "11", "");
+ boost::replace_all(name, "12", "");
+ boost::replace_all(name, "13", "");
+ boost::replace_all(name, "14", "");
+ boost::replace_all(name, "15", "");
+ boost::replace_all(name, "16", "");
+ boost::replace_all(name, "17", "");
+ boost::replace_all(name, "18", "");
+
+ try
+ {
+ bg::projections::parameters par = bg::projections::detail::pj_init_plus(parameters);
+
+ projection_type prj(par);
+
+ cartesian_point_type xy1, xy2;
+ prj.forward(geo_point1, xy1);
+ prj.forward(geo_point2, xy2);
+
+ // Calculate distances in KM
+ int const distance_expected = static_cast(bg::distance(geo_point1, geo_point2) / 1000.0);
+ int const distance_found = static_cast(bg::distance(xy1, xy2) / 1000.0);
+
+ int const difference = std::abs(distance_expected - distance_found);
+ BOOST_CHECK_MESSAGE(difference <= 1 || difference == deviation,
+ " projection: " << name
+ << " distance found: " << distance_found
+ << " expected: " << distance_expected);
+
+// For debug:
+// std::cout << name << " " << distance_expected
+// << " " << distance_found
+// << " " << (difference > 1 && difference != deviation ? " *** WRONG ***" : "")
+// << " " << difference
+// << std::endl;
+ }
+ catch(bg::projections::proj_exception const& e)
+ {
+ std::cout << "Exception in " << name << " : " << e.code() << std::endl;
+ }
+ catch(...)
+ {
+ std::cout << "Exception (unknown) in " << name << std::endl;
+ }
+}
+
+template
+void test_all()
+{
+ typedef bg::model::ll::point geo_point_type;
+
+ geo_point_type amsterdam = bg::make(4.8925, 52.3731);
+ geo_point_type utrecht = bg::make(5.1213, 52.0907);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=55 +lat_2=65");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lon_0=11d32'00E");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 14);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lon_0=11d32'00E", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 7);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lon_0=11d32'00E", 2);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=50");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=50", 33);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 52);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lon_0=11d32'00E", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lon_0=11d32'00E", 4);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=52 +lon_1=5 +lat_2=30 +lon_2=80 +lat_3=20 +lon_3=-50", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=60 +lat_2=0");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 6);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +h=40000000", 13);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 7);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +m=0.5 +n=1.785");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 50);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n +lon_1=5");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +W=1", 8);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 13);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_0=30n +lat_1=55n +lat_2=60n", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 8);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 3);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lsat=1 +path=1", 3);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 2);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 22);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 22);
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 14);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 3);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n +lon_1=1e +lon_2=30e +m=1 +n=1", 4);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n +lon_1=1e +lon_2=30e");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 9);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m +lat_1=20n +lat_2=60n +lon_0=10E");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 10);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 6);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 5);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 3);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m", 8);
+ test_forward(amsterdam, utrecht, "+ellps=WGS84 +units=m");
+
+ test_forward