Как сочетать сводки маршрутов с поиском по пути
Вы можете объединить расчеты сводки маршрута с поиском по маршруту. В этом случае текстовый поиск (новый) возвращает продолжительность поездки и расстояние до каждого места в ответе, а затем от каждого места до конечного пункта назначения маршрута.
Чтобы использовать новый текстовый поиск для расчета сводки маршрута вместе с поиском вдоль маршрута:
-
Используйте Routes API, чтобы рассчитать маршрут, который возвращает ломаную линию маршрута в ответе.
-
Используйте
searchAlongRouteParameters.setPolyline(), чтобы передать ломаную линию маршрута в текстовый поиск (New) и настроить результаты поиска с учетом маршрута. В ответе будут места, которые соответствуют критериям поиска и находятся рядом с указанным маршрутом. -
При создании объекта запроса добавьте
.setRoutingSummariesIncluded(true).
По умолчанию текстовый поиск (New) выполняет поиск по всему маршруту:
// Define the route polyline object using the route string. EncodedPolyline encodedPolyline = EncodedPolyline.newInstance("wblcFptchVIFOd@G@EVw@Ms@dHKR}ApNA`AF~@Hf@TjAb@bBb@~@n@p@^Rd@~@Vz@HVz@nDLt@?d@Kr@c@~@mD`G?`@aEfGkCnDuChDm`@bb@[`@{GhHeEdEciBnnBkC`DkC~DaClEuKjT_Z|l@Qb@iR~_@}EzJ_AdB_Und@kAfCaOjZkg@vcAqBzD_]rr@iBlEaBxEgArD}AlG}AhHsA`IeAnH{@dIq@dJgL~iBq@rHu@vGgAtHwArHaBhHkBzG_DpJ}Nbc@iBhGkA|EgC|LcIjb@oAhG_AvDgAdDkApC_BzCiBpCsFvGii@vn@scAxlAmLjNgSzUeRjT{TzWqExEmG|FuNlMmMhLaRvPqOlNmbAl}@mFlF{PlOmJfIoElE}LtMiSbU_H`I}}@jcAwl@vp@oAbBqA~BeAhCm@tBg@fCWrBQ~BI|DaB~rBO~D[bEa@`Dm@pDaAdE{@vC_BbEkB~Def@|z@sEzHKJeS~]}K`S{\\~l@cXpe@sBpDm@bAuCxDkBrBiC~BwCtByBnAcBx@}Bt@{Bn@gh@|LaOpDeFhAoDj@aE^kVrA_E^iEr@yD~@uBr@gMjF_EnAcCh@eFr@_DRsAD}@Jsu@xCWDqIV}BCeCOyDm@cBa@_DmA}JeE_CwAsBcBiBoBuAqBmOoX{CuEkB_CoDqDkVoUoD{CeE_DkEkC_FeCqB}@sDuAoDgAeCe@cCW}CK}BDaDTeOlBcuBrYaNlBq@Dyd@rGyFt@yBb@eBf@oCnAoBlAkIpGkAp@wBbAaCt@oFdAwKjBoGxA{FbByIjC_HfB_@KmNdDuC|@uFzBcH|C{@\\[?sBv@}@VaBVoA@y@EmAQcA[w@]aBkAeAkA}BuDUKs@uAqBsCwBcCgAiAiN_MyKsJsG{GkBaBiBuA{BwAwDkBcOaHiC_AiCg@}BQcCAcBHqBVkB`@qEjAu@LgCVgAHwG@sG?mABsH^eNr@mBXy@NqBt@uAt@aBlAkAlA}BtCyApBiAdB_BxB{A`B}@j@oAf@s@PeCVcIf@gAAkAQy@YiAo@_A{@_DgEgJqM_DeEaM}PoBiCzAsBw@kAdAGVk@f@q@z@C "); // Specify the list of fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Define the search along route parameters object and pass the polyline object. SearchAlongRouteParameters searchAlongRouteParameters = SearchAlongRouteParameters.builder() .setPolyline(encodedPolyline) .build(); // Use the builder to create a SearchByTextRequest object and pass the search along route parameters. final SearchByTextRequest searchByTextRequest = SearchByTextRequest.builder("Spicy Vegetarian Food", placeFields) .setMaxResultCount(10) .setSearchAlongRouteParameters(searchAlongRouteParameters) .setRoutingSummariesIncluded(true) .build(); // Call PlacesClient.searchByText() to perform the search. // Define a response handler to process the returned List of Place objects. placesClient.searchByText(searchByTextRequest) .addOnSuccessListener(response -> { List<Place> places = response.getPlaces(); List<RoutingSummary> routingSummaries = response.getRoutingSummaries(); List<Leg> legs = routingSummaries.get(0).getLegs(); Duration duration = legs.get(0).getDuration(); });
Ответ содержит объекты, которые включают списки запрошенных полей мест и сводки маршрутов, содержащие продолжительность и расстояние до каждого места.
Вы можете вызвать функцию SearchByTextResponse.getRoutingSummaries(), чтобы получить список сводок маршрутов.
Для каждой записи в массиве legs текстовый поиск (новый) возвращает время поездки, состоящей из двух этапов:
-
Первый отрезок содержит продолжительность поездки и расстояние от начальной точки до места.
-
Второй отрезок содержит продолжительность поездки и расстояние от места до пункта назначения маршрута.
Укажите пункт отправления, способ передвижения и модификаторы маршрута
Вы можете изменить расчет сводки по поиску и маршрутизации, указав начальную точку маршрута, способ передвижения, модификаторы маршрута и предпочтения маршрутизации. Режим поездки и модификаторы маршрута работают так же, как при расчете сводок маршрутов без указания маршрута, как показано в разделе Укажите параметры поездки.
По умолчанию первый этап каждого результата содержит расстояние от пункта отправления, определенного ломаной линией, до каждого места. Однако вы можете переопределить это значение по умолчанию, явно указав в запросе источник маршрутизации. Если он указан, то в первом этапе всех ответов будут указаны расстояния и продолжительность от указанного пункта отправления, переопределяя пункт отправления из ломаной линии.
В следующем примере в качестве исходной точки маршрута указаны координаты города Сан-Матео (Калифорния, США), задан параметр "избегать платных дорог" и установлено количество результатов поиска, равное пяти:
// Define the route polyline object using the route string. EncodedPolyline encodedPolyline = EncodedPolyline.newInstance("wblcFptchVIFOd@G@EVw@Ms@dHKR}ApNA`AF~@Hf@TjAb@bBb@~@n@p@^Rd@~@Vz@HVz@nDLt@?d@Kr@c@~@mD`G?`@aEfGkCnDuChDm`@bb@[`@{GhHeEdEciBnnBkC`DkC~DaClEuKjT_Z|l@Qb@iR~_@}EzJ_AdB_Und@kAfCaOjZkg@vcAqBzD_]rr@iBlEaBxEgArD}AlG}AhHsA`IeAnH{@dIq@dJgL~iBq@rHu@vGgAtHwArHaBhHkBzG_DpJ}Nbc@iBhGkA|EgC|LcIjb@oAhG_AvDgAdDkApC_BzCiBpCsFvGii@vn@scAxlAmLjNgSzUeRjT{TzWqExEmG|FuNlMmMhLaRvPqOlNmbAl}@mFlF{PlOmJfIoElE}LtMiSbU_H`I}}@jcAwl@vp@oAbBqA~BeAhCm@tBg@fCWrBQ~BI|DaB~rBO~D[bEa@`Dm@pDaAdE{@vC_BbEkB~Def@|z@sEzHKJeS~]}K`S{\\~l@cXpe@sBpDm@bAuCxDkBrBiC~BwCtByBnAcBx@}Bt@{Bn@gh@|LaOpDeFhAoDj@aE^kVrA_E^iEr@yD~@uBr@gMjF_EnAcCh@eFr@_DRsAD}@Jsu@xCWDqIV}BCeCOyDm@cBa@_DmA}JeE_CwAsBcBiBoBuAqBmOoX{CuEkB_CoDqDkVoUoD{CeE_DkEkC_FeCqB}@sDuAoDgAeCe@cCW}CK}BDaDTeOlBcuBrYaNlBq@Dyd@rGyFt@yBb@eBf@oCnAoBlAkIpGkAp@wBbAaCt@oFdAwKjBoGxA{FbByIjC_HfB_@KmNdDuC|@uFzBcH|C{@\\[?sBv@}@VaBVoA@y@EmAQcA[w@]aBkAeAkA}BuDUKs@uAqBsCwBcCgAiAiN_MyKsJsG{GkBaBiBuA{BwAwDkBcOaHiC_AiCg@}BQcCAcBHqBVkB`@qEjAu@LgCVgAHwG@sG?mABsH^eNr@mBXy@NqBt@uAt@aBlAkAlA}BtCyApBiAdB_BxB{A`B}@j@oAf@s@PeCVcIf@gAAkAQy@YiAo@_A{@_DgEgJqM_DeEaM}PoBiCzAsBw@kAdAGVk@f@q@z@C "); // Specify the list of fields to return. final List<Place.Field> placeFields = Arrays.asList(Place.Field.ID, Place.Field.NAME); // Define the routing modifiers object. RouteModifiers routeModifiers = RouteModifiers.builder() .setAvoidTolls(true) .build(); // Define the routing parameters object and pass the routing origin. // Set the travel mode to DRIVE. // Pass the routeModifiers object. RoutingParameters routingParameters = RoutingParameters.builder() .setOrigin(toLatLng("37.56617, -122.30870")) .setTravelMode(DRIVE) .setRouteModifiers(routeModifiers) .build(); // Define the search along route parameters object and pass the polyline object. SearchAlongRouteParameters searchAlongRouteParameters = SearchAlongRouteParameters.builder() .setPolyline(encodedPolyline) .build(); // Use the builder to create a SearchByTextRequest object and pass the search along route parameters. final SearchByTextRequest searchByTextRequest = SearchByTextRequest.builder("Spicy Vegetarian Food", placeFields) .setMaxResultCount(5) .setRoutingParameters(routingParameters) .setSearchAlongRouteParameters(searchAlongRouteParameters) .setRoutingSummariesIncluded(true) .build(); // Call PlacesClient.searchByText() to perform the search. // Define a response handler to process the returned List of Place objects. placesClient.searchByText(searchByTextRequest) .addOnSuccessListener(response -> { List<Place> places = response.getPlaces(); List<RoutingSummary> routingSummaries = result.getRoutingSummaries(); List<Leg> legs = routingSummaries.get(0).getLegs(); Duration duration = legs.get(0).getDuration(); });
На изображении ниже показана карта с ломаной линией маршрута, новым пунктом отправления (светло-голубой маркер) и местами из результатов поиска (зеленые маркеры). Обратите внимание, что все результаты находятся вдоль маршрута, но за пределами Сан-Матео: