[osmcoastline] 01/04: Imported Upstream version 2.1.4

Bas Couwenberg sebastic at debian.org
Fri Sep 16 18:49:44 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository osmcoastline.

commit 7db9ecb474a91c7939d54090b58ba65d2da8d025
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Fri Sep 16 20:39:50 2016 +0200

    Imported Upstream version 2.1.4
---
 .travis.yml                       | 144 ++++++++++++++++++++++++++++++++++++++
 .ycm_extra_conf.py                |   5 ++
 CHANGELOG.md                      |  22 ++++--
 CMakeLists.txt                    |  27 +++++--
 README.md                         |   1 +
 src/CMakeLists.txt                |   6 +-
 src/coastline_handlers.hpp        |  17 ++---
 src/coastline_polygons.cpp        |  38 +++++-----
 src/coastline_polygons.hpp        |  15 ++--
 src/coastline_ring.cpp            |  17 +++--
 src/coastline_ring.hpp            |  20 ++++--
 src/coastline_ring_collection.cpp |  59 +++++++++-------
 src/coastline_ring_collection.hpp |  33 +++++----
 src/options.cpp                   |  36 +++++-----
 src/options.hpp                   |   2 +-
 src/osmcoastline.cpp              |  51 +++++++++-----
 src/osmcoastline_filter.cpp       |  40 ++++++-----
 src/osmcoastline_segments.cpp     |  46 +++++++-----
 src/osmcoastline_ways.cpp         |  55 +++++++++------
 src/output_database.cpp           |  28 ++++----
 src/output_database.hpp           |   7 +-
 src/srs.cpp                       |   1 +
 src/srs.hpp                       |   5 +-
 taginfo.json                      |   2 +-
 24 files changed, 466 insertions(+), 211 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..988b9d0
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,144 @@
+#-----------------------------------------------------------------------------
+#
+#  Configuration for continuous integration service at travis-ci.org
+#
+#-----------------------------------------------------------------------------
+
+language: generic
+
+sudo: false
+
+#-----------------------------------------------------------------------------
+
+matrix:
+  include:
+
+    # 1/ Linux Clang Builds
+
+    - os: linux
+      compiler: linux-clang36-release
+      addons:
+        apt:
+          sources: ['llvm-toolchain-precise-3.6', 'ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['clang-3.6', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='clang++-3.6' BUILD_TYPE='Release'
+
+    - os: linux
+      compiler: linux-clang37-dev
+      addons:
+        apt:
+          sources: ['llvm-toolchain-precise-3.6', 'ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['clang-3.6', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='clang++-3.6' BUILD_TYPE='Dev'
+
+
+    - os: linux
+      compiler: linux-clang38-release
+      addons:
+        apt:
+          sources: ['llvm-toolchain-precise-3.8', 'ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['clang-3.8', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='clang++-3.8' BUILD_TYPE='Release'
+
+    - os: linux
+      compiler: linux-clang38-dev
+      addons:
+        apt:
+          sources: ['llvm-toolchain-precise-3.8', 'ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['clang-3.8', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='clang++-3.8' BUILD_TYPE='Dev'
+
+
+    # 2/ Linux GCC Builds
+    - os: linux
+      compiler: linux-gcc48-release
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-4.8', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-4.8' COMPILER_FLAGS='-Wno-return-type' BUILD_TYPE='Release'
+
+    - os: linux
+      compiler: linux-gcc48-dev
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-4.8', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-4.8' COMPILER_FLAGS='-Wno-return-type' BUILD_TYPE='Dev'
+
+
+    - os: linux
+      compiler: linux-gcc49-release
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-4.9', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-4.9' BUILD_TYPE='Release'
+
+    - os: linux
+      compiler: linux-gcc49-dev
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-4.9', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-4.9' BUILD_TYPE='Dev'
+
+
+    - os: linux
+      compiler: linux-gcc5-release
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-5', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-5' BUILD_TYPE='Release'
+
+    - os: linux
+      compiler: linux-gcc5-dev
+      addons:
+        apt:
+          sources: ['ubuntu-toolchain-r-test', 'boost-latest']
+          packages: ['g++-5', 'libboost1.55-all-dev', 'pandoc', 'libgdal1-dev', 'libgeos-dev', 'sqlite3']
+      env: COMPILER='g++-5' BUILD_TYPE='Dev'
+
+
+    # 3/ OSX Clang Builds
+    - os: osx
+      osx_image: xcode6.4
+      compiler: xcode64-clang-release
+      env: COMPILER='clang++' BUILD_TYPE='Release'
+
+    - os: osx
+      osx_image: xcode6.4
+      compiler: xcode64-clang-dev
+      env: COMPILER='clang++' BUILD_TYPE='Dev'
+
+
+    - os: osx
+      osx_image: xcode7
+      compiler: xcode7-clang-release
+      env: COMPILER='clang++' BUILD_TYPE='Release'
+
+    - os: osx
+      osx_image: xcode7
+      compiler: xcode7-clang-dev
+      env: COMPILER='clang++' BUILD_TYPE='Dev'
+
+#-----------------------------------------------------------------------------
+
+install:
+  - git clone --quiet --depth 1 https://github.com/osmcode/libosmium.git ../libosmium
+  - |
+    if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
+      brew install cmake boost || true
+    fi
+  - cmake --version
+
+before_script:
+  - cd ${TRAVIS_BUILD_DIR}
+  - mkdir build && cd build
+  - CXX=${COMPILER} CXXFLAGS=${COMPILER_FLAGS} cmake -LA .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
+
+script:
+  - make VERBOSE=1 && ctest --output-on-failure
+
+#-----------------------------------------------------------------------------
diff --git a/.ycm_extra_conf.py b/.ycm_extra_conf.py
index fdc78cb..5eb37f5 100644
--- a/.ycm_extra_conf.py
+++ b/.ycm_extra_conf.py
@@ -29,6 +29,11 @@ flags = [
 '-x',
 'c++',
 
+# workaround for https://github.com/Valloric/YouCompleteMe/issues/303
+# also see https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800618
+'-isystem',
+'/usr/lib/ycmd/clang_includes/',
+
 '-Iinclude',
 '-I%s/../libosmium/include' % basedir,
 '-I/usr/include/gdal',
diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa6d6ba..eab7245 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,16 +13,27 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 ### Fixed
 
 
+## [2.1.4] - 2016-09-16
+
+### Changed
+
+- Miscellaneous code cleanups.
+
+### Fixed
+
+- Windows build.
+
+
 ## [2.1.3] - 2016-03-30
 
 ### Added
 
-- Add verbose option to osmcoastline_filter.
-- osmcoastline_filter now shows memory used in verbose mode.
+- Add verbose option to `osmcoastline_filter`.
+- `osmcoastline_filter` now shows memory used in verbose mode.
 
 ### Changed
 
-- Optimized osmcoastline_filter program.
+- Optimized `osmcoastline_filter` program.
 - Use more features from newest libosmium.
 
 ### Fixed
@@ -44,7 +55,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 - Updated for newest libosmium version (2.5.2).
 - Uses gdalcpp.hpp from https://github.com/joto/gdalcpp instead of directly
   talking to GDAL/OGR. Makes this compatible with GDAL 2.
-- Improved internal code using unique_ptr where possible.
+- Improved internal code using `unique_ptr` where possible.
 
 ### Fixed
 
@@ -77,7 +88,8 @@ This project adheres to [Semantic Versioning](http://semver.org/).
 - Added man pages
 
 
-[unreleased]: https://github.com/osmcode/osmium-tool/compare/v2.1.3...HEAD
+[unreleased]: https://github.com/osmcode/osmium-tool/compare/v2.1.4...HEAD
+[2.1.4]: https://github.com/osmcode/osmium-tool/compare/v2.1.3...v2.1.4
 [2.1.3]: https://github.com/osmcode/osmium-tool/compare/v2.1.2...v2.1.3
 [2.1.2]: https://github.com/osmcode/osmium-tool/compare/v2.1.1...v2.1.2
 [2.1.1]: https://github.com/osmcode/osmium-tool/compare/v2.1.0...v2.1.1
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e03ecd3..d13a5e1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,8 +9,6 @@
 cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
 
-set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-
 
 #-----------------------------------------------------------------------------
 #
@@ -22,7 +20,7 @@ project(osmcoastline)
 
 set(OSMCOASTLINE_VERSION_MAJOR 2)
 set(OSMCOASTLINE_VERSION_MINOR 1)
-set(OSMCOASTLINE_VERSION_PATCH 3)
+set(OSMCOASTLINE_VERSION_PATCH 4)
 
 set(OSMCOASTLINE_VERSION
     ${OSMCOASTLINE_VERSION_MAJOR}.${OSMCOASTLINE_VERSION_MINOR}.${OSMCOASTLINE_VERSION_PATCH})
@@ -31,6 +29,8 @@ add_definitions(-DOSMCOASTLINE_VERSION="${OSMCOASTLINE_VERSION}")
 
 set(AUTHOR "Jochen Topf <jochen at topf.org>")
 
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
 
 #-----------------------------------------------------------------------------
 #
@@ -48,7 +48,6 @@ if(MSVC)
     find_library(GETOPT_LIBRARY NAMES wingetopt)
     if(GETOPT_INCLUDE_DIR AND GETOPT_LIBRARY)
         include_directories(${GETOPT_INCLUDE_DIR})
-        list(APPEND OSMIUM_LIBRARIES ${GETOPT_LIBRARY})
     else()
         set(GETOPT_MISSING 1)
     endif()
@@ -148,7 +147,7 @@ if(CPPCHECK)
     # cpp doesn't find system includes for some reason, suppress that report
     set(CPPCHECK_OPTIONS ${CPPCHECK_OPTIONS} --suppress=missingIncludeSystem)
 
-    file(GLOB ALL_CODE *.cpp)
+    file(GLOB ALL_CODE src/*.cpp)
 
     set(CPPCHECK_FILES ${ALL_CODE})
 
@@ -165,6 +164,23 @@ endif(CPPCHECK)
 
 #-----------------------------------------------------------------------------
 #
+#  Optional "iwyu" target to check headers
+#  http://include-what-you-use.org/
+#
+#-----------------------------------------------------------------------------
+find_program(IWYU_TOOL iwyu_tool.py)
+
+if(IWYU_TOOL)
+    message(STATUS "Looking for iwyu_tool.py - found")
+    add_custom_target(iwyu ${IWYU_TOOL} -p ${CMAKE_BINARY_DIR})
+else()
+    message(STATUS "Looking for iwyu_tool.py - not found")
+    message(STATUS "  Make target iwyu not available")
+endif()
+
+
+#-----------------------------------------------------------------------------
+#
 #  Optional "man" target to generate man pages
 #
 #-----------------------------------------------------------------------------
@@ -223,6 +239,7 @@ endif(PANDOC)
 #-----------------------------------------------------------------------------
 
 find_library(GEOS_C_LIBRARIES NAMES geos_c)
+include_directories (SYSTEM ${GEOS_C_INCLUDE_DIR})
 
 add_definitions(${OSMIUM_WARNING_OPTIONS})
 
diff --git a/README.md b/README.md
index 081808a..e56b4e1 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@ http://wiki.openstreetmap.org/wiki/OSMCoastline
 
 https://github.com/osmcode/osmcoastline
 
+[![Build Status](https://secure.travis-ci.org/osmcode/osmcoastline.svg)](http://travis-ci.org/osmcode/osmcoastline)
 
 ## Prerequisites
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ce62288..f31d589 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -7,15 +7,15 @@
 #-----------------------------------------------------------------------------
 
 add_executable(osmcoastline osmcoastline.cpp coastline_ring.cpp coastline_ring_collection.cpp coastline_polygons.cpp output_database.cpp srs.cpp options.cpp)
-target_link_libraries(osmcoastline ${OSMIUM_IO_LIBRARIES} ${GDAL_LIBRARIES} ${GEOS_C_LIBRARIES})
+target_link_libraries(osmcoastline ${OSMIUM_IO_LIBRARIES} ${GDAL_LIBRARIES} ${GEOS_C_LIBRARIES} ${GETOPT_LIBRARY})
 install(TARGETS osmcoastline DESTINATION bin)
 
 add_executable(osmcoastline_filter osmcoastline_filter.cpp)
-target_link_libraries(osmcoastline_filter ${OSMIUM_IO_LIBRARIES})
+target_link_libraries(osmcoastline_filter ${OSMIUM_IO_LIBRARIES} ${GETOPT_LIBRARY})
 install(TARGETS osmcoastline_filter DESTINATION bin)
 
 add_executable(osmcoastline_segments osmcoastline_segments.cpp srs.cpp)
-target_link_libraries(osmcoastline_segments ${GDAL_LIBRARIES})
+target_link_libraries(osmcoastline_segments ${GDAL_LIBRARIES} ${GETOPT_LIBRARY})
 install(TARGETS osmcoastline_segments DESTINATION bin)
 
 add_executable(osmcoastline_ways osmcoastline_ways.cpp return_codes.hpp)
diff --git a/src/coastline_handlers.hpp b/src/coastline_handlers.hpp
index 449b2d4..5dc962e 100644
--- a/src/coastline_handlers.hpp
+++ b/src/coastline_handlers.hpp
@@ -42,23 +42,21 @@ class CoastlineHandlerPass1 : public osmium::handler::Handler {
 
 public:
 
-    CoastlineHandlerPass1(CoastlineRingCollection& coastline_rings) :
+    explicit CoastlineHandlerPass1(CoastlineRingCollection& coastline_rings) :
         m_coastline_rings(coastline_rings) {
     }
 
     void way(const osmium::Way& way) {
         // We are only interested in ways tagged with natural=coastline.
-        const char* natural = way.tags().get_value_by_key("natural");
-        if (natural && !strcmp(natural, "coastline")) {
-            const char* bogus = way.tags().get_value_by_key("coastline");
-            if (bogus && !strcmp(bogus, "bogus")) {
+        if (way.tags().has_tag("natural", "coastline")) {
+            if (way.tags().has_tag("coastline", "bogus")) {
                 return; // ignore bogus coastline in Antarctica
             }
             m_coastline_rings.add_way(way);
         }
     }
 
-};
+}; // class CoastlineHandlerPass1
 
 /**
  * Osmium handler for the second pass over the input file in which
@@ -89,11 +87,10 @@ public:
     }
 
     void node(const osmium::Node& node) {
-        const char* natural = node.tags().get_value_by_key("natural");
-        if (natural && !strcmp(natural, "coastline")) {
+        if (node.tags().has_tag("natural", "coastline")) {
             try {
                 m_output.add_error_point(m_factory.create_point(node), "tagged_node", node.id());
-            } catch (osmium::geometry_error&) {
+            } catch (const osmium::geometry_error&) {
                 std::cerr << "Ignoring illegal geometry for node " << node.id() << ".\n";
             }
         }
@@ -104,6 +101,6 @@ public:
         }
     }
 
-};
+}; // class CoastlineHandlerPass2
 
 #endif // COASTLINE_HANDLERS_HPP
diff --git a/src/coastline_polygons.cpp b/src/coastline_polygons.cpp
index 255e7b8..59dce64 100644
--- a/src/coastline_polygons.cpp
+++ b/src/coastline_polygons.cpp
@@ -20,15 +20,15 @@
 */
 
 #include <cassert>
-#include <cmath>
 #include <iostream>
 #include <vector>
 
 #include <ogr_geometry.h>
 
+class OGRSpatialReference;
+
 #include "coastline_polygons.hpp"
 #include "output_database.hpp"
-#include "return_codes.hpp"
 #include "srs.hpp"
 #include "util.hpp"
 
@@ -46,14 +46,14 @@ std::unique_ptr<OGRPolygon> CoastlinePolygons::create_rectangular_polygon(double
     // make sure we are inside the bounds for the output SRS
     e.Intersect(srs.max_extent());
 
-    std::unique_ptr<OGRLinearRing> ring { new OGRLinearRing() };
+    std::unique_ptr<OGRLinearRing> ring{new OGRLinearRing()};
     ring->addPoint(e.MinX, e.MinY);
     ring->addPoint(e.MinX, e.MaxY);
     ring->addPoint(e.MaxX, e.MaxY);
     ring->addPoint(e.MaxX, e.MinY);
     ring->closeRings();
 
-    std::unique_ptr<OGRPolygon> polygon { new OGRPolygon() };
+    std::unique_ptr<OGRPolygon> polygon{new OGRPolygon()};
     polygon->addRingDirectly(ring.release());
     polygon->assignSpatialReference(srs.out());
 
@@ -95,7 +95,7 @@ void CoastlinePolygons::split_geometry(std::unique_ptr<OGRGeometry>&& geom, int
     } else { // wkbMultiPolygon
         const auto mp = static_cast_unique_ptr<OGRMultiPolygon>(std::move(geom));
         while (mp->getNumGeometries() > 0) {
-            std::unique_ptr<OGRPolygon> polygon { static_cast<OGRPolygon*>(mp->getGeometryRef(0)) };
+            std::unique_ptr<OGRPolygon> polygon{static_cast<OGRPolygon*>(mp->getGeometryRef(0))};
             mp->removeGeometry(0, false);
             polygon->assignSpatialReference(srs.out());
             split_polygon(std::move(polygon), level);
@@ -108,7 +108,7 @@ void CoastlinePolygons::split_polygon(std::unique_ptr<OGRPolygon>&& polygon, int
         m_max_split_depth = level;
     }
 
-    int num_points = polygon->getExteriorRing()->getNumPoints();
+    const int num_points = polygon->getExteriorRing()->getNumPoints();
     if (num_points <= m_max_points_in_polygon) {
         // do not split the polygon if it is small enough
         m_polygons.push_back(std::move(polygon));
@@ -139,7 +139,7 @@ void CoastlinePolygons::split_polygon(std::unique_ptr<OGRPolygon>&& polygon, int
             }
 
             // split vertically
-            double MidY = (envelope.MaxY+envelope.MinY) / 2;
+            const double MidY = (envelope.MaxY+envelope.MinY) / 2;
 
             b1 = create_rectangular_polygon(envelope.MinX, envelope.MinY, envelope.MaxX, MidY, m_expand);
             b2 = create_rectangular_polygon(envelope.MinX, MidY, envelope.MaxX, envelope.MaxY, m_expand);
@@ -151,15 +151,15 @@ void CoastlinePolygons::split_polygon(std::unique_ptr<OGRPolygon>&& polygon, int
             }
 
             // split horizontally
-            double MidX = (envelope.MaxX+envelope.MinX) / 2;
+            const double MidX = (envelope.MaxX+envelope.MinX) / 2;
 
             b1 = create_rectangular_polygon(envelope.MinX, envelope.MinY, MidX, envelope.MaxY, m_expand);
             b2 = create_rectangular_polygon(MidX, envelope.MinY, envelope.MaxX, envelope.MaxY, m_expand);
         }
 
         // Use intersection with bbox polygons to split polygon into two halfes
-        std::unique_ptr<OGRGeometry> geom1 { polygon->Intersection(b1.get()) };
-        std::unique_ptr<OGRGeometry> geom2 { polygon->Intersection(b2.get()) };
+        std::unique_ptr<OGRGeometry> geom1{polygon->Intersection(b1.get())};
+        std::unique_ptr<OGRGeometry> geom2{polygon->Intersection(b2.get())};
 
         if (geom1 && (geom1->getGeometryType() == wkbPolygon || geom1->getGeometryType() == wkbMultiPolygon) &&
             geom2 && (geom2->getGeometryType() == wkbPolygon || geom2->getGeometryType() == wkbMultiPolygon)) {
@@ -247,12 +247,12 @@ void CoastlinePolygons::add_line_to_output(std::unique_ptr<OGRLineString> line,
 // Add a coastline ring as LineString to output. Segments in this line that are
 // near the southern edge of the map or near the antimeridian are suppressed.
 void CoastlinePolygons::output_polygon_ring_as_lines(int max_points, const OGRLinearRing* ring) const {
-    int num = ring->getNumPoints();
+    const int num = ring->getNumPoints();
     assert(num > 2);
 
-    std::unique_ptr<OGRPoint> point1 { new OGRPoint };
-    std::unique_ptr<OGRPoint> point2 { new OGRPoint };
-    std::unique_ptr<OGRLineString> line { new OGRLineString };
+    std::unique_ptr<OGRPoint> point1{new OGRPoint};
+    std::unique_ptr<OGRPoint> point2{new OGRPoint};
+    std::unique_ptr<OGRLineString> line{new OGRLineString};
 
     ring->getPoint(0, point1.get());
     for (int i=1; i < num; ++i) {
@@ -262,7 +262,7 @@ void CoastlinePolygons::output_polygon_ring_as_lines(int max_points, const OGRLi
 
         if (line->getNumPoints() >= max_points || !added) {
             if (line->getNumPoints() >= 2) {
-                std::unique_ptr<OGRLineString> new_line { new OGRLineString };
+                std::unique_ptr<OGRLineString> new_line{new OGRLineString};
                 using std::swap;
                 swap(line, new_line);
                 add_line_to_output(std::move(new_line), ring->getSpatialReference());
@@ -333,7 +333,7 @@ void CoastlinePolygons::split_bbox(OGREnvelope e, polygon_vector_type&& v) {
 
         if (e.MaxX - e.MinX < e.MaxY-e.MinY) {
             // split vertically
-            double MidY = (e.MaxY+e.MinY) / 2;
+            const double MidY = (e.MaxY+e.MinY) / 2;
 
             e1.MinX = e.MinX;
             e1.MinY = e.MinY;
@@ -347,7 +347,7 @@ void CoastlinePolygons::split_bbox(OGREnvelope e, polygon_vector_type&& v) {
 
         } else {
             // split horizontally
-            double MidX = (e.MaxX+e.MinX) / 2;
+            const double MidX = (e.MaxX+e.MinX) / 2;
 
             e1.MinX = e.MinX;
             e1.MinY = e.MinY;
@@ -371,8 +371,8 @@ void CoastlinePolygons::split_bbox(OGREnvelope e, polygon_vector_type&& v) {
             OGREnvelope e;
             polygon->getEnvelope(&e);
 
-            bool e1_intersects_e = e1.Intersects(e);
-            bool e2_intersects_e = e2.Intersects(e);
+            const bool e1_intersects_e = e1.Intersects(e);
+            const bool e2_intersects_e = e2.Intersects(e);
 
             if (e1_intersects_e && e2_intersects_e) {
                 v1.emplace_back(static_cast<OGRPolygon*>(polygon->clone()));
diff --git a/src/coastline_polygons.hpp b/src/coastline_polygons.hpp
index 9296248..af97073 100644
--- a/src/coastline_polygons.hpp
+++ b/src/coastline_polygons.hpp
@@ -23,18 +23,15 @@
 */
 
 #include <memory>
+#include <utility>
 #include <vector>
 
-class OGRGeometry;
-class OGRLinearRing;
-class OGRLineString;
-class OGRPoint;
-class OGRPolygon;
-class OGRMultiPolygon;
-class OGREnvelope;
+#include <ogr_geometry.h>
+
+class OGRSpatialReference;
 class OutputDatabase;
 
-typedef std::vector<std::unique_ptr<OGRPolygon>> polygon_vector_type;
+using polygon_vector_type = std::vector<std::unique_ptr<OGRPolygon>>;
 
 /**
  * A collection of land polygons created out of coastlines.
@@ -123,6 +120,6 @@ public:
     /// Write all coastlines to the output database (as lines).
     void output_lines(int max_points) const;
 
-};
+}; // class CoastlinePolygons
 
 #endif // COASTLINE_POLYGONS_HPP
diff --git a/src/coastline_ring.cpp b/src/coastline_ring.cpp
index ef4057f..112c515 100644
--- a/src/coastline_ring.cpp
+++ b/src/coastline_ring.cpp
@@ -19,9 +19,14 @@
 
 */
 
+#include <cassert>
 #include <iostream>
+#include <utility>
+
+#include <ogr_geometry.h>
 
 #include <osmium/geom/ogr.hpp>
+#include <osmium/osm/undirected_segment.hpp>
 
 #include "coastline_ring.hpp"
 
@@ -90,7 +95,7 @@ void CoastlineRing::close_ring() {
 }
 
 void CoastlineRing::close_antarctica_ring(int epsg) {
-    double min = epsg == 4326 ? -90.0 : -85.0511288;
+    const double min = epsg == 4326 ? -90.0 : -85.0511288;
 
     for (int lat = -78; lat > int(min); --lat) {
         m_way_node_list.emplace_back(0, osmium::Location(-179.99999, double(lat)));
@@ -110,7 +115,7 @@ void CoastlineRing::close_antarctica_ring(int epsg) {
 
 std::unique_ptr<OGRPolygon> CoastlineRing::ogr_polygon(osmium::geom::OGRFactory<>& geom_factory, bool reverse) const {
     geom_factory.polygon_start();
-    size_t num_points = 0;
+    std::size_t num_points = 0;
     if (reverse) {
         num_points = geom_factory.fill_polygon(m_way_node_list.crbegin(), m_way_node_list.crend());
     } else {
@@ -121,7 +126,7 @@ std::unique_ptr<OGRPolygon> CoastlineRing::ogr_polygon(osmium::geom::OGRFactory<
 
 std::unique_ptr<OGRLineString> CoastlineRing::ogr_linestring(osmium::geom::OGRFactory<>& geom_factory, bool reverse) const {
     geom_factory.linestring_start();
-    size_t num_points = 0;
+    std::size_t num_points = 0;
     if (reverse) {
         num_points = geom_factory.fill_linestring(m_way_node_list.crbegin(), m_way_node_list.crend());
     } else {
@@ -132,18 +137,18 @@ std::unique_ptr<OGRLineString> CoastlineRing::ogr_linestring(osmium::geom::OGRFa
 
 std::unique_ptr<OGRPoint> CoastlineRing::ogr_first_point() const {
     const osmium::NodeRef& node_ref = m_way_node_list.front();
-    return std::unique_ptr<OGRPoint>(new OGRPoint(node_ref.lon(), node_ref.lat()));
+    return std::unique_ptr<OGRPoint>{new OGRPoint(node_ref.lon(), node_ref.lat())};
 }
 
 std::unique_ptr<OGRPoint> CoastlineRing::ogr_last_point() const {
     const osmium::NodeRef& node_ref = m_way_node_list.back();
-    return std::unique_ptr<OGRPoint>(new OGRPoint(node_ref.lon(), node_ref.lat()));
+    return std::unique_ptr<OGRPoint>{new OGRPoint(node_ref.lon(), node_ref.lat())};
 }
 
 // Pythagoras doesn't work on a round earth but that is ok here, we only need a
 // rough measure anyway
 double CoastlineRing::distance_to_start_position(osmium::Location pos) const {
-    osmium::Location p = m_way_node_list.front().location();
+    const osmium::Location p = m_way_node_list.front().location();
     return (pos.lon() - p.lon()) * (pos.lon() - p.lon()) + (pos.lat() - p.lat()) * (pos.lat() - p.lat());
 }
 
diff --git a/src/coastline_ring.hpp b/src/coastline_ring.hpp
index 48d7c86..3a503a9 100644
--- a/src/coastline_ring.hpp
+++ b/src/coastline_ring.hpp
@@ -22,6 +22,7 @@
 
 */
 
+#include <cassert>
 #include <map>
 #include <memory>
 #include <ostream>
@@ -35,7 +36,7 @@ class OGRPoint;
 class OGRLineString;
 class OGRPolygon;
 
-typedef std::multimap<osmium::object_id_type, osmium::Location*> posmap_type;
+using posmap_type = std::multimap<osmium::object_id_type, osmium::Location*>;
 
 /**
  * The CoastlineRing class models a (possibly unfinished) ring of
@@ -88,7 +89,7 @@ public:
     /**
      * Create CoastlineRing from a way.
      */
-    CoastlineRing(const osmium::Way& way) :
+    explicit CoastlineRing(const osmium::Way& way) :
         m_way_node_list(),
         m_ring_id(way.id()),
         m_nways(1),
@@ -108,26 +109,30 @@ public:
 
     /// ID of first node in the ring.
     osmium::object_id_type first_node_id() const {
+        assert(!m_way_node_list.empty());
         return m_way_node_list.front().ref();
     }
 
     /// ID of last node in the ring.
     osmium::object_id_type last_node_id() const {
+        assert(!m_way_node_list.empty());
         return m_way_node_list.back().ref();
     }
 
     /// Position of the first node in the ring.
     osmium::Location first_position() const {
+        assert(!m_way_node_list.empty());
         return m_way_node_list.front().location();
     }
 
     /// Position of the last node in the ring.
     osmium::Location last_position() const {
+        assert(!m_way_node_list.empty());
         return m_way_node_list.back().location();
     }
 
     /// Return ID of this ring (defined as smallest ID of the ways making up the ring).
-    osmium::object_id_type ring_id() const {
+    osmium::object_id_type ring_id() const noexcept {
         return m_ring_id;
     }
 
@@ -135,14 +140,14 @@ public:
      * Set ring ID. The ring will only get the new ID if it is smaller than the
      * old one.
      */
-    void update_ring_id(osmium::object_id_type new_id) {
+    void update_ring_id(osmium::object_id_type new_id) noexcept {
         if (new_id < m_ring_id) {
             m_ring_id = new_id;
         }
     }
 
     /// Returns the number of ways making up this ring.
-    unsigned int nways() const {
+    unsigned int nways() const noexcept {
         return m_nways;
     }
 
@@ -157,7 +162,7 @@ public:
     }
 
     /// Was this ring fixed because of missing/wrong OSM data?
-    bool is_fixed() const {
+    bool is_fixed() const noexcept {
         return m_fixed;
     }
 
@@ -170,6 +175,7 @@ public:
      * method does this.
      */
     void fake_close() {
+        assert(!m_way_node_list.empty());
         m_way_node_list.back().set_ref(first_node_id());
     }
 
@@ -258,7 +264,7 @@ public:
 
     friend std::ostream& operator<<(std::ostream& out, const CoastlineRing& cp);
 
-};
+}; // class CoastlineRing
 
 inline bool operator<(const CoastlineRing& lhs, const CoastlineRing& rhs) {
     return lhs.first_position() < rhs.first_position();
diff --git a/src/coastline_ring_collection.cpp b/src/coastline_ring_collection.cpp
index 56b0c43..b498c27 100644
--- a/src/coastline_ring_collection.cpp
+++ b/src/coastline_ring_collection.cpp
@@ -29,6 +29,12 @@
 #include "output_database.hpp"
 #include "srs.hpp"
 
+#ifdef _MSC_VER
+#include <io.h>
+#include <BaseTsd.h>
+typedef SSIZE_T ssize_t;
+#endif
+
 extern SRS srs;
 extern bool debug;
 
@@ -77,7 +83,7 @@ void CoastlineRingCollection::add_partial_ring(const osmium::Way& way) {
         // way at the front. This means that the way together with the
         // ring at front and the ring at back are now a complete ring.
         if (mnext != m_start_nodes.end()) {
-            coastline_rings_list_t::iterator next = mnext->second;
+            auto next = mnext->second;
             (*prev)->join(**next);
             m_start_nodes.erase(mnext);
             if ((*prev)->is_closed()) {
@@ -99,7 +105,7 @@ void CoastlineRingCollection::add_partial_ring(const osmium::Way& way) {
 
     // We found a CoastlineRing where we can add the way at the front.
     if (mnext != m_start_nodes.end()) {
-        coastline_rings_list_t::iterator next = mnext->second;
+        auto next = mnext->second;
         (*next)->add_at_front(way);
         m_start_nodes.erase(mnext);
         if ((*next)->is_closed()) {
@@ -145,7 +151,7 @@ std::vector<OGRGeometry*> CoastlineRingCollection::add_polygons_to_vector() {
                 p->assignSpatialReference(srs.wgs84());
                 vector.push_back(p.release());
             } else {
-                std::unique_ptr<OGRGeometry> geom { p->Buffer(0) };
+                std::unique_ptr<OGRGeometry> geom{p->Buffer(0)};
                 if (is_valid_polygon(geom.get())) {
                     geom->assignSpatialReference(srs.wgs84());
                     vector.push_back(geom.release());
@@ -194,21 +200,21 @@ osmium::Location intersection(const osmium::Segment& s1, const osmium::Segment&s
         return osmium::Location();
     }
 
-    double denom = ((s2.second().lat() - s2.first().lat())*(s1.second().lon() - s1.first().lon())) -
+    const double denom = ((s2.second().lat() - s2.first().lat())*(s1.second().lon() - s1.first().lon())) -
                    ((s2.second().lon() - s2.first().lon())*(s1.second().lat() - s1.first().lat()));
 
     if (denom != 0) {
-        double nume_a = ((s2.second().lon() - s2.first().lon())*(s1.first().lat() - s2.first().lat())) -
-                        ((s2.second().lat() - s2.first().lat())*(s1.first().lon() - s2.first().lon()));
+        const double nume_a = ((s2.second().lon() - s2.first().lon())*(s1.first().lat() - s2.first().lat())) -
+                              ((s2.second().lat() - s2.first().lat())*(s1.first().lon() - s2.first().lon()));
 
-        double nume_b = ((s1.second().lon() - s1.first().lon())*(s1.first().lat() - s2.first().lat())) -
-                        ((s1.second().lat() - s1.first().lat())*(s1.first().lon() - s2.first().lon()));
+        const double nume_b = ((s1.second().lon() - s1.first().lon())*(s1.first().lat() - s2.first().lat())) -
+                              ((s1.second().lat() - s1.first().lat())*(s1.first().lon() - s2.first().lon()));
 
         if ((denom > 0 && nume_a >= 0 && nume_a <= denom && nume_b >= 0 && nume_b <= denom) ||
             (denom < 0 && nume_a <= 0 && nume_a >= denom && nume_b <= 0 && nume_b >= denom)) {
-            double ua = nume_a / denom;
-            double ix = s1.first().lon() + ua*(s1.second().lon() - s1.first().lon());
-            double iy = s1.first().lat() + ua*(s1.second().lat() - s1.first().lat());
+            const double ua = nume_a / denom;
+            const double ix = s1.first().lon() + ua*(s1.second().lon() - s1.first().lon());
+            const double iy = s1.first().lat() + ua*(s1.second().lat() - s1.first().lat());
             return osmium::Location(ix, iy);
         }
     }
@@ -224,10 +230,10 @@ bool outside_x_range(const osmium::UndirectedSegment& s1, const osmium::Undirect
 }
 
 bool y_range_overlap(const osmium::UndirectedSegment& s1, const osmium::UndirectedSegment& s2) {
-    int tmin = s1.first().y() < s1.second().y() ? s1.first().y( ) : s1.second().y();
-    int tmax = s1.first().y() < s1.second().y() ? s1.second().y() : s1.first().y();
-    int omin = s2.first().y() < s2.second().y() ? s2.first().y()  : s2.second().y();
-    int omax = s2.first().y() < s2.second().y() ? s2.second().y() : s2.first().y();
+    const int tmin = s1.first().y() < s1.second().y() ? s1.first().y( ) : s1.second().y();
+    const int tmax = s1.first().y() < s1.second().y() ? s1.second().y() : s1.first().y();
+    const int omin = s2.first().y() < s2.second().y() ? s2.first().y()  : s2.second().y();
+    const int omax = s2.first().y() < s2.second().y() ? s2.second().y() : s2.first().y();
     if (tmin > omax || omin > tmax) {
         return false;
     }
@@ -235,7 +241,7 @@ bool y_range_overlap(const osmium::UndirectedSegment& s1, const osmium::Undirect
 }
 
 std::unique_ptr<OGRLineString> create_ogr_linestring(const osmium::Segment& segment) {
-    std::unique_ptr<OGRLineString> line { new OGRLineString };
+    std::unique_ptr<OGRLineString> line{new OGRLineString};
     line->setNumPoints(2);
     line->setPoint(0, segment.first().lon(), segment.first().lat());
     line->setPoint(1, segment.second().lon(), segment.second().lat());
@@ -263,8 +269,12 @@ unsigned int CoastlineRingCollection::check_for_intersections(OutputDatabase& ou
     if (segments_fd >= 0) {
         if (debug) std::cerr << "Writing segments to file...\n";
         ssize_t length = segments.size() * sizeof(osmium::UndirectedSegment);
+#ifndef _MSC_VER
         if (::write(segments_fd, segments.data(), length) != length) {
-            throw std::runtime_error("Write error");
+#else
+        if (_write(segments_fd, segments.data(), length) != length) {
+#endif
+            throw std::runtime_error{"Write error"};
         }
     }
 
@@ -293,7 +303,7 @@ unsigned int CoastlineRingCollection::check_for_intersections(OutputDatabase& ou
     }
 
     for (const auto& intersection : intersections) {
-        std::unique_ptr<OGRPoint> point { new OGRPoint(intersection.lon(), intersection.lat()) };
+        std::unique_ptr<OGRPoint> point{new OGRPoint(intersection.lon(), intersection.lat())};
         output.add_error_point(std::move(point), "intersection");
     }
 
@@ -302,8 +312,8 @@ unsigned int CoastlineRingCollection::check_for_intersections(OutputDatabase& ou
 
 bool CoastlineRingCollection::close_antarctica_ring(int epsg) {
     for (const auto& ring : m_list) {
-        osmium::Location fpos = ring->first_position();
-        osmium::Location lpos = ring->last_position();
+        const osmium::Location fpos = ring->first_position();
+        const osmium::Location lpos = ring->last_position();
         if (fpos.lon() > 179.99 && lpos.lon() < -179.99 &&
             fpos.lat() <  -77.0 && fpos.lat() >  -78.0 &&
             lpos.lat() <  -77.0 && lpos.lat() >  -78.0) {
@@ -323,7 +333,7 @@ void CoastlineRingCollection::close_rings(OutputDatabase& output, bool debug, do
     // Create vector with all possible combinations of connections between rings.
     for (idmap_type::iterator eit = m_end_nodes.begin(); eit != m_end_nodes.end(); ++eit) {
         for (idmap_type::iterator sit = m_start_nodes.begin(); sit != m_start_nodes.end(); ++sit) {
-            double distance = (*sit->second)->distance_to_start_position((*eit->second)->last_position());
+            const double distance = (*sit->second)->distance_to_start_position((*eit->second)->last_position());
             if (distance < max_distance) {
                 connections.emplace_back(distance, eit->first, sit->first);
             }
@@ -359,7 +369,7 @@ void CoastlineRingCollection::close_rings(OutputDatabase& output, bool debug, do
             output.add_error_point(s->ogr_first_point(), "fixed_end_point", s->first_node_id());
 
             if (e->last_position() != s->first_position()) {
-                std::unique_ptr<OGRLineString> linestring { new OGRLineString };
+                std::unique_ptr<OGRLineString> linestring{new OGRLineString};
                 linestring->addPoint(e->last_position().lon(), e->last_position().lat());
                 linestring->addPoint(s->first_position().lon(), s->first_position().lat());
                 output.add_error_line(std::move(linestring), "added_line");
@@ -406,8 +416,7 @@ unsigned int CoastlineRingCollection::output_questionable(const CoastlinePolygon
     const unsigned int max_nodes_to_be_considered_questionable = 10000;
     unsigned int warnings = 0;
 
-    typedef std::pair<osmium::Location, CoastlineRing*> pos_ring_ptr_t;
-    std::vector<pos_ring_ptr_t> rings;
+    std::vector<std::pair<osmium::Location, CoastlineRing*>> rings;
     rings.reserve(m_list.size());
 
     // put all rings in a vector...
@@ -422,7 +431,7 @@ unsigned int CoastlineRingCollection::output_questionable(const CoastlinePolygon
     for (const auto& polygon : polygons) {
         const OGRLinearRing* exterior_ring = polygon->getExteriorRing();
         osmium::Location pos(exterior_ring->getX(0), exterior_ring->getY(0));
-        std::vector<pos_ring_ptr_t>::iterator rings_it = lower_bound(rings.begin(), rings.end(), std::make_pair<osmium::Location, CoastlineRing*>(std::move(pos), nullptr));
+        auto rings_it = lower_bound(rings.begin(), rings.end(), std::make_pair<osmium::Location, CoastlineRing*>(std::move(pos), nullptr));
         if (rings_it != rings.end()) {
             rings_it->second->set_outer();
         }
diff --git a/src/coastline_ring_collection.hpp b/src/coastline_ring_collection.hpp
index bef8eb1..9feb640 100644
--- a/src/coastline_ring_collection.hpp
+++ b/src/coastline_ring_collection.hpp
@@ -22,6 +22,7 @@
 
 */
 
+#include <cstddef>
 #include <list>
 #include <map>
 #include <memory>
@@ -29,16 +30,16 @@
 
 #include <osmium/geom/ogr.hpp>
 #include <osmium/osm/way.hpp>
+#include <osmium/osm/types.hpp>
 
 #include "coastline_ring.hpp"
 
 class OGRGeometry;
-class OGRPolygon;
 class OutputDatabase;
 class CoastlinePolygons;
 
-typedef std::list<std::shared_ptr<CoastlineRing>> coastline_rings_list_t;
-typedef std::map<osmium::object_id_type, coastline_rings_list_t::iterator> idmap_type;
+using coastline_rings_list_t = std::list<std::shared_ptr<CoastlineRing>>;
+using idmap_type = std::map<osmium::object_id_type, coastline_rings_list_t::iterator>;
 
 /**
  * A collection of CoastlineRing objects. Keeps a list of all start and end
@@ -62,12 +63,12 @@ class CoastlineRingCollection {
 
 public:
 
-    typedef coastline_rings_list_t::const_iterator const_iterator;
+    using const_iterator = coastline_rings_list_t::const_iterator;
 
     CoastlineRingCollection();
 
     /// Return the number of CoastlineRings in the collection.
-    size_t size() const {
+    std::size_t size() const noexcept {
         return m_list.size();
     }
 
@@ -85,19 +86,19 @@ public:
         }
     }
 
-    unsigned int num_ways() const {
+    unsigned int num_ways() const noexcept {
         return m_ways;
     }
 
-    unsigned int num_rings_from_single_way() const {
+    unsigned int num_rings_from_single_way() const noexcept {
         return m_rings_from_single_way;
     }
 
-    unsigned int num_unconnected_nodes() const {
+    unsigned int num_unconnected_nodes() const noexcept {
         return m_start_nodes.size() + m_end_nodes.size();
     }
 
-    unsigned int num_fixed_rings() const {
+    unsigned int num_fixed_rings() const noexcept {
         return m_fixed_rings;
     }
 
@@ -125,23 +126,27 @@ private:
         osmium::object_id_type start_id;
         osmium::object_id_type end_id;
 
-        Connection(double d, osmium::object_id_type s, osmium::object_id_type e) : distance(d), start_id(s), end_id(e) { }
+        Connection(double d, osmium::object_id_type s, osmium::object_id_type e) :
+            distance(d),
+            start_id(s),
+            end_id(e) {
+        }
 
         /**
         * Returns true if start or end ID of this connection is the same as the
         * other connections start or end ID. Used as predicate in std::remove_if().
         */
-        bool operator()(const Connection& other) {
+        bool operator()(const Connection& other) const noexcept {
             return start_id == other.start_id || end_id == other.end_id;
         }
 
         // Used in std::sort
-        static bool sort_by_distance(const Connection& a, const Connection& b) {
+        static bool sort_by_distance(const Connection& a, const Connection& b) noexcept {
             return a.distance > b.distance;
         }
 
-    };
+    }; // struct Connection
 
-};
+}; // class CoastlineRingCollection
 
 #endif // COASTLINE_RING_COLLECTION_HPP
diff --git a/src/options.cpp b/src/options.cpp
index fd51edd..a88ba29 100644
--- a/src/options.cpp
+++ b/src/options.cpp
@@ -28,6 +28,10 @@
 #include "return_codes.hpp"
 #include "options.hpp"
 
+#ifdef _MSC_VER
+#define strcasecmp _stricmp
+#endif
+
 Options::Options(int argc, char* argv[]) :
     inputfile(),
     bbox_overlap(-1),
@@ -90,7 +94,7 @@ Options::Options(int argc, char* argv[]) :
                 break;
             case 'h':
                 print_help();
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             case 'l':
                 output_lines = true;
                 break;
@@ -101,17 +105,17 @@ Options::Options(int argc, char* argv[]) :
                 }
                 break;
             case 'p':
-                if (!strcmp(optarg, "none")) {
+                if (!std::strcmp(optarg, "none")) {
                     output_polygons = output_polygon_type::none;
-                } else if (!strcmp(optarg, "land")) {
+                } else if (!std::strcmp(optarg, "land")) {
                     output_polygons = output_polygon_type::land;
-                } else if (!strcmp(optarg, "water")) {
+                } else if (!std::strcmp(optarg, "water")) {
                     output_polygons = output_polygon_type::water;
-                } else if (!strcmp(optarg, "both")) {
+                } else if (!std::strcmp(optarg, "both")) {
                     output_polygons = output_polygon_type::both;
                 } else {
                     std::cerr << "Unknown argument '" << optarg << "' for -p/--output-polygon option\n";
-                    exit(return_code_cmdline);
+                    std::exit(return_code_cmdline);
                 }
                 break;
             case 'o':
@@ -138,25 +142,25 @@ Options::Options(int argc, char* argv[]) :
                           << "License: GNU GENERAL PUBLIC LICENSE Version 3 <http://gnu.org/licenses/gpl.html>.\n"
                           << "This is free software: you are free to change and redistribute it.\n"
                           << "There is NO WARRANTY, to the extent permitted by law.\n";
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             default:
-                exit(return_code_cmdline);
+                std::exit(return_code_cmdline);
         }
     }
 
     if (!split_large_polygons && (output_polygons == output_polygon_type::water || output_polygons == output_polygon_type::both)) {
         std::cerr << "Can not use -m/--max-points=0 when writing out water polygons\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     if (optind != argc - 1) {
         std::cerr << "Usage: " << argv[0] << " [OPTIONS] OSMFILE\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     if (output_database.empty()) {
         std::cerr << "Missing --output-database/-o option.\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     if (bbox_overlap == -1) {
@@ -171,18 +175,18 @@ Options::Options(int argc, char* argv[]) :
 }
 
 int Options::get_epsg(const char* text) {
-    if (!strcasecmp(text, "WGS84") || !strcmp(text, "4326")) {
+    if (!strcasecmp(text, "WGS84") || !std::strcmp(text, "4326")) {
         return 4326;
     }
-    if (!strcmp(text, "3857")) {
+    if (!std::strcmp(text, "3857")) {
         return 3857;
     }
-    if (!strcmp(text, "3785") || !strcmp(text, "900913")) {
+    if (!std::strcmp(text, "3785") || !std::strcmp(text, "900913")) {
         std::cerr << "Please use code 3857 for the 'Google Mercator' projection!\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
     std::cerr << "Unknown SRS '" << text << "'. Currently only 4326 (WGS84) and 3857 ('Google Mercator') are supported.\n";
-    exit(return_code_cmdline);
+    std::exit(return_code_cmdline);
 }
 
 void Options::print_help() const {
diff --git a/src/options.hpp b/src/options.hpp
index 57e04dc..ada53af 100644
--- a/src/options.hpp
+++ b/src/options.hpp
@@ -108,6 +108,6 @@ private:
 
     void print_help() const;
 
-};
+}; // class Options
 
 #endif // OPTIONS_HPP
diff --git a/src/osmcoastline.cpp b/src/osmcoastline.cpp
index 1ede948..f291983 100644
--- a/src/osmcoastline.cpp
+++ b/src/osmcoastline.cpp
@@ -19,18 +19,35 @@
 
 */
 
-#include <fstream>
-#include <list>
-#include <time.h>
-#include <unistd.h>
+#include <cassert>
+#include <cerrno>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <memory>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+#include <utility>
+#include <vector>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#else
+# include <io.h>
+#endif
+
+#include <ogr_core.h>
+#include <ogr_geometry.h>
 
 #include <osmium/io/any_input.hpp>
+#include <osmium/io/file.hpp>
+#include <osmium/osm/entity_bits.hpp>
 #include <osmium/util/memory.hpp>
 #include <osmium/util/verbose_output.hpp>
 #include <osmium/visitor.hpp>
 
 #include "return_codes.hpp"
-#include "coastline_ring.hpp"
 #include "coastline_ring_collection.hpp"
 #include "coastline_polygons.hpp"
 #include "output_database.hpp"
@@ -70,7 +87,7 @@ polygon_vector_type create_polygons(CoastlineRingCollection& coastline_rings, Ou
     }
 
     if (mega_geometry->getGeometryType() != wkbMultiPolygon) {
-        throw std::runtime_error("mega geometry isn't a multipolygon. Something is very wrong!");
+        throw std::runtime_error{"mega geometry isn't a multipolygon. Something is very wrong!"};
     }
     OGRMultiPolygon* mega_multipolygon = static_cast<OGRMultiPolygon*>(mega_geometry.release());
 
@@ -79,7 +96,7 @@ polygon_vector_type create_polygons(CoastlineRingCollection& coastline_rings, Ou
     for (int i=0; i < mega_multipolygon->getNumGeometries(); ++i) {
         OGRGeometry* geom = mega_multipolygon->getGeometryRef(i);
         assert(geom->getGeometryType() == wkbPolygon);
-        std::unique_ptr<OGRPolygon> p { static_cast<OGRPolygon*>(geom) };
+        std::unique_ptr<OGRPolygon> p{static_cast<OGRPolygon*>(geom)};
         if (p->IsValid()) {
             polygons.push_back(std::move(p));
         } else {
@@ -134,7 +151,7 @@ int main(int argc, char *argv[]) {
     vout << "Using SRS " << options.epsg << " for output. (Change with the --srs/s option.)\n";
     if (!srs.set_output(options.epsg)) {
         std::cerr << "Setting up output transformation failed\n";
-        exit(return_code_fatal);
+        std::exit(return_code_fatal);
     }
 
     // Optionally set up segments file
@@ -143,8 +160,8 @@ int main(int argc, char *argv[]) {
         vout << "Writing segments to file '" << options.segmentfile << "' (because you told me to with --write-segments/-S option).\n";
         segments_fd = ::open(options.segmentfile.c_str(), O_WRONLY | O_CREAT, 0666);
         if (segments_fd == -1) {
-            std::cerr << "Couldn't open file '" << options.segmentfile << "' (" << strerror(errno) << ")\n";
-            exit(return_code_fatal);
+            std::cerr << "Couldn't open file '" << options.segmentfile << "' (" << std::strerror(errno) << ")\n";
+            std::exit(return_code_fatal);
         }
     }
 
@@ -159,7 +176,7 @@ int main(int argc, char *argv[]) {
     } else {
         vout << "Will NOT create geometry index (because you told me to using --no-index/-i).\n";
     }
-    OutputDatabase output_database(options.output_database, srs, options.create_index);
+    OutputDatabase output_database{options.output_database, srs, options.create_index};
 
     // The collection of all coastline rings we will be filling and then
     // operating on.
@@ -169,11 +186,11 @@ int main(int argc, char *argv[]) {
         // This is in an extra scope so that the considerable amounts of memory
         // held by the handlers is recovered after we don't need them any more.
         vout << "Reading from file '" << options.inputfile << "'.\n";
-        osmium::io::File infile(options.inputfile);
+        osmium::io::File infile{options.inputfile};
 
         vout << "Reading ways (1st pass through input file)...\n";
-        CoastlineHandlerPass1 handler_pass1(coastline_rings);
-        osmium::io::Reader reader1(infile, osmium::osm_entity_bits::way);
+        CoastlineHandlerPass1 handler_pass1{coastline_rings};
+        osmium::io::Reader reader1{infile, osmium::osm_entity_bits::way};
         osmium::apply(reader1, handler_pass1);
         reader1.close();
         stats.ways = coastline_rings.num_ways();
@@ -187,8 +204,8 @@ int main(int argc, char *argv[]) {
         vout << memory_usage();
 
         vout << "Reading nodes (2nd pass through input file)...\n";
-        CoastlineHandlerPass2 handler_pass2(coastline_rings, output_database);
-        osmium::io::Reader reader2(infile, osmium::osm_entity_bits::node);
+        CoastlineHandlerPass2 handler_pass2{coastline_rings, output_database};
+        osmium::io::Reader reader2{infile, osmium::osm_entity_bits::node};
         osmium::apply(reader2, handler_pass2);
         reader2.close();
     }
@@ -197,7 +214,7 @@ int main(int argc, char *argv[]) {
     unsigned int missing_positions = coastline_rings.check_positions(options.debug);
     if (missing_positions) {
         vout << "  There are " << missing_positions << " positions missing. Check that input file contains all nodes needed.\n";
-        exit(return_code_error);
+        std::exit(return_code_error);
     } else {
         vout << "  All positions are there.\n";
     }
diff --git a/src/osmcoastline_filter.cpp b/src/osmcoastline_filter.cpp
index 1700769..a7d1d48 100644
--- a/src/osmcoastline_filter.cpp
+++ b/src/osmcoastline_filter.cpp
@@ -20,17 +20,25 @@
 */
 
 #include <algorithm>
+#include <cstdlib>
+#include <cstring>
 #include <getopt.h>
 #include <iostream>
 #include <string>
 #include <vector>
 
 #include <osmium/io/any_input.hpp>
+#include <osmium/io/error.hpp>
+#include <osmium/io/file.hpp>
+#include <osmium/io/header.hpp>
 #include <osmium/io/input_iterator.hpp>
 #include <osmium/io/output_iterator.hpp>
 #include <osmium/io/pbf_output.hpp>
-#include <osmium/handler.hpp>
+#include <osmium/osm.hpp>
+#include <osmium/osm/box.hpp>
 #include <osmium/osm/entity_bits.hpp>
+#include <osmium/osm/node_ref.hpp>
+#include <osmium/osm/types.hpp>
 #include <osmium/util/memory.hpp>
 #include <osmium/util/verbose_output.hpp>
 
@@ -66,7 +74,7 @@ int main(int argc, char* argv[]) {
         switch (c) {
             case 'h':
                 print_help();
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             case 'o':
                 output_filename = optarg;
                 break;
@@ -79,9 +87,9 @@ int main(int argc, char* argv[]) {
                           << "License: GNU GENERAL PUBLIC LICENSE Version 3 <http://gnu.org/licenses/gpl.html>.\n"
                           << "This is free software: you are free to change and redistribute it.\n"
                           << "There is NO WARRANTY, to the extent permitted by law.\n";
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             default:
-                exit(return_code_fatal);
+                std::exit(return_code_fatal);
         }
     }
 
@@ -92,33 +100,32 @@ int main(int argc, char* argv[]) {
 
     if (output_filename.empty()) {
         std::cerr << "Missing -o/--output=OSMFILE option\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     if (optind != argc - 1) {
         std::cerr << "Usage: osmcoastline_filter [OPTIONS] OSMFILE\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     osmium::io::Header header;
     header.set("generator", "osmcoastline_filter");
-    header.add_box(osmium::Box(-180.0, -90.0, 180.0, 90.0));
+    header.add_box(osmium::Box{-180.0, -90.0, 180.0, 90.0});
 
-    osmium::io::File infile(argv[optind]);
+    osmium::io::File infile{argv[optind]};
 
     try {
-        osmium::io::Writer writer(output_filename, header);
+        osmium::io::Writer writer{output_filename, header};
         auto output_it = osmium::io::make_output_iterator(writer);
 
         std::vector<osmium::object_id_type> ids;
 
         vout << "Reading ways (1st pass through input file)...\n";
         {
-            osmium::io::Reader reader(infile, osmium::osm_entity_bits::way);
+            osmium::io::Reader reader{infile, osmium::osm_entity_bits::way};
             auto ways = osmium::io::make_input_iterator_range<const osmium::Way>(reader);
             for (const osmium::Way& way : ways) {
-                const char* natural = way.get_value_by_key("natural");
-                if (natural && !strcmp(natural, "coastline")) {
+                if (way.tags().has_tag("natural", "coastline")) {
                     *output_it++ = way;
                     for (const auto& nr : way.nodes()) {
                         ids.push_back(nr.ref());
@@ -134,7 +141,7 @@ int main(int argc, char* argv[]) {
 
         vout << "Reading nodes (2nd pass through input file)...\n";
         {
-            osmium::io::Reader reader(infile, osmium::osm_entity_bits::node);
+            osmium::io::Reader reader{infile, osmium::osm_entity_bits::node};
             auto nodes = osmium::io::make_input_iterator_range<const osmium::Node>(reader);
 
             auto first = ids.begin();
@@ -150,17 +157,16 @@ int main(int argc, char* argv[]) {
                     return true;
                 }
 
-                const char* natural = node.get_value_by_key("natural");
-                return natural && !strcmp(natural, "coastline");
+                return node.tags().has_tag("natural", "coastline");
             });
 
             reader.close();
         }
 
         writer.close();
-    } catch (osmium::io_error& e) {
+    } catch (const osmium::io_error& e) {
         std::cerr << "io error: " << e.what() << "'\n";
-        exit(return_code_fatal);
+        std::exit(return_code_fatal);
     }
 
     vout << "All done.\n";
diff --git a/src/osmcoastline_segments.cpp b/src/osmcoastline_segments.cpp
index 9dd74c5..36522aa 100644
--- a/src/osmcoastline_segments.cpp
+++ b/src/osmcoastline_segments.cpp
@@ -20,17 +20,25 @@
 */
 
 #include <algorithm>
-#include <cassert>
+#include <cerrno>
+#include <cstdlib>
 #include <fcntl.h>
 #include <getopt.h>
 #include <iostream>
+#include <iterator>
 #include <memory>
+#include <stdexcept>
 #include <string>
 #include <system_error>
-#include <sys/mman.h>
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <unistd.h>
+#include <vector>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#else
+# include <io.h>
+#endif
 
 #include <osmium/osm/undirected_segment.hpp>
 #include <osmium/util/memory_mapping.hpp>
@@ -39,7 +47,7 @@
 
 #include "return_codes.hpp"
 
-typedef std::vector<osmium::UndirectedSegment> segvec;
+using segvec = std::vector<osmium::UndirectedSegment>;
 
 class InputFile {
 
@@ -48,11 +56,11 @@ class InputFile {
 
 public:
 
-    InputFile(const std::string& filename) :
+    explicit InputFile(const std::string& filename) :
         m_filename(filename),
         m_fd(::open(filename.c_str(), O_RDONLY)) {
         if (m_fd == -1) {
-            throw std::system_error(errno, std::system_category(), std::string("Opening '") + filename + "' failed");
+            throw std::system_error{errno, std::system_category(), std::string{"Opening '"} + filename + "' failed"};
         }
     }
 
@@ -60,12 +68,12 @@ public:
         return m_fd;
     }
 
-    size_t size() const {
+    std::size_t size() const {
         struct stat s;
         if (::fstat(m_fd, &s) != 0) {
-            throw std::system_error(errno, std::system_category(), std::string("Can't get file size for '") + m_filename + "'");
+            throw std::system_error{errno, std::system_category(), std::string{"Can't get file size for '"} + m_filename + "'"};
         }
-        return size_t(s.st_size);
+        return std::size_t(s.st_size);
     }
 
 }; // class InputFile
@@ -74,7 +82,7 @@ void print_help() {
 }
 
 void add_segment(gdalcpp::Layer& layer, int change, const osmium::UndirectedSegment& segment) {
-    auto linestring = std::unique_ptr<OGRLineString>(new OGRLineString());
+    auto linestring = std::unique_ptr<OGRLineString>{new OGRLineString()};
     linestring->addPoint(segment.first().lon(), segment.first().lat());
     linestring->addPoint(segment.second().lon(), segment.second().lat());
 
@@ -133,7 +141,7 @@ int main(int argc, char *argv[]) {
             case 'h': {
                 std::cout << "Usage: " << argv[0] << " [OPTIONS] SEGFILE1 SEGFILE2\n";
                 print_help();
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             }
             case 'V':
                 std::cout << "osmcoastline_segments version " OSMCOASTLINE_VERSION "\n"
@@ -141,7 +149,7 @@ int main(int argc, char *argv[]) {
                           << "License: GNU GENERAL PUBLIC LICENSE Version 3 <http://gnu.org/licenses/gpl.html>.\n"
                           << "This is free software: you are free to change and redistribute it.\n"
                           << "There is NO WARRANTY, to the extent permitted by law.\n";
-                exit(return_code_ok);
+                std::exit(return_code_ok);
             default:
                 break;
         }
@@ -149,24 +157,24 @@ int main(int argc, char *argv[]) {
 
     if (optind != argc - 2) {
         std::cerr << "Usage: " << argv[0] << " [OPTIONS] SEGFILE1 SEGFILE2\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     segvec removed_segments;
     segvec added_segments;
 
     try {
-        InputFile file1(argv[optind]);
-        InputFile file2(argv[optind+1]);
+        InputFile file1{argv[optind]};
+        InputFile file2{argv[optind+1]};
 
-        osmium::util::TypedMemoryMapping<osmium::UndirectedSegment> m1(file1.size() / sizeof(osmium::UndirectedSegment), osmium::util::MemoryMapping::mapping_mode::readonly, file1.fd());
-        osmium::util::TypedMemoryMapping<osmium::UndirectedSegment> m2(file2.size() / sizeof(osmium::UndirectedSegment), osmium::util::MemoryMapping::mapping_mode::readonly, file2.fd());
+        osmium::util::TypedMemoryMapping<osmium::UndirectedSegment> m1{file1.size() / sizeof(osmium::UndirectedSegment), osmium::util::MemoryMapping::mapping_mode::readonly, file1.fd()};
+        osmium::util::TypedMemoryMapping<osmium::UndirectedSegment> m2{file2.size() / sizeof(osmium::UndirectedSegment), osmium::util::MemoryMapping::mapping_mode::readonly, file2.fd()};
 
         std::set_difference(m1.cbegin(), m1.cend(), m2.cbegin(), m2.cend(), std::back_inserter(removed_segments));
         std::set_difference(m2.cbegin(), m2.cend(), m1.cbegin(), m1.cend(), std::back_inserter(added_segments));
-    } catch (std::runtime_error& e) {
+    } catch (const std::runtime_error& e) {
         std::cerr << e.what() << "\n";
-        exit(return_code_fatal);
+        std::exit(return_code_fatal);
     }
 
     if (dump) {
diff --git a/src/osmcoastline_ways.cpp b/src/osmcoastline_ways.cpp
index 09c8af4..6829ca7 100644
--- a/src/osmcoastline_ways.cpp
+++ b/src/osmcoastline_ways.cpp
@@ -19,24 +19,35 @@
 
 */
 
+#include <cstdlib>
 #include <cstring>
 #include <iostream>
 #include <memory>
 #include <string>
+#include <utility>
 
 #include <osmium/geom/haversine.hpp>
 #include <osmium/geom/ogr.hpp>
+#include <osmium/handler.hpp>
 #include <osmium/handler/node_locations_for_ways.hpp>
-#include <osmium/index/map/sparse_mem_array.hpp>
+#include <osmium/index/map/sparse_mem_array.hpp> // IWYU pragma: keep
 #include <osmium/io/any_input.hpp>
+#include <osmium/io/file.hpp>
+#include <osmium/osm/entity_bits.hpp>
+#include <osmium/osm/location.hpp>
+#include <osmium/osm/way.hpp>
+#include <osmium/osm/types.hpp>
 #include <osmium/visitor.hpp>
 
+#include <ogr_core.h>
+#include <ogr_geometry.h>
+
 #include <gdalcpp.hpp>
 
 #include "return_codes.hpp"
 
-typedef osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location> index_type;
-typedef osmium::handler::NodeLocationsForWays<index_type, index_type> node_location_handler_type;
+using index_type = osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location>;
+using location_handler_type = osmium::handler::NodeLocationsForWays<index_type, index_type>;
 
 class CoastlineWaysHandler : public osmium::handler::Handler {
 
@@ -49,7 +60,7 @@ class CoastlineWaysHandler : public osmium::handler::Handler {
 
 public:
 
-    CoastlineWaysHandler(const std::string& db_filename) :
+    explicit CoastlineWaysHandler(const std::string& db_filename) :
         m_length(0.0),
         m_dataset("SQLite", db_filename, gdalcpp::SRS{}, {"SPATIALITE=TRUE", "INIT_WITH_EPSG=no" }),
         m_layer_ways(m_dataset, "ways", wkbLineString) {
@@ -65,7 +76,7 @@ public:
         m_layer_ways.commit_transaction();
     }
 
-    void way(osmium::Way& way) {
+    void way(const osmium::Way& way) {
         m_length += osmium::geom::haversine::distance(way.nodes());
         try {
             std::unique_ptr<OGRLineString> ogrlinestring = m_factory.create_linestring(way);
@@ -74,25 +85,25 @@ public:
             feature.set_field("name", way.tags().get_value_by_key("name"));
             feature.set_field("source", way.tags().get_value_by_key("source"));
 
-            const char* coastline = way.tags().get_value_by_key("coastline");
-            feature.set_field("bogus", (coastline && !std::strcmp(coastline, "bogus")) ? "t" : "f");
+            const bool bogus = way.tags().has_tag("coastline", "bogus");
+            feature.set_field("bogus", bogus ? "t" : "f");
             feature.add_to_layer();
-        } catch (osmium::geometry_error&) {
+        } catch (const osmium::geometry_error&) {
             std::cerr << "Ignoring illegal geometry for way " << way.id() << ".\n";
         }
     }
 
-    double sum_length() const {
+    double sum_length() const noexcept {
         return m_length;
     }
 
-};
+}; // class CoastlineWaysHandler
 
 int main(int argc, char* argv[]) {
     if (argc >= 2) {
         if (!std::strcmp(argv[1], "--help") || !std::strcmp(argv[1], "-h")) {
             std::cout << "Usage: osmcoastline_ways OSMFILE [WAYSDB]\n";
-            exit(return_code_ok);
+            std::exit(return_code_ok);
         }
 
         if (!std::strcmp(argv[1], "--version") || !std::strcmp(argv[1], "-V")) {
@@ -101,35 +112,35 @@ int main(int argc, char* argv[]) {
                       << "License: GNU GENERAL PUBLIC LICENSE Version 3 <http://gnu.org/licenses/gpl.html>.\n"
                       << "This is free software: you are free to change and redistribute it.\n"
                       << "There is NO WARRANTY, to the extent permitted by law.\n";
-            exit(return_code_ok);
+            std::exit(return_code_ok);
         }
     }
 
     if (argc != 2 && argc != 3) {
         std::cerr << "Usage: osmcoastline_ways OSMFILE [WAYSDB]\n";
-        exit(return_code_cmdline);
+        std::exit(return_code_cmdline);
     }
 
     CPLSetConfigOption("OGR_SQLITE_SYNCHRONOUS", "OFF");
 
-    std::string input_osm_filename { argv[1] };
-    std::string output_db_filename { "coastline-ways.db" };
+    const std::string input_osm_filename{argv[1]};
 
+    std::string output_db_filename{"coastline-ways.db"};
     if (argc >= 3) {
         output_db_filename = argv[2];
     }
 
-    index_type store_pos;
-    index_type store_neg;
-    node_location_handler_type location_handler(store_pos, store_neg);
+    index_type index_pos;
+    index_type index_neg;
+    location_handler_type location_handler{index_pos, index_neg};
 
-    osmium::io::File infile(input_osm_filename);
-    osmium::io::Reader reader1(infile, osmium::osm_entity_bits::node);
+    osmium::io::File infile{input_osm_filename};
+    osmium::io::Reader reader1{infile, osmium::osm_entity_bits::node};
     osmium::apply(reader1, location_handler);
     reader1.close();
 
-    CoastlineWaysHandler coastline_ways_handler(output_db_filename);
-    osmium::io::Reader reader2(infile, osmium::osm_entity_bits::way);
+    CoastlineWaysHandler coastline_ways_handler{output_db_filename};
+    osmium::io::Reader reader2{infile, osmium::osm_entity_bits::way};
     osmium::apply(reader2, location_handler, coastline_ways_handler);
     reader2.close();
 
diff --git a/src/output_database.cpp b/src/output_database.cpp
index 293da90..0f701c7 100644
--- a/src/output_database.cpp
+++ b/src/output_database.cpp
@@ -19,11 +19,15 @@
 
 */
 
+#include <cstddef>
 #include <iostream>
 #include <sstream>
+#include <utility>
 
 #include <gdal_version.h>
 #include <geos_c.h>
+#include <ogr_core.h>
+#include <ogr_geometry.h>
 
 #include "options.hpp"
 #include "output_database.hpp"
@@ -83,7 +87,7 @@ void OutputDatabase::set_options(const Options& options) {
     sql << "INSERT INTO options (overlap, close_distance, max_points_in_polygons, split_large_polygons) VALUES ("
         << options.bbox_overlap << ", ";
 
-    if (options.close_distance==0) {
+    if (options.close_distance == 0) {
         sql << "NULL, ";
     } else {
         sql << options.close_distance << ", ";
@@ -129,7 +133,7 @@ void OutputDatabase::commit() {
 
 void OutputDatabase::add_error_point(std::unique_ptr<OGRPoint>&& point, const char* error, osmium::object_id_type id) {
     m_srs.transform(point.get());
-    gdalcpp::Feature feature(m_layer_error_points, std::move(point));
+    gdalcpp::Feature feature{m_layer_error_points, std::move(point)};
     feature.set_field("osm_id", std::to_string(id).c_str());
     feature.set_field("error", error);
     feature.add_to_layer();
@@ -137,7 +141,7 @@ void OutputDatabase::add_error_point(std::unique_ptr<OGRPoint>&& point, const ch
 
 void OutputDatabase::add_error_line(std::unique_ptr<OGRLineString>&& linestring, const char* error, osmium::object_id_type id) {
     m_srs.transform(linestring.get());
-    gdalcpp::Feature feature(m_layer_error_lines, std::move(linestring));
+    gdalcpp::Feature feature{m_layer_error_lines, std::move(linestring)};
     feature.set_field("osm_id", std::to_string(id).c_str());
     feature.set_field("error", error);
     feature.add_to_layer();
@@ -146,8 +150,8 @@ void OutputDatabase::add_error_line(std::unique_ptr<OGRLineString>&& linestring,
 void OutputDatabase::add_ring(std::unique_ptr<OGRPolygon>&& polygon, int osm_id, int nways, int npoints, bool fixed) {
     m_srs.transform(polygon.get());
 
-    bool land = polygon->getExteriorRing()->isClockwise();
-    bool valid = polygon->IsValid();
+    const bool land = polygon->getExteriorRing()->isClockwise();
+    const bool valid = polygon->IsValid();
 
     if (!valid) {
         /*
@@ -176,8 +180,8 @@ void OutputDatabase::add_ring(std::unique_ptr<OGRPolygon>&& polygon, int osm_id,
 #endif
 
         if (!reason.empty()) {
-            size_t left_bracket = reason.find('[');
-            size_t right_bracket = reason.find(']');
+            const std::size_t left_bracket = reason.find('[');
+            const std::size_t right_bracket = reason.find(']');
 
             std::istringstream iss(reason.substr(left_bracket+1, right_bracket-left_bracket-1), std::istringstream::in);
             double x;
@@ -186,7 +190,7 @@ void OutputDatabase::add_ring(std::unique_ptr<OGRPolygon>&& polygon, int osm_id,
             iss >> y;
             reason = reason.substr(0, left_bracket);
 
-            std::unique_ptr<OGRPoint> point { new OGRPoint() };
+            std::unique_ptr<OGRPoint> point{new OGRPoint()};
             point->assignSpatialReference(polygon->getSpatialReference());
             point->setX(x);
             point->setY(y);
@@ -200,7 +204,7 @@ void OutputDatabase::add_ring(std::unique_ptr<OGRPolygon>&& polygon, int osm_id,
         }
     }
 
-    gdalcpp::Feature feature(m_layer_rings, std::move(polygon));
+    gdalcpp::Feature feature{m_layer_rings, std::move(polygon)};
     feature.set_field("osm_id", osm_id);
     feature.set_field("nways", nways);
     feature.set_field("npoints", npoints);
@@ -212,19 +216,19 @@ void OutputDatabase::add_ring(std::unique_ptr<OGRPolygon>&& polygon, int osm_id,
 
 void OutputDatabase::add_land_polygon(std::unique_ptr<OGRPolygon>&& polygon) {
     m_srs.transform(polygon.get());
-    gdalcpp::Feature feature(m_layer_land_polygons, std::move(polygon));
+    gdalcpp::Feature feature{m_layer_land_polygons, std::move(polygon)};
     feature.add_to_layer();
 }
 
 void OutputDatabase::add_water_polygon(std::unique_ptr<OGRPolygon>&& polygon) {
     m_srs.transform(polygon.get());
-    gdalcpp::Feature feature(m_layer_water_polygons, std::move(polygon));
+    gdalcpp::Feature feature{m_layer_water_polygons, std::move(polygon)};
     feature.add_to_layer();
 }
 
 void OutputDatabase::add_line(std::unique_ptr<OGRLineString>&& linestring) {
     m_srs.transform(linestring.get());
-    gdalcpp::Feature feature(m_layer_lines, std::move(linestring));
+    gdalcpp::Feature feature{m_layer_lines, std::move(linestring)};
     feature.add_to_layer();
 }
 
diff --git a/src/output_database.hpp b/src/output_database.hpp
index 4dac320..0c560cb 100644
--- a/src/output_database.hpp
+++ b/src/output_database.hpp
@@ -30,8 +30,11 @@
 
 #include <gdalcpp.hpp>
 
-class SRS;
+class OGRLineString;
+class OGRPoint;
+class OGRPolygon;
 class Options;
+class SRS;
 struct Stats;
 
 /**
@@ -91,6 +94,6 @@ public:
 
     void commit();
 
-};
+}; // class OutputDatabase
 
 #endif // OUTPUT_DATABASE_HPP
diff --git a/src/srs.cpp b/src/srs.cpp
index 78a5809..a0c4ec3 100644
--- a/src/srs.cpp
+++ b/src/srs.cpp
@@ -19,6 +19,7 @@
 
 */
 
+#include <ogr_core.h>
 #include <ogr_geometry.h>
 
 #include "srs.hpp"
diff --git a/src/srs.hpp b/src/srs.hpp
index 5ce32b7..3e27de6 100644
--- a/src/srs.hpp
+++ b/src/srs.hpp
@@ -63,6 +63,7 @@ public:
     OGRSpatialReference* wgs84() {
         return &m_srs_wgs84;
     }
+
     OGRSpatialReference* out()   {
         return &m_srs_out;
     }
@@ -86,13 +87,15 @@ public:
     double max_x() const {
         return m_transform ?  20037500.0 :  179.9999;
     }
+
     double min_x() const {
         return m_transform ? -20037500.0 : -179.9999;
     }
+
     double min_y() const {
         return m_transform ? -20037400.0 :  -85.049;
     }
 
-};
+}; // class SRS
 
 #endif // SRS_HPP
diff --git a/taginfo.json b/taginfo.json
index 3360c60..b1ae356 100644
--- a/taginfo.json
+++ b/taginfo.json
@@ -6,7 +6,7 @@
         "description": "Program that assembles continuous coastlines from OSM data and creates land and water polygons.",
         "project_url": "http://wiki.osm.org/wiki/OSMCoastline",
         "doc_url": "https://github.com/osmcode/osmcoastline",
-        "icon_url": "http://osmcode.org/img/logo-osmcoastline-16x16.png",
+        "icon_url": "http://osmcode.org/img/logo-osmcoastline.svg",
         "contact_name": "Jochen Topf",
         "contact_email": "jochen at topf.org",
         "keywords": [

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osmcoastline.git



More information about the Pkg-grass-devel mailing list