From cc6ed2e5df45bd8b973ae91035697baa3c9e5723 Mon Sep 17 00:00:00 2001 From: attiya <2413103649@qq.com> Date: Mon, 12 May 2025 15:39:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=97=E6=B3=95=E4=BF=AE=E5=A4=8D=E3=80=81?= =?UTF-8?q?=E7=AB=99=E7=82=B9=E5=8C=BA=E5=9F=9F=E7=AE=97=E6=B3=95=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cdzy/ebikeoperate/utils/RedisUtil.java | 46 ++++++++++++++----- .../service/impl/UserOrdersServiceImpl.java | 4 +- .../java/com/cdzy/orders/uitls/RedisUtil.java | 42 +++++++++++++---- 3 files changed, 68 insertions(+), 24 deletions(-) diff --git a/ebike-operate/src/main/java/com/cdzy/ebikeoperate/utils/RedisUtil.java b/ebike-operate/src/main/java/com/cdzy/ebikeoperate/utils/RedisUtil.java index 3ba32759..4b114a19 100644 --- a/ebike-operate/src/main/java/com/cdzy/ebikeoperate/utils/RedisUtil.java +++ b/ebike-operate/src/main/java/com/cdzy/ebikeoperate/utils/RedisUtil.java @@ -254,24 +254,24 @@ public class RedisUtil { * @param candidateAreaIds 附近停车区id列表 * @return 停车区id */ - public String checkPointInArea(double lng, double lat, List candidateAreaIds,Long orgId) { + public String checkPointInArea(double lng, double lat, List candidateAreaIds,Long areaId) { Coordinate userCoordinate = new Coordinate(lng, lat); org.locationtech.jts.geom.Point userPoint = GEOMETRY_FACTORY.createPoint(userCoordinate); - for (String areaId : candidateAreaIds) { + for (String regionId : candidateAreaIds) { // 获取 MBR - String mbrStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + orgId, "mbr"+areaId); + String mbrStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + areaId, "mbr"+regionId); double[] mbr = parseMBR(mbrStr); // MBR 快速过滤 if (lng >= mbr[0] && lng <= mbr[2] && lat >= mbr[1] && lat <= mbr[3]) { // 获取顶点数据 - String verticesStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + orgId, "vertices"+areaId); + String verticesStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + areaId, "vertices"+regionId); Polygon polygon = parsePolygon(verticesStr); // 精确判断 if (polygon.contains(userPoint)) { - return areaId; + return regionId; } } } @@ -284,18 +284,40 @@ public class RedisUtil { * @param lat 纬度 * @return true-在内部;false-在外部或边界上(根据业务需求调整) */ - public boolean isPointInParking(double lng, double lat,Long orgId) { + public boolean isPointInParking(double lng, double lat,Long areaId) { //查询附近停车区 - List nearbyParking = findNearbyParking(lng, lat,orgId); + List nearbyParking = findNearbyParking(lng, lat,areaId); if (nearbyParking.isEmpty()) { return false; } //获取第一个包含该点位的停车区 - String areaId = checkPointInArea(lng, lat, nearbyParking,orgId); - if (areaId == null) { + String regionId = checkPointInArea(lng, lat, nearbyParking,areaId); + if (regionId == null) { return false; } - String polygonFromWKT = getPolygonFromWKT(orgId,areaId,"parking_area:meta:"); + String polygonFromWKT = getPolygonFromWKT(areaId,regionId,"parking_area:meta:"); + Polygon polygon = parsePolygonFromWKT(polygonFromWKT); + return isPointInPolygon(lng, lat, polygon); + } + + /** + * 判断坐标点是否在附近站点区内 + * @param lng 经度 + * @param lat 纬度 + * @return true-在内部;false-在外部或边界上(根据业务需求调整) + */ + public boolean isPointInSite(double lng, double lat,Long areaId) { + //查询附近停车区 + List nearbyParking = findNearbyParking(lng, lat,areaId); + if (nearbyParking.isEmpty()) { + return false; + } + //获取第一个包含该点位的停车区 + String regionId = checkPointInArea(lng, lat, nearbyParking,areaId); + if (regionId == null) { + return false; + } + String polygonFromWKT = getPolygonFromWKT(areaId,regionId,"parking_area:meta:"); Polygon polygon = parsePolygonFromWKT(polygonFromWKT); return isPointInPolygon(lng, lat, polygon); } @@ -349,8 +371,8 @@ public class RedisUtil { * 获取 WKT 格 * @param areaId areaId */ - public String getPolygonFromWKT(Long orgId,String areaId,String key) { - return "POLYGON ((" + (String)redisTemplate.opsForHash().get(key + orgId, "vertices"+areaId)+"))"; + public String getPolygonFromWKT(Long suffixId,String areaId,String key) { + return "POLYGON ((" + (String)redisTemplate.opsForHash().get(key + suffixId, "vertices"+areaId)+"))"; } /** diff --git a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java index 910dc887..db498df3 100644 --- a/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java +++ b/ebike-orders/src/main/java/com/cdzy/orders/service/impl/UserOrdersServiceImpl.java @@ -288,7 +288,7 @@ public class UserOrdersServiceImpl extends ServiceImpl candidateAreaIds,Long orgId) { + public String checkPointInArea(double lng, double lat, List candidateAreaIds,Long areaId) { Coordinate userCoordinate = new Coordinate(lng, lat); org.locationtech.jts.geom.Point userPoint = GEOMETRY_FACTORY.createPoint(userCoordinate); - for (String areaId : candidateAreaIds) { + for (String regionId : candidateAreaIds) { // 获取 MBR - String mbrStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + orgId, "mbr"+areaId); + String mbrStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + areaId, "mbr"+regionId); double[] mbr = parseMBR(mbrStr); // MBR 快速过滤 if (lng >= mbr[0] && lng <= mbr[2] && lat >= mbr[1] && lat <= mbr[3]) { // 获取顶点数据 - String verticesStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + orgId, "vertices"+areaId); + String verticesStr = (String) redisTemplate.opsForHash().get("parking_area:meta:" + areaId, "vertices"+regionId); Polygon polygon = parsePolygon(verticesStr); // 精确判断 if (polygon.contains(userPoint)) { - return areaId; + return regionId; } } } @@ -215,18 +215,40 @@ public class RedisUtil { * @param lat 纬度 * @return true-在内部;false-在外部或边界上(根据业务需求调整) */ - public boolean isPointInParking(double lng, double lat,Long orgId) { + public boolean isPointInParking(double lng, double lat,Long areaId) { //查询附近停车区 - List nearbyParking = findNearbyParking(lng, lat,orgId); + List nearbyParking = findNearbyParking(lng, lat,areaId); if (nearbyParking.isEmpty()) { return false; } //获取第一个包含该点位的停车区 - String areaId = checkPointInArea(lng, lat, nearbyParking,orgId); - if (areaId == null) { + String regionId = checkPointInArea(lng, lat, nearbyParking,areaId); + if (regionId == null) { return false; } - String polygonFromWKT = getPolygonFromWKT(orgId,areaId,"parking_area:meta:"); + String polygonFromWKT = getPolygonFromWKT(areaId,regionId,"parking_area:meta:"); + Polygon polygon = parsePolygonFromWKT(polygonFromWKT); + return isPointInPolygon(lng, lat, polygon); + } + + /** + * 判断坐标点是否在附近站点区内 + * @param lng 经度 + * @param lat 纬度 + * @return true-在内部;false-在外部或边界上(根据业务需求调整) + */ + public boolean isPointInSite(double lng, double lat,Long areaId) { + //查询附近停车区 + List nearbyParking = findNearbyParking(lng, lat,areaId); + if (nearbyParking.isEmpty()) { + return false; + } + //获取第一个包含该点位的停车区 + String regionId = checkPointInArea(lng, lat, nearbyParking,areaId); + if (regionId == null) { + return false; + } + String polygonFromWKT = getPolygonFromWKT(areaId,regionId,"parking_area:meta:"); Polygon polygon = parsePolygonFromWKT(polygonFromWKT); return isPointInPolygon(lng, lat, polygon); }