puzhibing
2026-03-06 edb1742eef5994c58041f24eba561b2ad4087ec1
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
@@ -2,15 +2,17 @@
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
import org.springframework.data.domain.Sort;
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;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
@Service
public class VehiclePositionService {
@@ -22,32 +24,48 @@
     * 查询附近指定距离内且状态正常的车辆
     * @param longitude 经度
     * @param latitude 纬度
     * @param distanceInMeters 距离(米)
     * @param distanceInMeters 距离(KM)
     * @return 符合条件的车辆列表
     */
    public List<VehiclePosition> findAvailableVehiclesNearby(double longitude,
                                                             double latitude,
                                                             double distanceInMeters,int num) {
        try {
            // 创建查询点
            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());
            // 构建查询条件
            Query query = new Query();
            // 地理位置查询
            query.addCriteria(Criteria.where("point")
                    .near(referencePoint)
                    .maxDistance(distanceInMeters));
            query.with(Sort.by(Sort.Direction.ASC, "point"));
            return mongoTemplate.find(query, VehiclePosition.class);
        }catch (Exception e){
            //找到中心点
            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
            //构造半径
            Distance distanceR = new Distance(distanceInMeters, 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<>();
        }
        return null;
    }