Commit 6c992aae authored by zhoushiguang's avatar zhoushiguang

基于轨迹计算周期转向流量

parent ebdb551f
package com.wanji.indicators.entity;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
public class TurnIndicatorData implements Serializable {
private String crossId;
@JsonProperty("fRid")
private String fRid;
@JsonProperty("fRidDir")
private Integer fRidDir;
@JsonProperty("tRid")
private String tRid;
private int turnDirNo;
private int flow;
private double speed;
private Date windowStartTime;
private Date windowEndTime;
private String granularity;
private Integer dt;
}
package com.wanji.indicators.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wanji.indicators.entity.CrossStateData;
import com.wanji.indicators.entity.TurnIndicatorData;
import java.util.List;
public interface TurnIndicatorsDataMapper extends BaseMapper<TurnIndicatorData>{
/**
* 批量保存
*/
void batchInsert(List<TurnIndicatorData> list);
}
package com.wanji.indicators.task.turnIndicators.func;
import com.wanji.indicators.constant.TimeGranularityEnum;
import com.wanji.indicators.entity.BaseCrossTurnInfo;
import com.wanji.indicators.model.CarTrackModel;
import com.wanji.indicators.model.CrossFrameModel;
import com.wanji.indicators.task.turnIndicators.model.CrossTurnResultModel;
import com.wanji.indicators.task.turnIndicators.model.TurnResultModel;
import com.wanji.indicators.util.DateUtil;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
import org.joda.time.Minutes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
* @author fengyi
* @date 2023/4/6
* @description
*/
public class TurnDataPeriodProcessWindow extends ProcessWindowFunction<CrossTurnResultModel, CrossTurnResultModel, String, TimeWindow> {
private static final Logger log = LoggerFactory.getLogger(TurnDataPeriodProcessWindow.class);
@Override
public void open(Configuration parameters) {
//mapState = getRuntimeContext().getMapState(new MapStateDescriptor<>("mapStateAccident_Area_Indicators", String.class, CarTrackModel.class));
}
@Override
public void process(String groupKey, Context context, Iterable<CrossTurnResultModel> elements, Collector<CrossTurnResultModel> out) throws Exception {
List<CrossTurnResultModel> list = StreamSupport.stream(elements.spliterator(), false).collect(Collectors.toList());
//=====================================================================================//
long windowStartTime = context.window().getStart();
long windowEndTime = context.window().getEnd();
DateTime startDateTime = new DateTime(windowStartTime);
DateTime endDateTime = new DateTime(windowEndTime);
int minute = Minutes.minutesBetween(startDateTime, endDateTime).getMinutes();
String granularity = minute + "m";
if (minute == 60) {
granularity = "1h";
}
String startTime = DateUtil.toDateTime(windowStartTime, DateUtil.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtil.toDateTime(windowEndTime, DateUtil.YYYY_MM_DD_HH_MM_SS);
List<TurnResultModel> turnDataList = new ArrayList<>();
CrossTurnResultModel outModel = null;
for (CrossTurnResultModel model : list) {
turnDataList.addAll(model.getTurnDataList());
outModel = model;
}
Map<String, List<TurnResultModel>> group = turnDataList.stream().collect(Collectors.groupingBy(o -> o.getInRid() + "_" + o.getTurnDirNo()));
List<TurnResultModel> aggList = new ArrayList<>();
for (Map.Entry<String, List<TurnResultModel>> entry : group.entrySet()) {
List<TurnResultModel> value = entry.getValue();
TurnResultModel result = value.get(0);
int flow = value.stream().mapToInt(o -> o.getFlow()).sum();
double speed = value.stream().mapToDouble(o -> o.getSpeed()).average().orElse(0);
result.setFlow(flow);
result.setSpeed(speed);
aggList.add(result);
}
outModel.setStartTime(startTime);
outModel.setEndTime(endTime);
outModel.setTimestamp(windowStartTime);
outModel.setGranularity(granularity);
outModel.setTurnDataList(aggList);
out.collect(outModel);
}
}
package com.wanji.indicators.task.turnIndicators.func;
import com.wanji.indicators.constant.TimeGranularityEnum;
import com.wanji.indicators.entity.BaseCrossTurnInfo;
import com.wanji.indicators.model.CarTrackModel;
import com.wanji.indicators.model.CrossFrameModel;
import com.wanji.indicators.task.turnIndicators.model.CrossTurnResultModel;
import com.wanji.indicators.task.turnIndicators.model.TurnResultModel;
import com.wanji.indicators.util.DateUtil;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.windowing.windows.TimeWindow;
import org.apache.flink.util.Collector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
/**
* @author fengyi
* @date 2023/4/6
* @description
*/
public class TurnDataProcessWindow extends ProcessWindowFunction<CrossFrameModel, CrossTurnResultModel, String, TimeWindow> {
private static final Logger log = LoggerFactory.getLogger(TurnDataProcessWindow.class);
@Override
public void open(Configuration parameters) {
//mapState = getRuntimeContext().getMapState(new MapStateDescriptor<>("mapStateAccident_Area_Indicators", String.class, CarTrackModel.class));
}
@Override
public void process(String groupKey, Context context, Iterable<CrossFrameModel> elements, Collector<CrossTurnResultModel> out) throws Exception {
List<CrossFrameModel> list = StreamSupport.stream(elements.spliterator(), false).collect(Collectors.toList());
List<CarTrackModel> trackList = new ArrayList<>();
for (CrossFrameModel crossFrameModel : list) {
trackList.addAll(crossFrameModel.getTrackList());
}
Map<Integer, List<CarTrackModel>> groupById = trackList.stream().collect(Collectors.groupingBy(o -> o.getId()));
//=====================================================================================//
long windowStartTime = context.window().getStart();
long windowEndTime = context.window().getEnd();
String startTime = DateUtil.toDateTime(windowStartTime, DateUtil.YYYY_MM_DD_HH_MM_SS);
String endTime = DateUtil.toDateTime(windowEndTime, DateUtil.YYYY_MM_DD_HH_MM_SS);
Map<String, TurnResultModel> turnResultModelMap = new HashMap<>();
//检测每辆车从哪个进口道驶入路口,而后进入到出口道时,作为转向的一个流量
for (Map.Entry<Integer, List<CarTrackModel>> entry : groupById.entrySet()) {
List<CarTrackModel> value = entry.getValue();
value = value.stream().sorted(Comparator.comparing(o -> o.getGlobalTimeStamp())).collect(Collectors.toList());
CarTrackModel tmp = null;
for (CarTrackModel model : value) {
String rid = model.getRoadnet().getRid();
Integer type = model.getRoadnet().getLaneType();
if (tmp != null && Objects.equals(tmp.getRoadnet().getLaneType(),2) && Objects.equals(type,3)) {
//从路口范围进入到出口道
String inRid = tmp.getRoadnet().getRid();
String outRid = rid;
Integer turn = tmp.getCarTurn();
List<BaseCrossTurnInfo> turnList = model.getRoadnet().getTurnRelationList();
if (turnList != null) {
Optional<BaseCrossTurnInfo> optional = turnList.stream().filter(o->o.getInRid().equals(inRid)).findFirst();
if (optional.isPresent()) {
String turnType = optional.get().getTurnType();
turn = Integer.valueOf(turnType);
}
}
//进口道+转向
String key = inRid+"_"+turn;
// if (key.equals("13NF80B5QN013NGH0B5RC00_1")){
// System.out.println();
// }
TurnResultModel resultModel = turnResultModelMap.get(key);
if (resultModel == null) {
resultModel = new TurnResultModel();
}
resultModel.setInRid(tmp.getRoadnet().getRid());
resultModel.setInRidDir(tmp.getRoadnet().getRidDir8());
resultModel.setOutRid(outRid);
resultModel.setTurnDirNo(turn);
resultModel.setFlow(resultModel.getFlow()+1);
resultModel.setSpeed((resultModel.getSpeed()+model.getSpeed())/resultModel.getFlow());
resultModel.getTrackIdList().add(entry.getKey());
turnResultModelMap.put(key,resultModel);
break;
}
tmp = model;
}
}
//输出转向流量
List<TurnResultModel> outList = new ArrayList<>(turnResultModelMap.values());
if (!list.isEmpty()) {
CrossTurnResultModel crossTurnResultModel = new CrossTurnResultModel();
crossTurnResultModel.setStartTime(startTime);
crossTurnResultModel.setEndTime(endTime);
crossTurnResultModel.setTimestamp(context.window().getStart());
crossTurnResultModel.setCrossId(groupKey);
crossTurnResultModel.setTurnDataList(outList);
crossTurnResultModel.setGranularity(TimeGranularityEnum.FIVE_MINUTE.getType());
out.collect(crossTurnResultModel);
}
}
}
package com.wanji.indicators.task.turnIndicators.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
public class CrossTurnResultModel implements Serializable {
private String crossId;
//周期开始时间
private String startTime;
//周期截止时间
private String endTime;
private Long timestamp;
private List<TurnResultModel> turnDataList;
private String granularity;
}
package com.wanji.indicators.task.turnIndicators.model;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
@EqualsAndHashCode(callSuper = false)
@ToString
public class TurnResultModel implements Serializable {
private String inRid;
private Integer inRidDir;
private String outRid;
private int turnDirNo;
private int flow;
private double speed;
private List<Integer> trackIdList = new ArrayList<>();
}
package com.wanji.indicators.task.turnIndicators.sink;
import com.wanji.indicators.constant.TimeGranularityEnum;
import com.wanji.indicators.entity.CrossStateData;
import com.wanji.indicators.entity.TurnIndicatorData;
import com.wanji.indicators.mapper.TurnIndicatorsDataMapper;
import com.wanji.indicators.service.CrossStateDataService;
import com.wanji.indicators.service.impl.CrossStateDataServiceImpl;
import com.wanji.indicators.task.turnIndicators.model.CrossTurnResultModel;
import com.wanji.indicators.task.turnIndicators.model.TurnResultModel;
import com.wanji.indicators.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.ArrayList;
import java.util.List;
/**
* @author fengyi
* @date 2024/1/23
* @description
*/
@Slf4j
public class TurnIndicationSinkFunction extends RichSinkFunction<CrossTurnResultModel> {
TurnIndicatorsDataMapper turnIndicatorsDataMapper;
@Override
public void open(Configuration parameters) throws Exception {
super.open(parameters);
ApplicationContext beanConf = new ClassPathXmlApplicationContext("spring-container.xml");
turnIndicatorsDataMapper = beanConf.getBean(TurnIndicatorsDataMapper.class);
}
@Override
public void invoke(CrossTurnResultModel value, Context context) throws Exception {
try {
List<TurnResultModel> turnDataList = value.getTurnDataList();
List<TurnIndicatorData> outDataList = new ArrayList<>();
for (TurnResultModel model : turnDataList) {
TurnIndicatorData data = new TurnIndicatorData();
data.setCrossId(value.getCrossId());
data.setFRid(model.getInRid());
data.setFRidDir(model.getInRidDir());
data.setTRid(model.getOutRid());
data.setTurnDirNo(model.getTurnDirNo());
data.setGranularity(value.getGranularity());
data.setWindowStartTime(DateUtil.stringToDate(value.getStartTime(),"yyyy-MM-dd HH:mm:ss"));
data.setWindowEndTime(DateUtil.stringToDate(value.getEndTime(),"yyyy-MM-dd HH:mm:ss"));
data.setFlow(model.getFlow());
data.setSpeed(model.getSpeed());
String dt = value.getStartTime().substring(0,value.getStartTime().indexOf(" "));
dt = dt.replaceAll("-","");
data.setDt(Integer.valueOf(dt));
outDataList.add(data);
}
turnIndicatorsDataMapper.batchInsert(outDataList);
} catch (Exception e) {
log.error(this.getClass().getName() + ".invoke()执行失败", e);
}
}
}
config_name=config_mz.properties
\ No newline at end of file
config_name=config_dev.properties
\ No newline at end of file
#本地文件数据目录路径
data.file.path=/data/jinan/
#\u672C\u5730\u6587\u4EF6\u6570\u636E\u76EE\u5F55\u8DEF\u5F84
data.file.path=/data/dev/
#kafka settings kafka1:9092,kafka2:9092,kafka3:9092 192.168.11.102:9092
#bootstrap.servers=10.102.1.182:9092
......@@ -23,7 +23,7 @@ elasticsearch.server=10.102.1.182:9200
elasticsearch.username=elastic
elasticsearch.password=Wanji300552
#redis配置
#redis\u914D\u7F6E
#redis.host=10.102.1.182
redis.host=10.102.1.182
redis.password=Wanji300552
......@@ -35,74 +35,74 @@ check.point.uri=file:///data/projects/savepoint
alarm.feishu.url=https://open.feishu.cn/open-apis/bot/v2/hook/0840f036-299e-4595-8a34-dea1c4ba6942
signal.status.url=ws://37.12.182.29:9000/utc/signalStatus/{crossId},stateMonitor
#区域路口列表
#\u533A\u57DF\u8DEF\u53E3\u5217\u8868
full.area.cross.list=13NI00B5RM0,13NGH0B5RC0,13NF80B5QN0,13NID0B5RM0
#区域指标分析数据
#\u533A\u57DF\u6307\u6807\u5206\u6790\u6570\u636E
area.analysis.data.topic=analysis.area.indicators
#路段参与者影响分析
#\u8DEF\u6BB5\u53C2\u4E0E\u8005\u5F71\u54CD\u5206\u6790
rid.participant.analysis.data.topic=analysis.participant.effect
#事件监测数据
#\u4E8B\u4EF6\u76D1\u6D4B\u6570\u636E
cross.event.data.topic=analysis.cross.event
#车牌开头地区简写
plate.prefix=
#路段默认自由流速度配置值 km/h
#\u8F66\u724C\u5F00\u5934\u5730\u533A\u7B80\u5199
plate.prefix=\u9C81
#\u8DEF\u6BB5\u9ED8\u8BA4\u81EA\u7531\u6D41\u901F\u5EA6\u914D\u7F6E\u503C km/h
rid.default.free.speed=80
# 方向级别拥堵数据
# \u65B9\u5411\u7EA7\u522B\u62E5\u5835\u6570\u636E
dir.congestion.index.topic=dir.congestion.index
# 路口事件数据
# \u8DEF\u53E3\u4E8B\u4EF6\u6570\u636E
cross.event.index.topic=cross.event.index
#非协调方向饱和度计算
#\u975E\u534F\u8C03\u65B9\u5411\u9971\u548C\u5EA6\u8BA1\u7B97
rid.traffic.index.north.south.topic=rid.traffic.index.north.south.analysis
# rid和终点路口进口方向
# rid\u548C\u7EC8\u70B9\u8DEF\u53E3\u8FDB\u53E3\u65B9\u5411
rid.end.indir.list=13NED0B5Q9013NF80B5QN00:6,13NGH0B5RC013NF80B5QN00:2,13NI00B5RM013NGH0B5RC00:3,13NF80B5QN013NGH0B5RC00:6,13NGH0B5RC013NI00B5RM00:7,13NI00B5RM013NID0B5RM00:3,13NG40B5SK013NI00B5RM00:1,13NEH0B5RJ013NGH0B5RC00:1,13NEP0B5QJ013NGH0B5RC00:5,13NDG0B5RI013NF80B5QN00:1,13NDT0B5Q9013NF80B5QN00:4
# rid和起点路口出口方向
# rid\u548C\u8D77\u70B9\u8DEF\u53E3\u51FA\u53E3\u65B9\u5411
rid.start.outdir.list=13NF80B5QN013NED0B5Q900:6,13NF80B5QN013NGH0B5RC00:2,13NGH0B5RC013NI00B5RM00:3,13NGH0B5RC013NF80B5QN00:6,13NI00B5RM013NGH0B5RC00:7,13NI00B5RM013NID0B5RM00:3,13NI00B5RM013NG40B5SK00:1,13NGH0B5RC013NEH0B5RJ00:1,13NGH0B5RC013NEP0B5QJ00:5,13NF80B5QN013NDG0B5RI00:1,13NF80B5QN013NDT0B5Q900:4
# 路口ID-方向-转向对应的行人灯通过时长
# \u8DEF\u53E3ID-\u65B9\u5411-\u8F6C\u5411\u5BF9\u5E94\u7684\u884C\u4EBA\u706F\u901A\u8FC7\u65F6\u957F
cross.dir.turn.ped.green=13NF80B5QN0-1-2:20,13NF80B5QN0-2-2:15,13NF80B5QN0-4-2:20,13NF80B5QN0-6-2:15,13NGH0B5RC0-1-2:30,13NGH0B5RC0-3-2:30,13NGH0B5RC0-5-2:30,13NGH0B5RC0-6-2:25,13NI00B5RM0-3-2:30,13NI00B5RM0-7-2:30,13NI00B5RM0-1-1:30
#路口溢出评价指标
#\u8DEF\u53E3\u6EA2\u51FA\u8BC4\u4EF7\u6307\u6807
road.overflow.avg.speed=5.0
road.overflow.duration=3000
road.overflow.deadlock.index.analysis.topic=crossroad.overflow.deadlock.index.analysis
#路口失衡topic
#\u8DEF\u53E3\u5931\u8861topic
road.unbalance.index.analysis.topic=road.unbalance.index.analysis
#死锁评价指标
#\u6B7B\u9501\u8BC4\u4EF7\u6307\u6807
cross.road.deadlock.car.number=10
cross.road.deadlock.avg.speed=5.0
#相位灯的状态数据
#\u76F8\u4F4D\u706F\u7684\u72B6\u6001\u6570\u636E
light.status.topic=cross_lights_status
# 虚拟路口区域
# 霞景路西,旅游路与回龙山路交叉口
# \u865A\u62DF\u8DEF\u53E3\u533A\u57DF
# \u971E\u666F\u8DEF\u897F\uFF0C\u65C5\u6E38\u8DEF\u4E0E\u56DE\u9F99\u5C71\u8DEF\u4EA4\u53C9\u53E3
virtual.crossroad1=13NED0B5Q90:117.08539278781757,36.641443918825374;117.08520035148655,36.64165623069265;117.08554192597296,36.641860821574866;117.08574398412043,36.64165623069265;117.08539278781757,36.641443918825374
# 福地街东,旅游路与隧道交叉口
# \u798F\u5730\u8857\u4E1C\uFF0C\u65C5\u6E38\u8DEF\u4E0E\u96A7\u9053\u4EA4\u53C9\u53E3
virtual.crossroad2=13NH20B5RH0:117.09669255282627,36.644871615002884;117.09669985552095,36.645055610398025;117.09675474612689,36.64505324101935;117.09674606214631,36.64486930675771
#相位空放topic
#\u76F8\u4F4D\u7A7A\u653Etopic
phase.emptiness.topic=phase.emptiness.analysis
#无车牌默认车牌
default.plate.number=A00000
#\u65E0\u8F66\u724C\u9ED8\u8BA4\u8F66\u724C
default.plate.number=\u9C81A00000
# 路段自由流时间
# \u8DEF\u6BB5\u81EA\u7531\u6D41\u65F6\u95F4
rid.free.time=13NED0B5Q9013NF80B5QN00:5.0,13NF80B5QN013NGH0B5RC00:45.0,13NGH0B5RC013NI00B5RM00:29.0,13NI00B5RM013NID0B5RM00:35.0,13NID0B5RM013NH20B5RH00:4.4,13NH20B5RH013NID0B5RM00:4.4,13NID0B5RM013NI00B5RM00:5.0,13NI00B5RM013NGH0B5RC00:45.0,13NGH0B5RC013NF80B5QN00:26.0,13NF80B5QN013NED0B5Q900:5.0
# 方向车道数量
# \u65B9\u5411\u8F66\u9053\u6570\u91CF
dir.lane.counts=13NF80B5QN0-1:1,13NF80B5QN0-2:3,13NF80B5QN0-4:1,13NF80B5QN0-6:3,13NGH0B5RC0-1:4,13NGH0B5RC0-3:4,13NGH0B5RC0-5:3,13NGH0B5RC0-6:4,13NI00B5RM0-1:3,13NI00B5RM0-3:3,13NI00B5RM0-7:4
# 路口方向
# \u8DEF\u53E3\u65B9\u5411
cross.dirs=13NF80B5QN0:13NF80B5QN0-1,13NF80B5QN0-2,13NF80B5QN0-4,13NF80B5QN0-6;13NGH0B5RC0:13NGH0B5RC0-1,13NGH0B5RC0-3,13NGH0B5RC0-5,13NGH0B5RC0-6;13NI00B5RM0:13NI00B5RM0-1,13NI00B5RM0-3,13NI00B5RM0-7
# 忽略的路口
# \u5FFD\u7565\u7684\u8DEF\u53E3
ignore.crosses=13NID0B5RM0
# MySQL IP
mysql.ip=37.12.182.29
# MySQL 数据库名
# MySQL \u6570\u636E\u5E93\u540D
mysql.db.name=holo_roadnet
\ No newline at end of file
{
"type": "FeatureCollection",
"name": "安全岛",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{"id":"49b0aa9f7f85f2ca1a990ef4d01a42b9","type":"Feature","properties":{"lkid": "13NI00B5RM0", "ldid": "13NG40B5SK013NI00B5RM00"},"geometry":{"coordinates":[[[117.09447779600657,36.64512094949285],[117.09445163823682,36.64507413092623],[117.0944248097527,36.64503646079385],[117.09439529842194,36.64502569789569],[117.09434633643934,36.645075207215584],[117.09439663984665,36.645139784540405],[117.09447779600657,36.64512094949285]]],"type":"Polygon"}},
{"id":"c5f29f79663b5fa998aa4357418025ea","type":"Feature","properties":{"lkid": "13NI00B5RM0", "ldid": "13NID0B5RM013NI00B5RM00"},"geometry":{"coordinates":[[[117.0948122252484,36.64516327013719],[117.0948249620765,36.645131267398256],[117.09483836925904,36.645100340382115],[117.09483568782184,36.645061614354034],[117.09491143842183,36.64505784932226],[117.09492752704534,36.64515681580525],[117.0948122252484,36.64516327013719]]],"type":"Polygon"}},
{"id":"eeed8dd0893d9d18bdf2455d0f07744f","type":"Feature","properties":{"lkid": "13NI00B5RM0", "ldid": "13NI00B5RM0XXXXXXXXXXX0"},"geometry":{"coordinates":[[[117.09478911481517,36.64486851191566],[117.0949080500709,36.64487112637444],[117.09489827457139,36.64474432502925],[117.09478911481517,36.64474301779774],[117.09478911481517,36.64486851191566]]],"type":"Polygon"}},
{"id":"4c7e4c538b02ea1f613ecfcb76f5af1d","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NEH0B5RJ013NGH0B5RC00"},"geometry":{"coordinates":[[[117.08972162767253,36.64416743809616],[117.08972296839113,36.64412924946721],[117.08974307917055,36.64404856920274],[117.08965660282394,36.644014145597254],[117.08958822617637,36.644131938808044],[117.08972162767253,36.64416743809616]]],"type":"Polygon"}},
{"id":"98feaf1a0c70c97390b3294cbece9390","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NI00B5RM013NGH0B5RC00"},"geometry":{"coordinates":[[[117.09005326091705,36.6442736740141],[117.0900834429608,36.6442349271894],[117.09009685720224,36.64420317630524],[117.09013877670682,36.644197525722326],[117.0901780133621,36.64419618034579],[117.09019679330089,36.644284437017376],[117.09005326091705,36.6442736740141]]],"type":"Polygon"}},
{"id":"2da5b183cf707fab493533574738a944","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NEP0B5QJ013NGH0B5RC00"},"geometry":{"coordinates":[[[117.090234843894,36.644005658941225],[117.09018990618546,36.64396260676327],[117.09015704129371,36.643891032463515],[117.09031734147857,36.64387596418145],[117.090234843894,36.644005658941225]]],"type":"Polygon"}},
{"id":"55c96056875c08ffd29c2d1fbc1edc4f","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NF80B5QN013NGH0B5RC00"},"geometry":{"coordinates":[[[117.08974117233481,36.643845535735764],[117.08978879289128,36.643855222492206],[117.08982434063108,36.64384715019493],[117.08986458335522,36.64381916622452],[117.08989946038338,36.64379064409012],[117.08976800081757,36.64375996932975],[117.08974117233481,36.643845535735764]]],"type":"Polygon"}},
{"id":"a1467a690a95b1d85d953e78ea2c1660","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NDG0B5RI013NF80B5QN00"},"geometry":{"coordinates":[[[117.08577465910946,36.64204262077793],[117.08579209762354,36.64200118200064],[117.08579746331947,36.641969968361636],[117.08575118418634,36.641936602043614],[117.08569685650917,36.64200064383432],[117.08577465910946,36.64204262077793]]],"type":"Polygon"}},
{"id":"d37dd14ac611e33fa428025793c49236","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NGH0B5RC013NF80B5QN00"},"geometry":{"coordinates":[[[117.08586181936806,36.64212390948036],[117.08588127001849,36.642087314236534],[117.08590809850119,36.6420668639456],[117.0859765111328,36.642094310387506],[117.08593224413596,36.64215566122219],[117.08586181936806,36.64212390948036]]],"type":"Polygon"}},
{"id":"efffedf794aa26a47d0b6a34d31e0740","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NDT0B5Q9013NF80B5QN00"},"geometry":{"coordinates":[[[117.08610595856572,36.641937166144345],[117.08605766729619,36.64189734181086],[117.08606236228059,36.641851597618924],[117.08618107831796,36.64187527696852],[117.08610595856572,36.641937166144345]]],"type":"Polygon"}},
{"id":"6f7a9c1c2794c1c035ba526e86bf5127","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NED0B5Q9013NF80B5QN00"},"geometry":{"coordinates":[[[117.0858256009405,36.641755803942175],[117.08587657505797,36.641785941332884],[117.08590675710172,36.641785941332884],[117.0859510240985,36.641749884096555],[117.08588395289166,36.64169445278907],[117.0858256009405,36.641755803942175]]],"type":"Polygon"}}
]
}
{
"type": "FeatureCollection",
"name": "人行横道面",
"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
"features": [
{"id":"4c99368c3f3d7b0704bf47f0fa97963c","type":"Feature","properties":{ "lkid": "13NI00B5RM0", "ldid": "13NG40B5SK013NI00B5RM00"},"geometry":{"coordinates":[[[117.09445767469771,36.64509888559614],[117.09445096757702,36.64505421959497],[117.094835285594,36.64507466909251],[117.09483394417066,36.64512094951424],[117.09445767469771,36.64509888559614]]],"type":"Polygon"}},
{"id":"e72686e60b998b875a32dfd077f2865f","type":"Feature","properties":{"lkid": "13NI00B5RM0", "ldid": "13NID0B5RM013NI00B5RM00"},"geometry":{"coordinates":[[[117.0948082022116,36.64505458796779],[117.09488060101268,36.64505942872276],[117.09487724921598,36.64487924485124],[117.09479881718119,36.64487547981112],[117.0948082022116,36.64505458796779]]],"type":"Polygon"}},
{"id":"b47e7d5c58b6457243e32ac895925e9d","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NEH0B5RJ013NGH0B5RC00"},"geometry":{"coordinates":[[[117.08972497789023,36.64413893088346],[117.08974240722995,36.64408084110846],[117.09009032369909,36.6441889525987],[117.09007021291967,36.64424596655698],[117.08972497789023,36.64413893088346]]],"type":"Polygon"}},
{"id":"6cd394b0199fbd31210ba2bfef580c7e","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NI00B5RM013NGH0B5RC00"},"geometry":{"coordinates":[[[117.09008947947598,36.64418703177006],[117.09015252641018,36.64420048553903],[117.09022898758712,36.64399544984329],[117.09016057495558,36.643976614515864],[117.09008947947598,36.64418703177006]]],"type":"Polygon"}},
{"id":"153550fce228447b2eb3a89490930ac8","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NEP0B5QJ013NGH0B5RC00"},"geometry":{"coordinates":[[[117.08983513591318,36.64386896815239],[117.08986062297123,36.64381515283016],[117.09001522210434,36.6438684299807],[117.09017183337369,36.64392493604748],[117.09015037058697,36.643980903901735],[117.08983513591318,36.64386896815239]]],"type":"Polygon"}},
{"id":"9f99ad7c4eda55dd7f83afc3f87a5897","type":"Feature","properties":{"lkid": "13NGH0B5RC0", "ldid": "13NF80B5QN013NGH0B5RC00"},"geometry":{"coordinates":[[[117.08968885679263,36.64402151162922],[117.08975123301514,36.64404303770529],[117.08983574273617,36.64387136708481],[117.08980623140542,36.643856836951684],[117.08977336651361,36.643865447401225],[117.08976330583317,36.64386813816647],[117.08968885679263,36.64402151162922]]],"type":"Polygon"}},
{"id":"26fe0e2949974fc52d2c93f1fd033b58","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NDG0B5RI013NF80B5QN00"},"geometry":{"coordinates":[[[117.08580014616757,36.641997953003866],[117.08581490183354,36.64197642635736],[117.08590880152462,36.642037777285324],[117.08588264375209,36.64208136870478],[117.08578807335078,36.64201786514744],[117.08580014616757,36.641997953003866]]],"type":"Polygon"}},
{"id":"8edfdd75bfab05f287e5f0d477d0c8f2","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NGH0B5RC013NF80B5QN00"},"geometry":{"coordinates":[[[117.08590611867521,36.64204638793824],[117.08595977564204,36.6420770633805],[117.0860838573742,36.641928529545226],[117.08603355396832,36.641886014373426],[117.08590477725056,36.64204208261192],[117.08590611867521,36.64204638793824]]],"type":"Polygon"}},
{"id":"252976b953585bc3b2b695ca66725aec","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NDT0B5Q9013NF80B5QN00"},"geometry":{"coordinates":[[[117.08589937924768,36.641805315232205],[117.08593693912377,36.64177141067496],[117.08605766729619,36.64185590295537],[117.08602614382914,36.641891421975544],[117.08589937924768,36.641805315232205]]],"type":"Polygon"}},
{"id":"0c181daf73f6ccd6dfefc379e4c65c33","type":"Feature","properties":{"lkid": "13NF80B5QN0", "ldid": "13NED0B5Q9013NF80B5QN00"},"geometry":{"coordinates":[[[117.08576121258153,36.64193393727692],[117.0858155402587,36.641969456260554],[117.08590273282908,36.64180962070323],[117.08584505159087,36.64177517798049],[117.08576121258153,36.64193393727692]]],"type":"Polygon"}}
]
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wanji.indicators.mapper.TurnIndicatorsDataMapper">
<!--批量插入-->
<insert id="batchInsert" parameterType="com.wanji.indicators.entity.TurnIndicatorData">
INSERT INTO t_analysis_rid_turn_indicators (
cross_id,
f_rid,
f_rid_dir,
t_rid,
turn_dir_no,
flow,
granularity,
window_start_time,
window_end_time ,
dt,
ruksj
)
VALUES
<foreach collection="list" item="item" separator=",">
(
#{item.crossId}
,#{item.fRid}
,#{item.fRidDir}
,#{item.tRid}
,#{item.turnDirNo}
,#{item.flow}
,#{item.granularity}
,#{item.windowStartTime}
,#{item.windowEndTime}
,#{item.dt}
,now()
)
</foreach>
ON DUPLICATE KEY UPDATE
cross_id=values(cross_id),
f_rid=values(f_rid),
f_rid_dir=values(f_rid_dir),
t_rid=values(t_rid),
turn_dir_no=values(turn_dir_no),
flow=values(flow),
ruksj=values(ruksj),
window_start_time=values(window_start_time),
window_end_time=values(window_end_time) ,
dt=values(dt)
</insert>
</mapper>
......@@ -10,7 +10,7 @@
<!-- 加载配置文件 -->
<!--<context:property-placeholder location="classpath:db.properties"/>-->
<context:property-placeholder location="classpath:db/mengzi/db.properties"/>
<context:property-placeholder location="classpath:db/dev/db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
......
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