基于Android的智慧环卫移动监管平台设计与实现
系统概述
本平台面向城市环卫管理场景,整合移动端应用、物联网感知与空间数据分析能力,构建覆盖垃圾收运全流程的数字化监管体系。核心解决传统模式下车辆调度粗放、设施状态感知滞后、作业质量难追溯等痛点。
核心数据模型设计
采用空间数据库扩展方案,关键实体关系如下:
erDiagram
TRUCK ||--o{ MISSION : "执行"
TRUCK {
string PlateNumber PK
enum EnergyType
decimal LoadCapacity
}
MISSION {
uuid MissionID PK
geometry Trajectory
timestamp DispatchTime
timestamp CompleteTime
}
WASTEBOX ||--o{ MISSION : "关联"
WASTEBOX ||--o{ SENSOR_LOG : "产生"
WASTEBOX {
int BoxNo PK
geography Position
decimal Volume
enum BoxCategory
}
SENSOR_LOG {
bigint LogID PK
int BoxNo FK
tinyint OccupancyRate
decimal Celsius
timestamp CaptureAt
}数据存储层实现
利用PostGIS扩展支持地理空间运算,表结构设计兼顾查询性能与扩展性:
-- 作业任务轨迹表(含空间索引)
CREATE TABLE Mission (
MissionID UUID DEFAULT gen_random_uuid() PRIMARY KEY,
TruckID VARCHAR(10) NOT NULL,
RoutePath GEOGRAPHY(LINESTRING, 4326),
PlannedDistance DECIMAL(8,2),
ActualDistance DECIMAL(8,2),
CreatedAt TIMESTAMPTZ DEFAULT NOW(),
SPATIAL INDEX idx_route_path (RoutePath)
);
-- 智能垃圾桶实时状态表(分区存储按周轮转)
CREATE TABLE SensorLog (
LogID BIGSERIAL,
BoxNo INT NOT NULL,
FillPct TINYINT CHECK (FillPct BETWEEN 0 AND 100),
BatteryVolt DECIMAL(4,2),
ReportedAt TIMESTAMPTZ DEFAULT NOW(),
PRIMARY KEY (LogID, ReportedAt)
) PARTITION BY RANGE (ReportedAt);
-- 创建近期分区
CREATE TABLE SensorLog_2024w35 PARTITION OF SensorLog
FOR VALUES FROM ('2024-08-26') TO ('2024-09-02');路径优化核心算法
针对垃圾收运场景改进传统遗传算法,引入载重约束与时间窗惩罚:
public class CollectionScheduler {
private static final int ELITE_COUNT = 5;
private static final double CROSSOVER_RATE = 0.85;
public RoutePlan solveVRP(List<WasteNode> pickups, Depot depot) {
Population current = initDiversePopulation(pickups, depot);
for (int iter = 0; iter < maxIterations; iter++) {
// 非支配排序处理多目标(距离+碳排+时效)
List<RoutePlan> paretoFront = fastNonDominatedSort(current);
Population offspring = new Population();
// 保留精英个体
offspring.addAll(paretoFront.subList(0, ELITE_COUNT));
while (offspring.size() < populationSize) {
RoutePlan p1 = tournamentSelect(current, 3);
RoutePlan p2 = tournamentSelect(current, 3);
if (ThreadLocalRandom.current().nextDouble() < CROSSOVER_RATE) {
RoutePlan[] children = orderCrossover(p1, p2);
offspring.add(mutateWith2Opt(children[0]));
offspring.add(mutateWith2Opt(children[1]));
}
}
current = offspring;
}
return extractBestBalance(current);
}
private double calculateCarbonCost(RoutePlan plan) {
double total = 0.0;
for (Leg segment : plan.getSegments()) {
double factor = segment.getTruck().getEmissionFactor();
total += segment.getMeter() / 1000.0 * factor;
}
return total;
}
}Android端地图集成
采用高德地图SDK实现作业可视化,关键封装如下:
public class DispatchMapLayer {
private MapView mapView;
private HeatmapOverlay heatmap;
public void renderCollectionStatus(List<BinStatus> realtimeData) {
List<WeightedLatLng> heatPoints = realtimeData.stream()
.filter(b -> b.getFillPct() > 60)
.map(b -> new WeightedLatLng(
new LatLng(b.getLat(), b.getLng()),
b.getFillPct() / 100.0
))
.collect(Collectors.toList());
HeatmapTileProvider provider = new HeatmapTileProvider.Builder()
.weightedData(heatPoints)
.radius(40)
.gradient(urgencyGradient)
.build();
heatmap.setTileProvider(provider);
mapView.invalidate();
}
public void animateTruckMovement(String truckId, List<LatLng>> trace) {
SmoothMoveMarker mover = new SmoothMoveMarker(mapView.getMap());
mover.setDescriptor(BitmapDescriptorFactory
.fromResource(R.drawable.ic_truck_moving));
mover.setPoints(trace);
mover.setTotalDuration(30);
mover.startSmoothMove();
}
}物联网硬件对接
垃圾桶终端采用LoRaWAN组网,数据上行协议设计:
| 字节位 | 含义 | 说明 |
|---|---|---|
| 0-1 | 帧头 | 固定0xAA55 |
| 2 | 设备类型 | 0x01=超声波,0x02=红外 |
| 3-4 | 设备编号 | BCD编码 |
| 5 | 填充高度 | 0-255对应0-100% |
| 6 | 温度 | 偏移-40℃,范围-40~85 |
| 7-8 | 电池电压 | 单位mV/10 |
异常检测与预警
基于滑动窗口统计识别异常模式:
@Service
public class AnomalyDetector {
public Optional<Alert> analyze(BinTelemetry telemetry) {
DescriptiveStatistics stats = ringBuffer
.get(telemetry.getBoxNo());
if (stats.getN() < MIN_SAMPLES) {
return Optional.empty();
}
double zScore = (telemetry.getTemp() - stats.getMean())
/ stats.getStandardDeviation();
if (zScore > 3.5) {
return Optional.of(Alert.builder()
.level(CRITICAL)
.type(TEMPERATURE_SPIKE)
.suggestedAction("调度最近车辆现场核查")
.build());
}
// 填充速率异常(疑似非法倾倒)
double fillVelocity = estimateFillVelocity(telemetry);
if (fillVelocity > THRESHOLD_RAPID_FILL) {
return Optional.of(Alert.builder()
.level(WARNING)
.type(RAPID_FILL_DETECTED)
.build());
}
return Optional.empty();
}
}技术选型总结
- 移动端: Android原生 + Jetpack Compose UI层
- 地图引擎: 高德地图SDK(路径规划+轨迹纠偏)
- 后端服务: Spring Boot + WebFlux响应式处理
- 空间数据库: PostgreSQL 15 + PostGIS 3.3
- 消息队列: RabbitMQ处理设备上行数据
- 缓存层: Redis Geo数据结构支持附近车辆检索