From a6f0b69caf5c1913b6fec8b94d2454b33d15d649 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期六, 07 三月 2026 21:00:56 +0800
Subject: [PATCH] 修改mongodb查询
---
/dev/null | 92 -----------------------
xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java | 6
xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java | 5 +
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java | 56 ++++++++------
xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java | 75 ++++++++++--------
5 files changed, 82 insertions(+), 152 deletions(-)
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
index fa0c729..e084621 100644
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/service/impl/XpGeoQueryEntityServiceImpl.java
+++ b/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 地理查询服务实现类
diff --git a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java b/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java
deleted file mode 100644
index df3ffa6..0000000
--- a/xp-robotaxi-itinerary-boot/src/main/java/com/xiaopeng/itinerary/utils/mango/VehiclePositionService.java
+++ /dev/null
@@ -1,92 +0,0 @@
-package com.xiaopeng.itinerary.utils.mango;
-
-import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
-import org.springframework.data.domain.Sort;
-import org.springframework.data.geo.GeoResults;
-import org.springframework.data.geo.Metrics;
-import org.springframework.data.geo.Point;
-import org.springframework.data.mongodb.core.MongoTemplate;
-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 {
-
- @Resource
- private MongoTemplate mongoTemplate;
-
- /**
- * 查询附近指定距离内且状态正常的车辆
- * @param longitude 经度
- * @param latitude 纬度
- * @param distanceInMeters 距离(米)
- * @return 符合条件的车辆列表
- */
- public List<VehiclePosition> findAvailableVehiclesNearby(double longitude,
- double latitude,
- double distanceInMeters,int num) {
- try {
- // 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());
-
- } catch (Exception e) {
- e.printStackTrace();
- return new ArrayList<>();
- }
- }
-
-
- /**
- * 根据车辆ID查询车辆信息
- * @param vehicleId 车辆ID
- * @return 车辆信息,不存在则返回null
- */
- public VehiclePosition findByVehicleId(Long vehicleId) {
- Query query = new Query();
- query.addCriteria(Criteria.where("vehicle_id").is(vehicleId));
- return mongoTemplate.findOne(query, VehiclePosition.class);
- }
-
-
- /**
- * 所有的车辆
- */
- public List<VehiclePosition> findAll() {
-
- // 构建查询条件
- Query query = new Query();
- query.addCriteria(Criteria.where("status").is(1)); // 运营中
- query.addCriteria(Criteria.where("state").is(1)); // 接单中
-
- // 可以添加排序,按距离排序
- query.with(Sort.by(Sort.Direction.ASC, "point"));
-
- return mongoTemplate.find(query, VehiclePosition.class);
- }
-
-}
\ No newline at end of file
diff --git a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java b/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
index 26f640a..1365c3b 100644
--- a/xp-robotaxi-map-boot/src/main/java/com/xiaopeng/map/controller/XpMapController.java
+++ b/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
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
index 3740056..1b5f6b9 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpGeoQueryEntityServiceImpl.java
+++ b/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;
}
/**
diff --git a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java b/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
index 5fc94c8..fed8f2a 100644
--- a/xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/utils/mango/VehiclePositionService.java
+++ b/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<>();
--
Gitblit v1.7.1