puzhibing
2026-03-04 a6f0b69caf5c1913b6fec8b94d2454b33d15d649
修改mongodb查询
1个文件已删除
4个文件已修改
234 ■■■■■ 已修改文件
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
@@ -5,12 +5,11 @@
import com.xiaopeng.itinerary.repository.XpGeoQueryEntityRepository;
import com.xiaopeng.itinerary.service.IXpGeoQueryEntityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Circle;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
@@ -18,6 +17,7 @@
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * MongoDB 地理查询服务实现类
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java
File was deleted
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
@@ -3,8 +3,11 @@
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.map.RouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
import com.xiaopeng.api.feignClient.order.XpOrderClient;
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.vo.map.PointByIpVo;
import com.xiaopeng.api.vo.map.XpDistanceAndDurationVo;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
@@ -13,6 +16,7 @@
import com.xiaopeng.map.mangodb.service.XpGeoFencingPolygonService;
import com.xiaopeng.map.utils.AmapWalkingRouteUtil;
import com.xiaopeng.map.utils.GDMapGeocodingUtil;
import com.xiaopeng.map.utils.mangoUtils.MongoGeoFenceUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +29,7 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@RestController
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
@@ -5,11 +5,9 @@
import com.xiaopeng.operation.repository.XpGeoQueryEntityRepository;
import com.xiaopeng.operation.service.IXpGeoQueryEntityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.Point;
import org.springframework.data.geo.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query;
@@ -52,37 +50,48 @@
        calendar.add(Calendar.DAY_OF_YEAR, -7);
        Long startTime = calendar.getTime().getTime();
        // 1. 创建查询点
        Point referencePoint = new Point(longitude, latitude);
        // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
        NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
                .maxDistance(0.5)  // 转成公里
                .spherical(true);
        // 3.时间>startTime time = time参数
        // 3. 创建额外的查询条件
        Query query = new Query();
//        // 1. 创建查询点
//        Point referencePoint = new Point(longitude, latitude);
//
//        // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
//        NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
//                .maxDistance(0.5)  // 转成公里
//                .spherical(true);
//
//
//        // 3.时间>startTime time = time参数
//        // 3. 创建额外的查询条件
//        Query query = new Query();
//        query.addCriteria(Criteria.where("timestamp").gte(startTime));
//        query.addCriteria(Criteria.where("time").is(time));
//
//        // 将 NearQuery 和额外的查询条件合并
//        nearQuery.query(query);
//
//
//        // 4. 执行查询 - 明确指定集合名
//        GeoResults<XpGeoQueryEntity> geoResults = mongoTemplate.geoNear(
//                nearQuery,
//                XpGeoQueryEntity.class,
//                "xp_geo_query_entity"  // 明确指定集合名,避免映射错误
//        );
//
//        // 5. 提取结果
//        return geoResults.getContent().stream()
//                .map(geoResult -> geoResult.getContent())
//                .collect(Collectors.toList());
        //找到中心点
        GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
        //构造半径
        Distance distanceR = new Distance(0.5, Metrics.KILOMETERS);
        //画圆
        Circle circle = new Circle(geoJsonPoint, distanceR);
        // 构造query对象
        Query query = Query.query(Criteria.where("location").withinSphere(circle));
        query.addCriteria(Criteria.where("timestamp").gte(startTime));
        query.addCriteria(Criteria.where("time").is(time));
        // 将 NearQuery 和额外的查询条件合并
        nearQuery.query(query);
        // 4. 执行查询 - 明确指定集合名
        GeoResults<XpGeoQueryEntity> geoResults = mongoTemplate.geoNear(
                nearQuery,
                XpGeoQueryEntity.class,
                "xp_geo_query_entity"  // 明确指定集合名,避免映射错误
        );
        // 5. 提取结果
        return geoResults.getContent().stream()
                .map(geoResult -> geoResult.getContent())
                .collect(Collectors.toList());
        List<XpGeoQueryEntity> xpGeoQueryEntities = mongoTemplate.find(query, XpGeoQueryEntity.class);
        return xpGeoQueryEntities;
    }
    /**
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
@@ -2,11 +2,9 @@
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import org.springframework.data.domain.Sort;
import org.springframework.data.geo.GeoResults;
import org.springframework.data.geo.Point;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Metrics;
import org.springframework.data.geo.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.NearQuery;
import org.springframework.data.mongodb.core.query.Query;
@@ -33,27 +31,37 @@
                                                             double latitude,
                                                             double distanceInMeters,int num) {
        try {
            // 1. 创建查询点
            Point referencePoint = new Point(longitude, latitude);
//            // 1. 创建查询点
//            Point referencePoint = new Point(longitude, latitude);
//
//            // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
//            NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
//                    .maxDistance(distanceInMeters / 1000)  // 转成公里
//                    .spherical(true);
//
//
//            // 4. 执行查询 - 明确指定集合名
//            GeoResults<VehiclePosition> geoResults = mongoTemplate.geoNear(
//                    nearQuery,
//                    VehiclePosition.class,
//                    "vehicle_position"  // 明确指定集合名,避免映射错误
//            );
//
//            // 5. 提取结果
//            return geoResults.getContent().stream()
//                    .map(geoResult -> geoResult.getContent())
//                    .collect(Collectors.toList());
            // 2. 构建 NearQuery - 完全使用 NearQuery 的 API
            NearQuery nearQuery = NearQuery.near(referencePoint, Metrics.KILOMETERS)
                    .maxDistance(distanceInMeters / 1000)  // 转成公里
                    .spherical(true);
            // 4. 执行查询 - 明确指定集合名
            GeoResults<VehiclePosition> geoResults = mongoTemplate.geoNear(
                    nearQuery,
                    VehiclePosition.class,
                    "vehicle_position"  // 明确指定集合名,避免映射错误
            );
            // 5. 提取结果
            return geoResults.getContent().stream()
                    .map(geoResult -> geoResult.getContent())
                    .collect(Collectors.toList());
            //找到中心点
            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
            //构造半径
            Distance distanceR = new Distance(distanceInMeters / 1000, Metrics.KILOMETERS);
            //画圆
            Circle circle = new Circle(geoJsonPoint, distanceR);
            // 构造query对象
            Query query = Query.query(Criteria.where("point").withinSphere(circle));
            List<VehiclePosition> vehiclePositions = mongoTemplate.find(query, VehiclePosition.class);
            return vehiclePositions;
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>();