Warning, /libraries/kpublictransport/cmake/FindOsmTools.cmake is written in an unsupported language. File is not indexed.

0001 # SPDX-FileCopyrightText: 2018 Volker Krause <vkrause@kde.org>
0002 #
0003 # SPDX-License-Identifier: BSD-3-Clause
0004 
0005 
0006 find_program(OSMCONVERT_EXECUTABLE osmconvert)
0007 find_program(OSMFILTER_EXECUTABLE osmfilter)
0008 find_program(OSMUPDATE_EXECUTABLE osmupdate)
0009 
0010 find_program(WGET_EXECUTABLE wget) # needed by osmupdate
0011 find_program(RSYNC_EXECUTABLE rsync) # needed for the initial download
0012 
0013 
0014 include(FindPackageHandleStandardArgs)
0015 find_package_handle_standard_args(OsmTools
0016     FOUND_VAR OsmTools_FOUND
0017     REQUIRED_VARS OSMCONVERT_EXECUTABLE OSMFILTER_EXECUTABLE OSMUPDATE_EXECUTABLE WGET_EXECUTABLE RSYNC_EXECUTABLE
0018 )
0019 
0020 if (OSMCONVERT_EXECUTABLE AND NOT TARGET OSM::convert)
0021     add_executable(OSM::convert IMPORTED)
0022     set_target_properties(OSM::convert PROPERTIES IMPORTED_LOCATION ${OSMCONVERT_EXECUTABLE})
0023 endif()
0024 if (OSMFILTER_EXECUTABLE AND NOT TARGET OSM::filter)
0025     add_executable(OSM::filter IMPORTED)
0026     set_target_properties(OSM::filter PROPERTIES IMPORTED_LOCATION ${OSMFILTER_EXECUTABLE})
0027 endif()
0028 if (OSMUPDATE_EXECUTABLE AND NOT TARGET OSM::update)
0029     add_executable(OSM::update IMPORTED)
0030     set_target_properties(OSM::update PROPERTIES IMPORTED_LOCATION ${OSMUPDATE_EXECUTABLE})
0031 endif()
0032 
0033 set_package_properties(OsmTools PROPERTIES
0034     URL "https://gitlab.com/osm-c-tools/osmctools"
0035     DESCRIPTION "Tols to convert, filter and update OpenStreetMap data files"
0036 )
0037 
0038 mark_as_advanced(OSMCONVERT_EXECUTABLE OSMFILTER_EXECUTABLE OSMCONVERT_EXECUTABLE WGET_EXECUTABLE)
0039 
0040 set(OSM_PLANET_DIR "" CACHE PATH "Directory containing the planet-latest.o5m file, and enough space to store processing results in.")
0041 set(OSM_MIRROR "ftp5.gwdg.de/pub/misc/openstreetmap/planet.openstreetmap.org" CACHE STRING "Base URL of the preferred OSM download mirror.")
0042 
0043 # create initial download and incremental update targets for the OSM planet file
0044 if (OSM_PLANET_DIR)
0045     set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM ON) # avoid cleaning the expensive full planet files
0046     add_custom_command(
0047         OUTPUT ${OSM_PLANET_DIR}/planet-latest.osm.pbf
0048         COMMAND ${RSYNC_EXECUTABLE} -Lvz --partial --progress rsync://${OSM_MIRROR}/pbf/planet-latest.osm.pbf ${OSM_PLANET_DIR}/planet-latest.osm.pbf
0049         WORKING_DIRECTORY ${OSM_PLANET_DIR}
0050         COMMENT "Downloading full OSM plant file (~60GB)"
0051     )
0052     add_custom_command(
0053         OUTPUT ${OSM_PLANET_DIR}/planet-latest.o5m
0054         COMMAND OSM::convert ${OSM_PLANET_DIR}/planet-latest.osm.pbf --drop-author --drop-version --out-o5m -o=${OSM_PLANET_DIR}/planet-latest.o5m
0055         WORKING_DIRECTORY ${OSM_PLANET_DIR}
0056         COMMENT "Converting full OSM planet file to o5m format (takes ~30min and needs ~80GB of extra disk space)"
0057     )
0058 
0059     add_custom_target(osm-update-planet
0060         COMMAND OSM::update --base-url=https://${OSM_MIRROR}/replication --day --verbose ${OSM_PLANET_DIR}/planet-latest.o5m ${OSM_PLANET_DIR}/new-planet-latest.o5m
0061         COMMAND ${CMAKE_COMMAND} -E rename ${OSM_PLANET_DIR}/new-planet-latest.o5m ${OSM_PLANET_DIR}/planet-latest.o5m
0062         WORKING_DIRECTORY ${OSM_PLANET_DIR}
0063         DEPENDS ${OSM_PLANET_DIR}/planet-latest.o5m
0064         COMMENT "Updating OSM planet file"
0065     )
0066 endif()
0067 
0068 if (TARGET OSM::convert)
0069 
0070 # Convert the given input file to the output file with determining the output format
0071 # from the file extension
0072 # Arguments:
0073 #   INPUT input file, assumed to be in OSM_PLANET_DIR
0074 #   OUTPUT output file, assumed to be in OSM_PLANET_DIR
0075 #   ADD_BBOX bool, enable injection of bounding box tags
0076 function(osm_convert)
0077     set(optionArgs ADD_BBOX)
0078     set(oneValueArgs INPUT OUTPUT)
0079     cmake_parse_arguments(osm_convert "${optionArgs}" "${oneValueArgs}" "" ${ARGN})
0080     get_filename_component(format ${osm_convert_OUTPUT} LAST_EXT)
0081     string(SUBSTRING ${format} 1 -1 format)
0082 
0083     set(extra_args "")
0084     if (osm_convert_ADD_BBOX)
0085         set(extra_args "--add-bbox-tags")
0086     endif()
0087 
0088     add_custom_command(
0089         OUTPUT ${OSM_PLANET_DIR}/${osm_convert_OUTPUT}
0090         COMMAND OSM::convert ${OSM_PLANET_DIR}/${osm_convert_INPUT} --drop-author --drop-version ${extra_args} --out-${format} -o=${OSM_PLANET_DIR}/${osm_convert_OUTPUT}
0091         WORKING_DIRECTORY ${OSM_PLANET_DIR}
0092         COMMENT "Converting ${osm_convert_INPUT} to ${format} format"
0093         DEPENDS ${OSM_PLANET_DIR}/${osm_convert_INPUT}
0094     )
0095 endfunction()
0096 
0097 endif()
0098 
0099 
0100 if (TARGET OSM::filter)
0101 
0102 # Filter the given input file by the given filter arguments
0103 # Arguments:
0104 #   INPUT input file, assumed to be in OSM_PLANET_DIR (default is planet-latest.o5m)
0105 #   OUTPUT output file, assumed to be in OSM_PLANET_DIR
0106 #   FILTER filter arguments for osmfilter
0107 function(osm_filter)
0108     set(oneValueArgs INPUT OUTPUT)
0109     set(multiValueArgs FILTER)
0110     cmake_parse_arguments(osm_filter "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
0111     get_filename_component(format ${osm_filter_OUTPUT} LAST_EXT)
0112     string(SUBSTRING ${format} 1 -1 format)
0113 
0114     if (NOT osm_filter_INPUT)
0115         set(osm_filter_INPUT planet-latest.o5m)
0116     endif()
0117 
0118     add_custom_command(
0119         OUTPUT ${OSM_PLANET_DIR}/${osm_filter_OUTPUT}
0120         COMMAND OSM::filter ${OSM_PLANET_DIR}/${osm_filter_INPUT} --drop-author --drop-version ${osm_filter_FILTER} --out-${format} -o=${OSM_PLANET_DIR}/${osm_filter_OUTPUT}
0121         WORKING_DIRECTORY ${OSM_PLANET_DIR}
0122         COMMENT "Filtering ${osm_filter_INPUT}"
0123         DEPENDS ${OSM_PLANET_DIR}/${osm_filter_INPUT}
0124     )
0125 endfunction()
0126 
0127 endif()