From db6fb9134cdb5975fdfb6977e89324f8bc4d3a16 Mon Sep 17 00:00:00 2001 From: Michael Schmitz Date: Tue, 24 Jun 2025 19:12:11 +0200 Subject: [PATCH] add bounds to rendering cli (#3435) --- bin/render.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/bin/render.cpp b/bin/render.cpp index 6520f7baf..396742cff 100644 --- a/bin/render.cpp +++ b/bin/render.cpp @@ -29,10 +29,17 @@ int main(int argc, char* argv[]) { args::ValueFlag pixelRatioValue(argumentParser, "number", "Image scale factor", {'r', "ratio"}); - args::ValueFlag zoomValue(argumentParser, "number", "Zoom level", {'z', "zoom"}); + // grouping ensures either bounds or center based position is used + args::Group boundsOrCenterZoom(argumentParser, "Position (either one):", args::Group::Validators::AtMostOne); + + args::NargsValueFlag boundsValue( + boundsOrCenterZoom, "degrees: north west south east", "Bounds of rendered map", {"bounds"}, 4); + + args::Group centerGroup(boundsOrCenterZoom, "Center:", args::Group::Validators::AtLeastOne); + args::ValueFlag zoomValue(centerGroup, "number", "Zoom level", {'z', "zoom"}); + args::ValueFlag lonValue(centerGroup, "degrees", "Longitude", {'x', "lon"}); + args::ValueFlag latValue(centerGroup, "degrees", "Latitude", {'y', "lat"}); - args::ValueFlag lonValue(argumentParser, "degrees", "Longitude", {'x', "lon"}); - args::ValueFlag latValue(argumentParser, "degrees", "Latitude", {'y', "lat"}); args::ValueFlag bearingValue(argumentParser, "degrees", "Bearing", {'b', "bearing"}); args::ValueFlag pitchValue(argumentParser, "degrees", "Pitch", {'p', "pitch"}); args::ValueFlag widthValue(argumentParser, "pixels", "Image width", {'w', "width"}); @@ -108,7 +115,13 @@ int main(int argc, char* argv[]) { } map.getStyle().loadURL(style); - map.jumpTo(CameraOptions().withCenter(LatLng{lat, lon}).withZoom(zoom).withBearing(bearing).withPitch(pitch)); + std::vector bounds = args::get(boundsValue); + if (bounds.size() == 4) { + LatLngBounds boundingBox = LatLngBounds::hull(LatLng(bounds[0], bounds[1]), LatLng(bounds[2], bounds[3])); + map.jumpTo(map.cameraForLatLngBounds(boundingBox, EdgeInsets(), bearing, pitch)); + } else { + map.jumpTo(CameraOptions().withCenter(LatLng{lat, lon}).withZoom(zoom).withBearing(bearing).withPitch(pitch)); + } if (debug) { map.setDebug(debug ? mbgl::MapDebugOptions::TileBorders | mbgl::MapDebugOptions::ParseStatus