import("context""fmt"routeoptimization"cloud.google.com/go/maps/routeoptimization/apiv1""google.golang.org/genproto/googleapis/type/latlng"rpb"cloud.google.com/go/maps/routeoptimization/apiv1/routeoptimizationpb")funcoptimizeTours(projectIDstring)(*rpb.OptimizeToursResponse,error){ctx:=context.Background()c,err:=routeoptimization.NewClient(ctx)iferr!=nil{returnnil,fmt.Errorf("routeoptimization client: %w",err)}deferc.Close()// See https://pkg.go.dev/cloud.google.com/go/maps/routeoptimization/apiv1/routeoptimizationpb#OptimizeToursRequest.req:=&rpb.OptimizeToursRequest{Parent:"projects/"+projectID,Model:&rpb.ShipmentModel{Shipments:[]*rpb.Shipment{&rpb.Shipment{Deliveries:[]*rpb.Shipment_VisitRequest{{ArrivalLocation:&latlng.LatLng{Latitude:48.880942,Longitude:2.323866}},},},},Vehicles:[]*rpb.Vehicle{{StartLocation:&latlng.LatLng{Latitude:48.863102,Longitude:2.341204},EndLocation:&latlng.LatLng{Latitude:48.86311,Longitude:2.341205},},},},}returnc.OptimizeTours(ctx,req)}
importcom.google.maps.routeoptimization.v1.OptimizeToursRequest;importcom.google.maps.routeoptimization.v1.OptimizeToursResponse;importcom.google.maps.routeoptimization.v1.RouteOptimizationClient;importcom.google.maps.routeoptimization.v1.RouteOptimizationSettings;importcom.google.maps.routeoptimization.v1.Shipment;importcom.google.maps.routeoptimization.v1.Shipment.VisitRequest;importcom.google.maps.routeoptimization.v1.ShipmentModel;importcom.google.maps.routeoptimization.v1.Vehicle;importcom.google.type.LatLng;importjava.time.Duration;publicclassOptimizeTours{publicstaticOptimizeToursResponseoptimizeTours(StringprojectId)throwsException{// Optional: method calls that last tens of minutes may be interrupted// without enabling a short keep-alive interval.RouteOptimizationSettingsclientSettings=RouteOptimizationSettings.newBuilder().setTransportChannelProvider(RouteOptimizationSettings.defaultGrpcTransportProviderBuilder().setKeepAliveTimeDuration(Duration.ofSeconds(30)).build()).build();RouteOptimizationClientclient=RouteOptimizationClient.create(clientSettings);OptimizeToursRequestrequest=OptimizeToursRequest.newBuilder().setParent("projects/"+projectId).setModel(ShipmentModel.newBuilder().addShipments(Shipment.newBuilder().addPickups(VisitRequest.newBuilder().setArrivalLocation(LatLng.newBuilder().setLatitude(48.8).setLongitude(2.4)))).addVehicles(Vehicle.newBuilder().setStartLocation(LatLng.newBuilder().setLatitude(48.9).setLongitude(2.5)))).build();returnclient.optimizeTours(request);}}
먼저 Google 지도 플랫폼 담당자에게 Node.js 클라이언트 보관 파일의 사본을 요청합니다.
다음 JSON 스니펫을 사용하여 package.json 파일을 구성합니다.
{"name":"route-optimization-example","version":"1.0.0","description":"A RouteOptimization example.","main":"main.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":"","dependencies":{"@googlemaps/routeoptimization":"^0.1.0"}}
[null,null,["최종 업데이트: 2025-09-02(UTC)"],[[["\u003cp\u003eUse an \u003ccode\u003eOptimizeToursRequest\u003c/code\u003e message to make an \u003ccode\u003eOptimizeTours\u003c/code\u003e request to the Route Optimization API.\u003c/p\u003e\n"],["\u003cp\u003eClient libraries are available in Go, Java, Python, and Node.js for making requests, in addition to REST and gRPC options.\u003c/p\u003e\n"],["\u003cp\u003eBefore making a request, ensure Application Default Credentials are configured and replace project placeholders with your project ID.\u003c/p\u003e\n"],["\u003cp\u003eRequests include details such as shipments, vehicles, their locations, and operational time windows.\u003c/p\u003e\n"],["\u003cp\u003eUpon successful completion, an \u003ccode\u003eOptimizeToursResponse\u003c/code\u003e message will be returned, which can be further interpreted.\u003c/p\u003e\n"]]],["The document outlines how to use the `OptimizeTours` request via client libraries (Go, Java, Python, Node.js) or REST/gRPC. It involves configuring Application Default Credentials and setting the project ID. Requests specify shipment details like pickup/delivery locations and vehicle start/end locations, alongside global start/end times, using `OptimizeToursRequest`. The examples provided in the content show how to create and send this request using each client library or using the command-line interface through a REST request.\n"],null,["**European Economic Area (EEA) developers** If your billing address is in the European Economic Area, effective on 8 July 2025, the [Google Maps Platform EEA Terms of Service](https://cloud.google.com/terms/maps-platform/eea) will apply to your use of the Services. Functionality varies by region. [Learn more](/maps/comms/eea/faq).\n\nAn `OptimizeToursRequest` message can be used to make an `OptimizeTours`\nrequest.\n\nExample: Make an `OptimizeTours` request\n\nClient libraries are also available for several popular programming languages.\n`OptimizeTours` requests can also be made using either [REST](/maps/documentation/route-optimization/reference/rest/v1/projects/optimizeTours) or [gRPC](/maps/documentation/route-optimization/reference/rpc/google.maps.routeoptimization.v1#routeoptimization).\n| **Note:** See [installation instructions](/maps/documentation/route-optimization/client-libraries) for client libraries used for the following examples.\n\nBefore making a request, replace the following parameters with values\nappropriate for your environment:\n\n- Ensure you have [Application Default Credentials](https://cloud.google.com/docs/authentication/provide-credentials-adc) configured as described in [Use OAuth](/maps/documentation/route-optimization/oauth-token).\n- Set \u003cvar label=\"project_number\" translate=\"no\"\u003ePROJECT_NUMBER_OR_ID\u003c/var\u003e to your Cloud\n project number or ID.\n\nGo\n\nMake a request using the Go client library: \n\n```go\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\trouteoptimization \"cloud.google.com/go/maps/routeoptimization/apiv1\"\n\t\"google.golang.org/genproto/googleapis/type/latlng\"\n\n\trpb \"cloud.google.com/go/maps/routeoptimization/apiv1/routeoptimizationpb\"\n)\n\nfunc optimizeTours(projectID string) (*rpb.OptimizeToursResponse, error) {\n\tctx := context.Background()\n\tc, err := routeoptimization.NewClient(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"routeoptimization client: %w\", err)\n\t}\n\tdefer c.Close()\n\n\t// See https://pkg.go.dev/cloud.google.com/go/maps/routeoptimization/apiv1/routeoptimizationpb#OptimizeToursRequest.\n\treq := &rpb.OptimizeToursRequest{\n\t\tParent: \"projects/\" + projectID,\n\t\tModel: &rpb.ShipmentModel{\n\t\t\tShipments: []*rpb.Shipment{\n\t\t\t\t&rpb.Shipment{\n\t\t\t\t\tDeliveries: []*rpb.Shipment_VisitRequest{\n\t\t\t\t\t\t{ArrivalLocation: &latlng.LatLng{Latitude: 48.880942, Longitude: 2.323866}},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tVehicles: []*rpb.Vehicle{\n\t\t\t\t{\n\t\t\t\t\tStartLocation: &latlng.LatLng{Latitude: 48.863102, Longitude: 2.341204},\n\t\t\t\t\tEndLocation: &latlng.LatLng{Latitude: 48.86311, Longitude: 2.341205},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\treturn c.OptimizeTours(ctx, req)\n}\nhttps://github.com/GoogleCloudPlatform/golang-samples/blob/0f9d83276109eb453cf6bd6ca044bd9b99528545/routeoptimization/snippets/optimize_tours.go#L18-L57\n```\n\nJava\n\nMake a request using the Java client library: \n\n```java\nimport com.google.maps.routeoptimization.v1.OptimizeToursRequest;\nimport com.google.maps.routeoptimization.v1.OptimizeToursResponse;\nimport com.google.maps.routeoptimization.v1.RouteOptimizationClient;\nimport com.google.maps.routeoptimization.v1.RouteOptimizationSettings;\nimport com.google.maps.routeoptimization.v1.Shipment;\nimport com.google.maps.routeoptimization.v1.Shipment.VisitRequest;\nimport com.google.maps.routeoptimization.v1.ShipmentModel;\nimport com.google.maps.routeoptimization.v1.Vehicle;\nimport com.google.type.LatLng;\nimport java.time.Duration;\n\npublic class OptimizeTours {\n public static OptimizeToursResponse optimizeTours(String projectId) throws Exception {\n // Optional: method calls that last tens of minutes may be interrupted\n // without enabling a short keep-alive interval.\n RouteOptimizationSettings clientSettings = RouteOptimizationSettings\n .newBuilder()\n .setTransportChannelProvider(RouteOptimizationSettings\n .defaultGrpcTransportProviderBuilder()\n .setKeepAliveTimeDuration(Duration.ofSeconds(30))\n .build()).build();\n\n RouteOptimizationClient client = RouteOptimizationClient.create(clientSettings);\n OptimizeToursRequest request =\n OptimizeToursRequest.newBuilder()\n .setParent(\"projects/\" + projectId)\n .setModel(\n ShipmentModel.newBuilder()\n .addShipments(\n Shipment.newBuilder()\n .addPickups(\n VisitRequest.newBuilder()\n .setArrivalLocation(\n LatLng.newBuilder().setLatitude(48.8).setLongitude(2.4))))\n .addVehicles(\n Vehicle.newBuilder()\n .setStartLocation(\n LatLng.newBuilder().setLatitude(48.9).setLongitude(2.5))))\n .build();\n return client.optimizeTours(request);\n }\n}https://github.com/GoogleCloudPlatform/java-docs-samples/blob/70c2dc2617fdd887f13209ac82e5e9d373d7bfff/routeoptimization/snippets/src/main/java/com/example/OptimizeTours.java#L46-L75\n```\n\nPython\n\nThe Python client is available on\n[PyPI](https://pypi.org/project/google-maps-routeoptimization/). \n\n pip install google-maps-routeoptimization\n\nMake a request using the Python client library: \n\n```python\nfrom google.maps import routeoptimization_v1 as ro\nfrom datetime import datetime\n\nclient = ro.RouteOptimizationClient()\nrequest = ro.OptimizeToursRequest(\n parent=\"projects/\u003cvar label=\"project_number\" translate=\"no\"\u003ePROJECT_NUMBER_OR_ID\u003c/var\u003e\",\n model={\n \"shipments\": [\n {\n \"pickups\": [\n {\n \"arrival_location\": {\n \"latitude\": 37.738818,\n \"longitude\": -122.4161\n }\n }\n ],\n \"deliveries\": [\n {\n \"arrival_location\": {\n \"latitude\": 37.79581,\n \"longitude\": -122.4218856\n }\n }\n ]\n }\n ],\n \"vehicles\": [\n {\n \"start_location\": {\n \"latitude\": 37.738818,\n \"longitude\": -122.4161\n },\n \"end_location\": {\n \"latitude\": 37.738818,\n \"longitude\": -122.4161\n },\n \"cost_per_kilometer\": 1.0\n }\n ],\n \"global_start_time\": datetime.fromisoformat(\"2024-02-13T00:00:00.000Z\"),\n \"global_end_time\": datetime.fromisoformat(\"2024-02-14T06:00:00.000Z\")\n }\n)\nresponse = client.optimize_tours(request=request)\nprint(response)\n```\n\nNode.js\n\nFirst, request a copy of the Node.js client archive from your Google Maps\nPlatform representative.\n\nConfigure your `package.json` file using the following JSON snippet: \n\n {\n \"name\": \"route-optimization-example\",\n \"version\": \"1.0.0\",\n \"description\": \"A RouteOptimization example.\",\n \"main\": \"main.js\",\n \"scripts\": {\n \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n },\n \"author\": \"\",\n \"dependencies\": {\n \"@googlemaps/routeoptimization\": \"^0.1.0\"\n }\n }\n\nMake a request using the Node.js client library: \n\n```javascript\n'use strict';\n\nconst {RouteOptimizationClient} = require('@googlemaps/routeoptimization').v1;\n\nconst routeoptimizationClient = new RouteOptimizationClient();\n\nasync function callOptimizeTours() {\n const response = await routeoptimizationClient.optimizeTours({\n \"parent\": \"projects/\u003cvar label=\"project_number\" translate=\"no\"\u003ePROJECT_NUMBER_OR_ID\u003c/var\u003e\",\n \"model\": {\n \"shipments\": [\n {\n \"pickups\": [\n {\n \"arrivalLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n }\n }\n ],\n \"deliveries\": [\n {\n \"arrivalLocation\": {\n \"latitude\": 37.79581,\n \"longitude\": -122.4218856\n }\n }\n ]\n }\n ],\n \"vehicles\": [\n {\n \"startLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n },\n \"endLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n },\n \"costPerKilometer\": 1.0\n }\n ],\n \"globalStartTime\": \"2024-02-13T00:00:00.000Z\",\n \"globalEndTime\": \"2024-02-14T06:00:00.000Z\"\n }\n });\n console.log(JSON.stringify(response));\n}\ncallOptimizeTours();\n```\n\nREST\n\nThe following command sends an `OptimizeTours` request to the Route\nOptimization API and receives a response synchronously. \n\n```scdoc\ncurl -X POST 'https://routeoptimization.googleapis.com/v1/projects/PROJECT_NUMBER_OR_ID:optimizeTours' \\\n-H \"Content-Type: application/json\" \\\n-H \"Authorization: Bearer $(gcloud auth application-default print-access-token)\" \\\n--data @- \u003c\u003c EOM\n{\n \"model\": {\n \"shipments\": [\n {\n \"pickups\": [\n {\n \"arrivalLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n }\n }\n ],\n \"deliveries\": [\n {\n \"arrivalLocation\": {\n \"latitude\": 37.79581,\n \"longitude\": -122.4218856\n }\n }\n ]\n }\n ],\n \"vehicles\": [\n {\n \"startLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n },\n \"endLocation\": {\n \"latitude\": 37.73881799999999,\n \"longitude\": -122.4161\n },\n \"costPerKilometer\": 1.0\n }\n ],\n \"globalStartTime\": \"2024-02-13T00:00:00.000Z\",\n \"globalEndTime\": \"2024-02-14T06:00:00.000Z\"\n }\n}\nEOM\n```\n| **Note:** this example uses the `--data @-` to read a request from standard input. Use `--data @`\u003cvar label=\"curl_filename\" translate=\"no\"\u003eFilename\u003c/var\u003e to read from a file.\n\nOnce the request completes, you'll receive a response message.\n\n[Next: Interpret the Response](/maps/documentation/route-optimization/interpret-response)"]]