Commit 54219c69 authored by hanbing's avatar hanbing

[add] 快速特勤,判断点位是否合法

parent 6aae9be5
package net.wanji.web.bo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author Kent HAN
* @date 2023/5/17 13:36
*/
@Data
public class IsValidPointBO {
@ApiModelProperty(value = "点位坐标,格式:112.968523,28.179455")
private String lonLat;
}
......@@ -7,6 +7,7 @@ import io.swagger.annotations.ApiResponses;
import net.wanji.common.annotation.aspect.AspectLog;
import net.wanji.common.enums.BaseEnum;
import net.wanji.common.framework.rest.JsonViewObject;
import net.wanji.web.bo.IsValidPointBO;
import net.wanji.web.bo.SpecialServiceRouteBO;
import net.wanji.web.common.exception.CrossRelationException;
import net.wanji.web.service.SpecialServiceService;
......@@ -35,6 +36,16 @@ public class SpecialServiceController {
@Autowired
SpecialServiceService specialServiceService;
@AspectLog(description = "查询地图点位是否可选", operationType = BaseEnum.OperationTypeEnum.QUERY)
@ApiOperation(value = "查询地图点位是否可选", notes = "查询地图点位是否可选", response = JsonViewObject.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
@PostMapping(value = "/isValidPoint",
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
public JsonViewObject isValidPoint(@RequestBody IsValidPointBO isValidPointBO) {
specialServiceService.isValidPoint(isValidPointBO);
return JsonViewObject.newInstance().success();
}
@AspectLog(description = "备选路线推送", operationType = BaseEnum.OperationTypeEnum.QUERY)
@ApiOperation(value = "备选路线推送", notes = "备选路线推送", response = RouteElementVO.class,
produces = MediaType.APPLICATION_JSON, consumes = MediaType.APPLICATION_JSON)
......
package net.wanji.web.service;
import net.wanji.web.bo.IsValidPointBO;
import net.wanji.web.bo.SpecialServiceRouteBO;
import net.wanji.web.vo.RouteElementVO;
import net.wanji.web.vo.specialService.*;
......@@ -35,4 +36,6 @@ public interface SpecialServiceService {
Set<String> crossInList(String crossId);
List<List<RouteElementVO>> specialServiceRoute(SpecialServiceRouteBO specialServiceRouteBO);
void isValidPoint(IsValidPointBO isValidPointBO);
}
package net.wanji.web.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.wanji.common.gts.GeometryUtil;
import net.wanji.common.gts.GeomsConvertUtil;
import net.wanji.common.gts.service.GtsService;
import net.wanji.common.utils.tool.CrossUtil;
import net.wanji.databus.dao.entity.RidInfoEntity;
......@@ -12,6 +15,7 @@ import net.wanji.databus.dao.mapper.CrossDirDataRealtimeMapper;
import net.wanji.databus.dao.mapper.RidInfoMapper;
import net.wanji.databus.po.BaseCrossInfoPO;
import net.wanji.databus.po.TBaseCrossInfo;
import net.wanji.web.bo.IsValidPointBO;
import net.wanji.web.bo.SpecialServiceRouteBO;
import net.wanji.web.common.enums.CrossDirEnum;
import net.wanji.web.common.enums.CrossPhasePlanTurnTypeEnum;
......@@ -26,6 +30,7 @@ import net.wanji.web.service.SpecialServiceService;
import net.wanji.web.vo.RouteElementVO;
import net.wanji.web.vo.specialService.*;
import org.jetbrains.annotations.NotNull;
import org.locationtech.jts.geom.Geometry;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -344,11 +349,13 @@ public class SpecialServiceServiceImpl implements SpecialServiceService {
List<RidInfoEntity> ridInfoEntities = ridInfoMapper.selectAll();
// 获取起点经纬度与rid连线相交的路段
String startLonLat = specialServiceRouteBO.getStartLonLat();
String startBuffer = gtsService.buffer(startLonLat, 50); // 起点50米范围内
Geometry startGeometry = GeometryUtil.str2Geometry(startLonLat);
Set<String> startRidPoints = new HashSet<>();
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
String ridLine = ridInfoEntity.getWkt();
boolean isIntersect = gtsService.intersects(startBuffer, ridLine);
Geometry ridLineGeometry = GeometryUtil.str2Geometry(ridLine);
Geometry ridLineBuf = GeomsConvertUtil.getGeometryBuf(ridLineGeometry, "50.0");
boolean isIntersect = ridLineBuf.intersects(startGeometry);
if (isIntersect) {
String startCrossId = ridInfoEntity.getStartCrossId();
String endCrossId = ridInfoEntity.getEndCrossId();
......@@ -373,11 +380,13 @@ public class SpecialServiceServiceImpl implements SpecialServiceService {
// 获取终点经纬度与rid连线相交的路段
String endLonLat = specialServiceRouteBO.getEndLonLat();
String endBuffer = gtsService.buffer(endLonLat, 50); // 终点50米范围内
Geometry endGeometry = GeometryUtil.str2Geometry(endLonLat);
Set<String> endRidPoints = new HashSet<>();
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
String ridLine = ridInfoEntity.getWkt();
boolean isIntersect = gtsService.intersects(endBuffer, ridLine);
Geometry ridLineGeometry = GeometryUtil.str2Geometry(ridLine);
Geometry ridLineBuf = GeomsConvertUtil.getGeometryBuf(ridLineGeometry, "50.0");
boolean isIntersect = ridLineBuf.intersects(endGeometry);
if (isIntersect) {
String startCrossId = ridInfoEntity.getStartCrossId();
String endCrossId = ridInfoEntity.getEndCrossId();
......@@ -433,6 +442,30 @@ public class SpecialServiceServiceImpl implements SpecialServiceService {
return null;
}
@Override
public void isValidPoint(IsValidPointBO isValidPointBO) {
String lonLat = isValidPointBO.getLonLat();
List<RidInfoEntity> ridInfoEntities = ridInfoMapper.selectAll();
// 获取点位经纬度与rid连线相交的路段
Geometry geometry = GeometryUtil.str2Geometry(lonLat);
Set<String> startRidPoints = new HashSet<>();
for (RidInfoEntity ridInfoEntity : ridInfoEntities) {
String ridLine = ridInfoEntity.getWkt();
Geometry ridLineGeometry = GeometryUtil.str2Geometry(ridLine);
Geometry ridLineBuf = GeomsConvertUtil.getGeometryBuf(ridLineGeometry, "50.0");
boolean isIntersect = ridLineBuf.intersects(geometry);
if (isIntersect) {
String startCrossId = ridInfoEntity.getStartCrossId();
String endCrossId = ridInfoEntity.getEndCrossId();
startRidPoints.add(startCrossId);
startRidPoints.add(endCrossId);
}
}
if (CollectionUtil.isEmpty(startRidPoints)) {
throw new RuntimeException("不是有效点位");
}
}
@NotNull
private List<BaseCrossInfoPO> getRouteList(BaseCrossInfoPO startCross, BaseCrossInfoPO endCross) {
String endCrossLonLatStr = getCrossLonLatStr(endCross);
......
package net.wanji.common.gts;
public class DConstant {
public static long REDIS_EXPIRE = 24*60*60;//redis 缓存过期时间24小时
// 路段间偏距100米
public static double offsetDistance = 100d;
// 1经度等于多少米
public static double rate = 85275.23012380573d;
// 1米等于多少经度
public static final double PER_METER_LONGITUDE = 1.172673469831935E-5;
// 1米等于多少纬度
public static final double PER_METER_LATITUDE = 8.983152841195202E-6;
// 1经度等于多少米
public static final double PER_LONGITUDE_METER = 85275.23012380573;
// 1纬度等于多少米
public static final double PER_LATITUDE_METER = 111319.49079327373;
// 路况数据
public static final int TRAFFIC_ROAD_STATUS_DATA = 0;
// 事件数据
public static final int TRAFFIC_EVENT_DATA = 1;
// 时间格式
public static final String DATE_FORMAT_STYLE = "yyyy-MM-dd HH:mm:ss";
// 超级用户
public static final String SUPER_ACCOUNT_ACCESS = "MapABC_AdMiN";//"MapABC_AdMiN";
// 超级用户密码
public static final String SUPER_ACCOUNT_ACCESS_PWD = "C3tp57";//"C3tp57";
public static final String DATA_SAVE_POOL_ID="dataSavePool";
public static final String MULTILINESTRING = "MULTILINESTRING";
public static final String LINESTRING = "LINESTRING";
public static final String POLICE_REAL_TIME_TABLE="";
public static final String REDIS_JGDATA_TJ = "REDIS_JGDATA_TJ";
public static final String TP_DATA_PREFIX = "TPSERVICE_PROXY";
public static final String OPLR_JSON = "json";
public static final String OPLR_PROTOBUF = "protobuf";
}
package net.wanji.common.gts;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.locationtech.jts.geom.Point;
import java.util.List;
public class Global {
private static double EARTH_RADIUS = 6378.137;//地球半径
private static double rad(double d)
{
return d * Math.PI / 180.0;
}
public static double calDist(double[] dimA,double[] dimB){
// ����
double b = rad(dimA[0]) - rad(dimB[0]);
//
double radLat1 = rad(dimA[1]);
double radLat2 = rad(dimB[1]);
double a = radLat1 - radLat2;
double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
s = s * EARTH_RADIUS;
s = Math.round(s * 10000) / 10;
return s;
}
public static double[] getCenterPoint(List<double[]> points){
if(points.size()==1){
return points.get(0);
}
GeometryFactory fact = new GeometryFactory();
Geometry read = fact.createPoint(new Coordinate(points.get(0)[0],points.get(0)[1]));
Geometry readB = fact.createPoint(new Coordinate(points.get(1)[0],points.get(1)[1]));
Geometry union = read.union(readB);
for (int i = 2; i < points.size(); i++) {
double[] ds = points.get(i);
readB = fact.createPoint(new Coordinate(ds[0],ds[1]));
union = union.union(readB);
}
Point centroid = union.getCentroid();
double[] a = {centroid.getX(),centroid.getY()};
return a;
}
/**
* 非汉字长度
* @param str
* @return
*/
public static int getLength(String str){
str = str.replaceAll("[^x00-xff]*" , "");
System.out.println(str);
return str.length();
}
public static void main(String[] args) {
System.out.println(calDist(new double[]{114.253631,30.633866},new double[]{114.249275,30.580874}));
//
// List<double[]> points = new ArrayList<double[]>();
// points.add(new double[]{101.69547300,32.91083000});
// points.add(new double[]{102.69547300,32.91083000});
// System.out.println(StringUtils.join(new double[]{101.69547300,32.91083000}, ";"));
// System.out.println();
System.out.println(getLength("****1*"));
// List<double[]> points = new ArrayList<double[]>();
// String[] a = "116.345208,39.853326;116.344559,39.851341;116.345369,39.851358;116.345187,39.853194;116.34435,39.851069;116.343256,39.852733;116.341488,39.852148;116.344135,39.85097;116.345337,39.851481;116.34508,39.851695;116.343804,39.85226;116.344816,39.853199;116.343899,39.853153;116.345133,39.853025;116.344722,39.851427;116.34627,39.849331;116.345476,39.853116;116.341303,39.852255".split(";");
// for (int i = 0; i < a.length; i++) {
// points.add(new double[]{Double.parseDouble(a[i].split(",")[0]),Double.parseDouble(a[i].split(",")[1])});
// }
//
// double[] point = Global.getCenterPoint(points);
// System.out.println(point[0] + ";" + point[1]);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment