Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
traffic-signal-platform
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
signal
traffic-signal-platform
Commits
60e346f0
Commit
60e346f0
authored
Oct 13, 2023
by
hanbing
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[update] 场景评价--增加失衡、溢出处理方式
parent
7a79347f
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
137 additions
and
10 deletions
+137
-10
SceneEvaluateController.java
...ava/net/wanji/opt/controller/SceneEvaluateController.java
+14
-4
SceneEvaluateService.java
...main/java/net/wanji/opt/service/SceneEvaluateService.java
+4
-4
SceneEvaluateServiceImpl.java
.../net/wanji/opt/service/impl/SceneEvaluateServiceImpl.java
+91
-1
SceneEvaluateAbnormalDetailVO.java
.../java/net/wanji/opt/vo/SceneEvaluateAbnormalDetailVO.java
+1
-1
SceneEvaluateHeatMapVO.java
...rc/main/java/net/wanji/opt/vo/SceneEvaluateHeatMapVO.java
+27
-0
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/controller/SceneEvaluateController.java
View file @
60e346f0
...
...
@@ -6,14 +6,12 @@ import io.swagger.annotations.ApiResponse;
import
io.swagger.annotations.ApiResponses
;
import
net.wanji.common.framework.rest.JsonViewObject
;
import
net.wanji.databus.bo.CrossIdAndStartEndDateBO
;
import
net.wanji.databus.bo.HeatMapBO
;
import
net.wanji.opt.bo.AbnormalDetailBO
;
import
net.wanji.opt.bo.MetricsTurnAndLaneBO
;
import
net.wanji.opt.bo.SceneMetricsDetailBO
;
import
net.wanji.opt.service.impl.SceneEvaluateServiceImpl
;
import
net.wanji.opt.vo.SceneEvaluateAbnormalDetailVO
;
import
net.wanji.opt.vo.SceneEvaluateAbnormalDistributeVO
;
import
net.wanji.opt.vo.SceneEvaluateMetricsLaneVO
;
import
net.wanji.opt.vo.SceneEvaluateMetricsTurnVO
;
import
net.wanji.opt.vo.*
;
import
net.wanji.opt.vo.SceneMetricsDetailVO
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.RequestBody
;
...
...
@@ -101,4 +99,16 @@ public class SceneEvaluateController {
SceneEvaluateMetricsLaneVO
res
=
sceneEvaluateService
.
metricsLane
(
bo
);
return
JsonViewObject
.
newInstance
().
success
(
res
);
}
@ApiOperation
(
value
=
"场景评价热力图"
,
notes
=
"场景评价热力图"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@PostMapping
(
value
=
"/heatMap"
,
produces
=
MediaType
.
APPLICATION_JSON
,
consumes
=
MediaType
.
APPLICATION_JSON
)
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
SceneEvaluateHeatMapVO
.
class
),
})
public
JsonViewObject
heatMap
(
@RequestBody
HeatMapBO
bo
)
{
List
<
SceneEvaluateHeatMapVO
>
res
=
sceneEvaluateService
.
heatMap
(
bo
);
return
JsonViewObject
.
newInstance
().
success
(
res
);
}
}
\ No newline at end of file
signal-optimize-service/src/main/java/net/wanji/opt/service/SceneEvaluateService.java
View file @
60e346f0
package
net
.
wanji
.
opt
.
service
;
import
net.wanji.databus.bo.CrossIdAndStartEndDateBO
;
import
net.wanji.databus.bo.HeatMapBO
;
import
net.wanji.opt.bo.AbnormalDetailBO
;
import
net.wanji.opt.bo.MetricsTurnAndLaneBO
;
import
net.wanji.opt.bo.SceneMetricsDetailBO
;
import
net.wanji.opt.vo.SceneEvaluateAbnormalDetailVO
;
import
net.wanji.opt.vo.SceneEvaluateAbnormalDistributeVO
;
import
net.wanji.opt.vo.SceneEvaluateMetricsLaneVO
;
import
net.wanji.opt.vo.SceneEvaluateMetricsTurnVO
;
import
net.wanji.opt.vo.*
;
import
net.wanji.opt.vo.SceneMetricsDetailVO
;
import
java.lang.reflect.InvocationTargetException
;
...
...
@@ -25,4 +23,6 @@ public interface SceneEvaluateService {
SceneEvaluateMetricsTurnVO
metricsTurn
(
MetricsTurnAndLaneBO
bo
)
throws
ParseException
;
SceneEvaluateMetricsLaneVO
metricsLane
(
MetricsTurnAndLaneBO
bo
)
throws
ParseException
;
List
<
SceneEvaluateHeatMapVO
>
heatMap
(
HeatMapBO
bo
);
}
signal-optimize-service/src/main/java/net/wanji/opt/service/impl/SceneEvaluateServiceImpl.java
View file @
60e346f0
...
...
@@ -9,6 +9,7 @@ import net.wanji.common.enums.StrategyAndMetricsEnum;
import
net.wanji.common.utils.tool.CrossUtil
;
import
net.wanji.common.utils.tool.TimeArrayUtil
;
import
net.wanji.databus.bo.CrossIdAndStartEndDateBO
;
import
net.wanji.databus.bo.HeatMapBO
;
import
net.wanji.databus.dao.entity.BaseCrossSchemePO
;
import
net.wanji.databus.dao.entity.CrossSectionPO
;
import
net.wanji.databus.dao.mapper.*
;
...
...
@@ -29,6 +30,7 @@ import java.lang.reflect.Method;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -193,7 +195,7 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
vo
.
setStartTime
(
startTime
);
vo
.
setTimeline
(
getTimeline
(
startTime
,
newEndTime
));
//
todo 暂时只有拥堵,后期扩展考虑增加字段
//
只有拥堵显示
if
(
Objects
.
equals
(
status
,
CrossStatusEnum
.
CONGESTION
.
getCode
()))
{
Integer
delayTime
=
calcCrossDelayTime
(
sceneCrossDataHistPOList
);
Integer
level
=
calcCongestionLevel
(
delayTime
);
...
...
@@ -204,6 +206,12 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
if
(
Objects
.
equals
(
status
,
CrossStatusEnum
.
CONGESTION
.
getCode
()))
{
String
congestionDirs
=
crossDataHistPO
.
getCongestionDirs
();
vo
.
setDirs
(
buildDirs
(
congestionDirs
));
}
else
if
(
Objects
.
equals
(
status
,
CrossStatusEnum
.
UNBALANCE
.
getCode
()))
{
String
unbalanceDirs
=
crossDataHistPO
.
getUnbalanceDirs
();
vo
.
setDirs
(
buildDirs
(
unbalanceDirs
));
}
else
if
(
Objects
.
equals
(
status
,
CrossStatusEnum
.
SPILLOVER
.
getCode
()))
{
String
spilloverDirs
=
crossDataHistPO
.
getSpilloverDirs
();
vo
.
setDirs
(
buildDirs
(
spilloverDirs
));
}
// 查找当前路口全部方案
...
...
@@ -394,6 +402,88 @@ public class SceneEvaluateServiceImpl implements SceneEvaluateService {
return
res
;
}
@Override
public
List
<
SceneEvaluateHeatMapVO
>
heatMap
(
HeatMapBO
bo
)
{
String
crossId
=
bo
.
getCrossId
();
Date
startDate
=
bo
.
getStartDate
();
Date
endDate
=
bo
.
getEndDate
();
endDate
=
DateUtil
.
offsetDay
(
endDate
,
1
);
// 包含最后一天
int
startStamp
=
(
int
)
(
startDate
.
getTime
()
/
1000
);
// 10位时间戳
int
endStamp
=
(
int
)
(
endDate
.
getTime
()
/
1000
);
Integer
status
=
bo
.
getStatus
();
List
<
SceneEvaluateHeatMapVO
>
res
=
new
ArrayList
<>();
List
<
CrossDataHistPO
>
crossDataHistPOList
=
crossDataHistMapper
.
selectByCrossIdAndStartEnd
(
crossId
,
startStamp
,
endStamp
);
// 根据 status 值选择分组字段
Function
<
CrossDataHistPO
,
String
>
groupByField
;
switch
(
status
)
{
case
1
:
groupByField
=
CrossDataHistPO:
:
getUnbalanceDirs
;
break
;
case
2
:
groupByField
=
CrossDataHistPO:
:
getCongestionDirs
;
break
;
case
3
:
groupByField
=
CrossDataHistPO:
:
getSpilloverDirs
;
break
;
default
:
throw
new
IllegalArgumentException
(
"状态值非法"
);
}
// 过滤 status 字段值为 status 变量的对象,并按照方向分组
Map
<
String
,
List
<
CrossDataHistPO
>>
grouped
=
crossDataHistPOList
.
stream
()
.
flatMap
(
po
->
{
String
dirs
=
""
;
if
(
status
==
1
)
{
dirs
=
po
.
getUnbalanceDirs
();
}
else
if
(
status
==
2
)
{
dirs
=
po
.
getCongestionDirs
();
}
else
if
(
status
==
3
)
{
dirs
=
po
.
getSpilloverDirs
();
}
return
Arrays
.
stream
(
dirs
.
split
(
","
))
.
map
(
dir
->
new
AbstractMap
.
SimpleEntry
<>(
dir
,
po
));
})
.
collect
(
Collectors
.
groupingBy
(
Map
.
Entry
::
getKey
,
Collectors
.
mapping
(
Map
.
Entry
::
getValue
,
Collectors
.
toList
())
));
// 对每个组进行处理,仅保留 start_time 相同的记录中 duration 最大的一条
Map
<
String
,
List
<
CrossDataHistPO
>>
filteredGrouped
=
grouped
.
entrySet
().
stream
()
.
collect
(
Collectors
.
toMap
(
Map
.
Entry
::
getKey
,
entry
->
entry
.
getValue
().
stream
()
.
collect
(
Collectors
.
groupingBy
(
CrossDataHistPO:
:
getStartTime
))
.
values
().
stream
()
.
map
(
list
->
list
.
stream
().
max
(
Comparator
.
comparingInt
(
CrossDataHistPO:
:
getDuration
))
.
orElse
(
null
))
.
collect
(
Collectors
.
toList
())
));
// 遍历 filteredGrouped,提取每个 key 和与该 key 关联的列表的元素个数
filteredGrouped
.
forEach
((
key
,
list
)
->
{
SceneEvaluateHeatMapVO
sceneEvaluateHeatMapVO
=
new
SceneEvaluateHeatMapVO
();
if
(
ObjectUtil
.
isNotEmpty
(
key
))
{
sceneEvaluateHeatMapVO
.
setDir
(
Integer
.
parseInt
(
key
));
if
(!
status
.
equals
(
CrossStatusEnum
.
CONGESTION
.
getCode
()))
{
if
(
list
.
isEmpty
())
{
sceneEvaluateHeatMapVO
.
setIsUnbalanceOrSpillOver
(
0
);
}
else
{
sceneEvaluateHeatMapVO
.
setIsUnbalanceOrSpillOver
(
1
);
}
}
else
{
Integer
delayTime
=
calcCrossDelayTime
(
list
);
Integer
level
=
calcCongestionLevel
(
delayTime
);
sceneEvaluateHeatMapVO
.
setLevel
(
level
);
}
sceneEvaluateHeatMapVO
.
setStatus
(
status
);
res
.
add
(
sceneEvaluateHeatMapVO
);
}
});
return
res
;
}
private
SceneEvaluateMetricsLaneVO
.
LaneListElement
buildLaneListElement
(
Map
.
Entry
<
Integer
,
List
<
CrossLaneDataHistPOExt
>>
entry
,
Integer
status
)
{
SceneEvaluateMetricsLaneVO
.
LaneListElement
element
=
new
SceneEvaluateMetricsLaneVO
.
LaneListElement
();
...
...
signal-optimize-service/src/main/java/net/wanji/opt/vo/SceneEvaluateAbnormalDetailVO.java
View file @
60e346f0
...
...
@@ -24,7 +24,7 @@ public class SceneEvaluateAbnormalDetailVO {
@JsonFormat
(
shape
=
JsonFormat
.
Shape
.
STRING
,
pattern
=
"yyyy-MM-dd HH:mm"
,
timezone
=
"GMT+8"
)
private
Date
startTime
;
//
todo 目前只有拥堵,后期扩展考虑增加字段
//
只有拥堵显示
@ApiModelProperty
(
value
=
"等级"
,
notes
=
"0畅通 1轻度 2中度 3严重"
)
private
Integer
level
;
...
...
signal-optimize-service/src/main/java/net/wanji/opt/vo/SceneEvaluateHeatMapVO.java
0 → 100644
View file @
60e346f0
package
net
.
wanji
.
opt
.
vo
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* @author Kent HAN
* @date 2023/2/9 8:38
*/
@Data
@NoArgsConstructor
@ApiModel
(
value
=
"SceneEvaluateHeatMapVO"
,
description
=
"场景评价热力图"
)
public
class
SceneEvaluateHeatMapVO
{
@ApiModelProperty
(
value
=
"方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北"
)
private
Integer
dir
;
@ApiModelProperty
(
value
=
"等级,只有拥堵显示 0畅通 1轻度 2中度 3严重"
)
private
Integer
level
;
@ApiModelProperty
(
value
=
"是否失衡或溢出,只有失衡或溢出显示 0否 1是"
)
private
Integer
isUnbalanceOrSpillOver
;
@ApiModelProperty
(
value
=
"路口状态 0正常 1 失衡 2 拥堵 3 溢出"
)
private
Integer
status
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment