package com.xiaopeng.map.controller; import com.xiaopeng.api.dto.map.RouteAndFareDto; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.vo.map.XpDistanceAndDurationVo; import com.xiaopeng.api.vo.operation.RouteVo; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.map.utils.GDMapGeocodingUtil; import com.xiaopeng.map.utils.mangoUtils.MongoGeoFenceUtil; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/base/v1/mini-program") @Api(tags = "地图调用服务") public class XpMapController { private final GDMapGeocodingUtil gdMapGeocodingUtil; private final MongoGeoFenceUtil mongoGeoFenceUtil; public XpMapController(GDMapGeocodingUtil gdMapGeocodingUtil, MongoGeoFenceUtil mongoGeoFenceUtil) { this.gdMapGeocodingUtil = gdMapGeocodingUtil; this.mongoGeoFenceUtil = mongoGeoFenceUtil; } @PostMapping("/map/getDistanceAndDuration") public R getDistanceAndDuration(@RequestBody RouteAndFareDto dto){ // 获取电子围栏的禁行区域点位 MongoGeoFenceUtil.GeoPoint startPoint = new MongoGeoFenceUtil.GeoPoint(dto.getOrigin().getLongitude(),dto.getOrigin().getLatitude()); List operatingArea = mongoGeoFenceUtil.findFencesContainingPoint(startPoint, "operating_area", "points"); String fenceId = operatingArea.get(0); // List pointsInFence = mongoGeoFenceUtil.findPointsInFence(fenceId, "parentId", "prohibited_area"); List pointsInFence = mongoGeoFenceUtil.findPointsByParentId(fenceId, "parentId", "prohibited_area"); List avoidRoads = pointsInFence.stream().map(point -> new LonLatDto(point.getDouble("longitude"), point.getDouble("latitude"))).collect(Collectors.toList()); RouteVo routeVo = gdMapGeocodingUtil.getDistanceAndTime(dto.getOrigin(), dto.getDestination(), avoidRoads, fenceId); if(routeVo==null){ return R.fail("没有找到路线"); } return R.ok(); } }