Skip to content

Commit cac9341

Browse files
program--hellkite500
authored andcommitted
fix: break out projection wrapper into new component
1 parent d86a61d commit cac9341

File tree

6 files changed

+87
-54
lines changed

6 files changed

+87
-54
lines changed

include/geopackage/proj.hpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#ifndef NGEN_GEOPACKAGE_PROJ_HPP
2+
#define NGEN_GEOPACKAGE_PROJ_HPP
3+
4+
#include <boost/geometry/srs/projection.hpp>
5+
6+
namespace ngen {
7+
namespace srs {
8+
9+
namespace bg = boost::geometry;
10+
11+
struct epsg
12+
{
13+
using srs_type = bg::srs::dpar::parameters<double>;
14+
15+
enum {
16+
wgs84 = 4326,
17+
conus_albers = 5070,
18+
mercator = 3857
19+
};
20+
21+
static srs_type get(uint32_t srid);
22+
23+
private:
24+
static const srs_type epsg5070_;
25+
static const srs_type epsg3857_;
26+
};
27+
28+
} // namespace srs
29+
} // namespace ngen
30+
31+
#endif // NGEN_GEOPACKAGE_PROJ_HPP

include/geopackage/wkb.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ struct wkb {
5454
*/
5555
static geometry read(const boost::span<const uint8_t> buffer);
5656

57-
static bg::srs::dpar::parameters<> get_prj(uint32_t srid);
58-
5957
private:
6058
/**
6159
* Read a WKB point into a cartesian model.

src/geopackage/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ if (NOT _cmp)
99
set_source_files_properties(wkb.cpp PROPERTIES COMPILE_OPTIONS "-O0;-fno-sanitize=all")
1010
endif()
1111

12-
add_library(geopackage geometry.cpp
12+
add_library(geopackage proj.cpp
13+
geometry.cpp
1314
properties.cpp
1415
feature.cpp
1516
read.cpp

src/geopackage/geometry.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "geopackage.hpp"
22
#include "EndianCopy.hpp"
33
#include "wkb.hpp"
4+
#include "proj.hpp"
45

56
geojson::geometry ngen::geopackage::build_geometry(
67
const ngen::sqlite::database::iterator& row,
@@ -26,8 +27,8 @@ geojson::geometry ngen::geopackage::build_geometry(
2627
uint32_t srs_id = 0;
2728
utils::copy_from(geometry_blob, index, srs_id, endian);
2829

29-
const auto epsg = wkb::get_prj(srs_id);
30-
const bg::srs::transformation<> prj{epsg, wkb::get_prj(4326)};
30+
const auto epsg = ngen::srs::epsg::get(srs_id);
31+
const bg::srs::transformation<> prj{epsg, ngen::srs::epsg::get(ngen::srs::epsg::wgs84)};
3132
wkb::wgs84 pvisitor{srs_id, prj};
3233

3334
if (indicator > 0 & indicator < 5) {
@@ -50,7 +51,7 @@ geojson::geometry ngen::geopackage::build_geometry(
5051
geojson::coordinate_t min_prj{};
5152

5253
// project the raw bounding box
53-
if (srs_id == 4326) {
54+
if (srs_id == srs::epsg::wgs84) {
5455
max_prj = geojson::coordinate_t{max.get<0>(), max.get<1>()};
5556
min_prj = geojson::coordinate_t{min.get<0>(), min.get<1>()};
5657
} else {

src/geopackage/proj.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#include "proj.hpp"
2+
#include <boost/geometry/srs/projections/epsg.hpp>
3+
4+
namespace ngen {
5+
namespace srs {
6+
7+
const epsg::srs_type epsg::epsg5070_ =
8+
epsg::srs_type(bg::srs::dpar::proj_aea)
9+
(bg::srs::dpar::ellps_grs80)
10+
(bg::srs::dpar::towgs84, {0,0,0,0,0,0,0})
11+
(bg::srs::dpar::lat_0, 23)
12+
(bg::srs::dpar::lon_0, -96)
13+
(bg::srs::dpar::lat_1, 29.5)
14+
(bg::srs::dpar::lat_2, 45.5)
15+
(bg::srs::dpar::x_0, 0)
16+
(bg::srs::dpar::y_0, 0);
17+
18+
const epsg::srs_type epsg::epsg3857_ =
19+
epsg::srs_type(bg::srs::dpar::proj_merc)
20+
(bg::srs::dpar::units_m)
21+
(bg::srs::dpar::no_defs)
22+
(bg::srs::dpar::a, 6378137)
23+
(bg::srs::dpar::b, 6378137)
24+
(bg::srs::dpar::lat_ts, 0)
25+
(bg::srs::dpar::lon_0, 0)
26+
(bg::srs::dpar::x_0, 0)
27+
(bg::srs::dpar::y_0, 0)
28+
(bg::srs::dpar::k, 1);
29+
30+
auto epsg::get(uint32_t srid) -> srs_type
31+
{
32+
switch (srid) {
33+
case 5070:
34+
return epsg5070_;
35+
case 3857:
36+
return epsg3857_;
37+
default:
38+
return bg::projections::detail::epsg_to_parameters(srid);
39+
}
40+
}
41+
42+
} // namespace srs
43+
} // namespace ngen

src/geopackage/wkb.cpp

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include "wkb.hpp"
2+
#include "proj.hpp"
23

34
namespace ngen {
45
namespace geopackage {
@@ -197,51 +198,9 @@ typename wkb::geometry wkb::read(const boost::span<const uint8_t> buffer)
197198
// WKB Projection Visitor
198199
// ----------------------------------------------------------------------------
199200

200-
bg::srs::dpar::parameters<> wkb::get_prj(uint32_t srid) {
201-
/**
202-
* EPSG 5070 and 3857 projection definitions for use with boost::geometry.
203-
*
204-
* @note these are required because boost 1.72.0 does not
205-
* have an EPSG definition for 5070 or 3857 in boost::srs::epsg.
206-
*/
207-
const static auto epsg5070 = bg::srs::dpar::parameters<>
208-
(bg::srs::dpar::proj_aea)
209-
(bg::srs::dpar::ellps_grs80)
210-
(bg::srs::dpar::towgs84, {0,0,0,0,0,0,0})
211-
(bg::srs::dpar::lat_0, 23)
212-
(bg::srs::dpar::lon_0, -96)
213-
(bg::srs::dpar::lat_1, 29.5)
214-
(bg::srs::dpar::lat_2, 45.5)
215-
(bg::srs::dpar::x_0, 0)
216-
(bg::srs::dpar::y_0, 0);
217-
218-
const static auto epsg3857 = bg::srs::dpar::parameters<>
219-
(bg::srs::dpar::proj_merc)
220-
(bg::srs::dpar::units_m)
221-
(bg::srs::dpar::no_defs)
222-
(bg::srs::dpar::a, 6378137)
223-
(bg::srs::dpar::b, 6378137)
224-
(bg::srs::dpar::lat_ts, 0)
225-
(bg::srs::dpar::lon_0, 0)
226-
(bg::srs::dpar::x_0, 0)
227-
(bg::srs::dpar::y_0, 0)
228-
(bg::srs::dpar::k, 1);
229-
230-
switch(srid) {
231-
case 5070:
232-
return epsg5070;
233-
case 3857:
234-
return epsg3857;
235-
default:
236-
return bg::projections::detail::epsg_to_parameters(srid);
237-
}
238-
}
239-
240-
// ----------------------------------------------------------------------------
241-
242201
geojson::geometry wkb::wgs84::operator()(point_t& g)
243202
{
244-
if (this->srs == 4326) {
203+
if (this->srs == ngen::srs::epsg::wgs84) {
245204
return geojson::coordinate_t(g.get<0>(), g.get<1>());
246205
}
247206

@@ -256,7 +215,7 @@ geojson::geometry wkb::wgs84::operator()(linestring_t& g)
256215
{
257216
geojson::linestring_t h;
258217

259-
if (this->srs == 4326) {
218+
if (this->srs == ngen::srs::epsg::wgs84) {
260219
h.reserve(g.size());
261220
for (auto&& gg : g) {
262221
h.emplace_back(
@@ -276,7 +235,7 @@ geojson::geometry wkb::wgs84::operator()(polygon_t& g)
276235
{
277236
geojson::polygon_t h;
278237

279-
if(this->srs == 4326) {
238+
if(this->srs == ngen::srs::epsg::wgs84) {
280239
h.outer().reserve(g.outer().size());
281240
for (auto&& gg : g.outer()) {
282241
h.outer().emplace_back(
@@ -309,7 +268,7 @@ geojson::geometry wkb::wgs84::operator()(multipoint_t& g)
309268
{
310269
geojson::multipoint_t h;
311270

312-
if (this->srs == 4326) {
271+
if (this->srs == ngen::srs::epsg::wgs84) {
313272
h.reserve(g.size());
314273
for (auto&& gg : g) {
315274
h.emplace_back(
@@ -330,7 +289,7 @@ geojson::geometry wkb::wgs84::operator()(multilinestring_t& g)
330289
{
331290
geojson::multilinestring_t h;
332291

333-
if (this->srs == 4326) {
292+
if (this->srs == ngen::srs::epsg::wgs84) {
334293
h.resize(g.size());
335294
auto&& line_g = g.begin();
336295
auto&& line_h = h.begin();
@@ -352,7 +311,7 @@ geojson::geometry wkb::wgs84::operator()(multipolygon_t& g)
352311
{
353312
geojson::multipolygon_t h;
354313

355-
if (this->srs == 4326) {
314+
if (this->srs == ngen::srs::epsg::wgs84) {
356315
h.resize(g.size());
357316
auto&& polygon_g = g.begin();
358317
auto&& polygon_h = h.begin();

0 commit comments

Comments
 (0)