@@ -42,6 +42,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
4242#include < cstddef>
4343#include < fstream>
4444#include < iostream>
45+ #include < memory>
4546#include < string>
4647#include < vector>
4748
@@ -245,6 +246,7 @@ bool CommandGetId::find_relations_in_relations() {
245246 osmium::index::RelationsMapStash stash;
246247
247248 osmium::io::Reader reader{m_input_file, osmium::osm_entity_bits::relation, osmium::io::read_meta::no};
249+ open_writer (reader);
248250 while (osmium::memory::Buffer buffer = reader.read ()) {
249251 for (const auto & relation : buffer.select <osmium::Relation>()) {
250252 for (const auto & member : relation.members ()) {
@@ -278,6 +280,7 @@ void CommandGetId::find_nodes_and_ways_in_relations() {
278280 m_vout << " Reading input file to find nodes/ways in relations...\n " ;
279281
280282 osmium::io::Reader reader{m_input_file, osmium::osm_entity_bits::relation, osmium::io::read_meta::no};
283+ open_writer (reader);
281284 while (osmium::memory::Buffer buffer = reader.read ()) {
282285 for (const auto & relation : buffer.select <osmium::Relation>()) {
283286 if (m_ids (osmium::item_type::relation).get (relation.positive_id ())) {
@@ -298,6 +301,7 @@ void CommandGetId::find_nodes_in_ways() {
298301 m_vout << " Reading input file to find nodes in ways...\n " ;
299302
300303 osmium::io::Reader reader{m_input_file, osmium::osm_entity_bits::way, osmium::io::read_meta::no};
304+ open_writer (reader);
301305 while (osmium::memory::Buffer buffer = reader.read ()) {
302306 for (const auto & way : buffer.select <osmium::Way>()) {
303307 if (m_ids (osmium::item_type::way).get (way.positive_id ())) {
@@ -332,19 +336,25 @@ void CommandGetId::find_referenced_objects() {
332336 m_vout << " Done following references.\n " ;
333337}
334338
339+ void CommandGetId::open_writer (osmium::io::Reader& reader) {
340+ if (m_writer) {
341+ return ;
342+ }
343+
344+ m_vout << " Opening output file...\n " ;
345+ osmium::io::Header header{reader.header ()};
346+ setup_header (header);
347+ m_writer = std::make_unique<osmium::io::Writer>(m_output_file, header, m_output_overwrite, m_fsync);
348+ }
349+
335350bool CommandGetId::run () {
336351 if (m_add_referenced_objects) {
337352 find_referenced_objects ();
338353 }
339354
340355 m_vout << " Opening input file...\n " ;
341356 osmium::io::Reader reader{m_input_file, get_needed_types ()};
342-
343- m_vout << " Opening output file...\n " ;
344- osmium::io::Header header{reader.header ()};
345- setup_header (header);
346-
347- osmium::io::Writer writer{m_output_file, header, m_output_overwrite, m_fsync};
357+ open_writer (reader);
348358
349359 m_vout << " Copying matching objects to output file...\n " ;
350360 osmium::ProgressBar progress_bar{reader.file_size (), display_progress ()};
@@ -355,22 +365,22 @@ bool CommandGetId::run() {
355365 if (!m_work_with_history) {
356366 m_ids (object.type ()).unset (object.positive_id ());
357367 }
358- writer (object);
368+ writer ()( object);
359369 } else if (m_ids (object.type ()).get (object.positive_id ())) {
360370 if (!m_work_with_history) {
361371 m_ids (object.type ()).unset (object.positive_id ());
362372 }
363373 if (m_remove_tags) {
364374 object.remove_tags ();
365375 }
366- writer (object);
376+ writer ()( object);
367377 }
368378 }
369379 }
370380 progress_bar.done ();
371381
372382 m_vout << " Closing output file...\n " ;
373- writer.close ();
383+ writer () .close ();
374384
375385 m_vout << " Closing input file...\n " ;
376386 reader.close ();
0 commit comments