package dikuai; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; import java.util.Properties; /** * 地块信息类 */ public class Dikuai { // 用户标识 private String userId; // 地块编号 private String landNumber; // 地块名称 private String landName; // 边界原始坐标 private String boundaryOriginalCoordinates; // 边界坐标(存储多边形坐标点集合) private String boundaryCoordinates; // 规划路径(存储路径坐标点集合) private String plannedPath; // 返回点坐标 private String returnPointCoordinates; // 边界点间隔 private String boundaryPointInterval; // 角度阈值 private String angleThreshold; // 智能场景分析 private String intelligentSceneAnalysis; // 地块面积,单位平方米 private String landArea; // 基准站坐标 private String baseStationCoordinates; // 创建时间 private String createTime; // 最新更新时间 private String updateTime; // 割草模式 private String mowingTrack; // 割草实时轨迹 private String mowingPattern; // 割草宽度 private String mowingWidth; // 割草机割刀宽度(米),默认0.40米 private String mowingBladeWidth; // 割草重叠距离(米),默认0.06米 private String mowingOverlapDistance; // 存储多个地块的映射表,键为地块编号 private static Map dikuaiMap = new HashMap<>(); /** * 初始化方法 - 从dikuai.properties文件加载所有地块数据 */ public static void initFromProperties() { Properties properties = new Properties(); try { // 从根目录加载dikuai.properties文件,使用UTF-8编码 FileInputStream input = new FileInputStream("dikuai.properties"); InputStreamReader reader = new InputStreamReader(input, StandardCharsets.UTF_8); properties.load(reader); reader.close(); input.close(); // 清空现有地块数据 dikuaiMap.clear(); // 遍历所有属性,按地块编号分组 Map landProperties = new HashMap<>(); for (String key : properties.stringPropertyNames()) { // 解析键名格式:landNumber.propertyName String[] parts = key.split("\\.", 2); if (parts.length == 2) { String landNum = parts[0]; String propertyName = parts[1]; if (!landProperties.containsKey(landNum)) { landProperties.put(landNum, new Properties()); } landProperties.get(landNum).setProperty(propertyName, properties.getProperty(key)); } } // 为每个地块创建Dikuai对象 for (Map.Entry entry : landProperties.entrySet()) { String landNum = entry.getKey(); Properties landProps = entry.getValue(); Dikuai dikuai = new Dikuai(); dikuai.landNumber = landNum; dikuai.userId = landProps.getProperty("userId", "-1"); dikuai.landName = landProps.getProperty("landName", "-1"); dikuai.boundaryOriginalCoordinates = landProps.getProperty("boundaryOriginalCoordinates", "-1"); dikuai.boundaryCoordinates = landProps.getProperty("boundaryCoordinates", "-1"); dikuai.plannedPath = landProps.getProperty("plannedPath", "-1"); dikuai.returnPointCoordinates = landProps.getProperty("returnPointCoordinates", "-1"); dikuai.boundaryPointInterval = landProps.getProperty("boundaryPointInterval", "-1"); dikuai.angleThreshold = landProps.getProperty("angleThreshold", "-1"); dikuai.intelligentSceneAnalysis = landProps.getProperty("intelligentSceneAnalysis", "-1"); dikuai.landArea = landProps.getProperty("landArea", "-1"); dikuai.baseStationCoordinates = landProps.getProperty("baseStationCoordinates", "-1"); dikuai.createTime = landProps.getProperty("createTime", "-1"); dikuai.updateTime = landProps.getProperty("updateTime", "-1"); dikuai.mowingPattern = landProps.getProperty("mowingPattern", "-1"); dikuai.mowingWidth = landProps.getProperty("mowingWidth", "-1"); dikuai.mowingTrack = landProps.getProperty("mowingTrack", "-1"); dikuai.mowingBladeWidth = landProps.getProperty("mowingBladeWidth", "0.40"); dikuai.mowingOverlapDistance = landProps.getProperty("mowingOverlapDistance", "0.06"); dikuaiMap.put(landNum, dikuai); } } catch (IOException e) { // 如果文件不存在或读取失败,输出错误信息 System.err.println("无法读取dikuai.properties文件: " + e.getMessage()); } } /** * 根据地块编号获取地块对象 * @param landNumber 地块编号 * @return 地块对象,如果不存在则返回null */ public static Dikuai getDikuai(String landNumber) { return dikuaiMap.get(landNumber); } /** * 获取所有地块 * @return 所有地块的映射表 */ public static Map getAllDikuai() { return new HashMap<>(dikuaiMap); } /** * 添加或更新地块 * @param landNumber 地块编号 * @param dikuai 地块对象 */ public static void putDikuai(String landNumber, Dikuai dikuai) { dikuaiMap.put(landNumber, dikuai); } /** * 删除指定地块 * @param landNumber 地块编号 * @return 是否删除成功 */ public static boolean removeDikuai(String landNumber) { return dikuaiMap.remove(landNumber) != null; } /** * 更新指定地块的字段值 * @param landNumber 地块编号 * @param fieldName 字段名 * @param value 新值 * @return 是否更新成功 */ public static boolean updateField(String landNumber, String fieldName, String value) { Dikuai dikuai = dikuaiMap.get(landNumber); if (dikuai == null) { System.err.println("未找到地块编号: " + landNumber); return false; } return dikuai.updateInstanceField(fieldName, value); } /** * 实例方法:更新当前地块对象的字段值 * @param fieldName 字段名 * @param value 新值 * @return 是否更新成功 */ public boolean updateInstanceField(String fieldName, String value) { switch (fieldName) { case "userId": this.userId = value; return true; case "landNumber": this.landNumber = value; return true; case "landName": this.landName = value; return true; case "boundaryOriginalCoordinates": this.boundaryOriginalCoordinates = value; return true; case "boundaryCoordinates": this.boundaryCoordinates = value; return true; case "plannedPath": this.plannedPath = value; return true; case "returnPointCoordinates": this.returnPointCoordinates = value; return true; case "boundaryPointInterval": this.boundaryPointInterval = value; return true; case "angleThreshold": this.angleThreshold = value; return true; case "intelligentSceneAnalysis": this.intelligentSceneAnalysis = value; return true; case "landArea": this.landArea = value; return true; case "baseStationCoordinates": this.baseStationCoordinates = value; return true; case "createTime": this.createTime = value; return true; case "updateTime": this.updateTime = value; return true; case "mowingPattern": this.mowingPattern = value; return true; case "mowingWidth": this.mowingWidth = value; return true; case "mowingTrack": this.mowingTrack = value; return true; case "mowingBladeWidth": this.mowingBladeWidth = value; return true; case "mowingOverlapDistance": this.mowingOverlapDistance = value; return true; default: System.err.println("未知字段: " + fieldName); return false; } } /** * 保存所有地块数据到properties文件 */ public static void saveToProperties() { Properties properties = new Properties(); // 将所有地块数据写入Properties对象 for (Map.Entry entry : dikuaiMap.entrySet()) { String landNumber = entry.getKey(); Dikuai dikuai = entry.getValue(); if (dikuai.userId != null) properties.setProperty(landNumber + ".userId", dikuai.userId); if (dikuai.landNumber != null) properties.setProperty(landNumber + ".landNumber", dikuai.landNumber); if (dikuai.landName != null) properties.setProperty(landNumber + ".landName", dikuai.landName); if (dikuai.boundaryOriginalCoordinates != null) properties.setProperty(landNumber + ".boundaryOriginalCoordinates", dikuai.boundaryOriginalCoordinates); if (dikuai.boundaryCoordinates != null) properties.setProperty(landNumber + ".boundaryCoordinates", dikuai.boundaryCoordinates); if (dikuai.plannedPath != null) properties.setProperty(landNumber + ".plannedPath", dikuai.plannedPath); if (dikuai.returnPointCoordinates != null) properties.setProperty(landNumber + ".returnPointCoordinates", dikuai.returnPointCoordinates); if (dikuai.boundaryPointInterval != null) properties.setProperty(landNumber + ".boundaryPointInterval", dikuai.boundaryPointInterval); if (dikuai.angleThreshold != null) properties.setProperty(landNumber + ".angleThreshold", dikuai.angleThreshold); if (dikuai.intelligentSceneAnalysis != null) properties.setProperty(landNumber + ".intelligentSceneAnalysis", dikuai.intelligentSceneAnalysis); if (dikuai.landArea != null) properties.setProperty(landNumber + ".landArea", dikuai.landArea); if (dikuai.baseStationCoordinates != null) properties.setProperty(landNumber + ".baseStationCoordinates", dikuai.baseStationCoordinates); if (dikuai.createTime != null) properties.setProperty(landNumber + ".createTime", dikuai.createTime); if (dikuai.updateTime != null) properties.setProperty(landNumber + ".updateTime", dikuai.updateTime); if (dikuai.mowingPattern != null) properties.setProperty(landNumber + ".mowingPattern", dikuai.mowingPattern); if (dikuai.mowingWidth != null) properties.setProperty(landNumber + ".mowingWidth", dikuai.mowingWidth); if (dikuai.mowingTrack != null) properties.setProperty(landNumber + ".mowingTrack", dikuai.mowingTrack); if (dikuai.mowingBladeWidth != null) properties.setProperty(landNumber + ".mowingBladeWidth", dikuai.mowingBladeWidth); if (dikuai.mowingOverlapDistance != null) properties.setProperty(landNumber + ".mowingOverlapDistance", dikuai.mowingOverlapDistance); } try { // 保存到文件,使用UTF-8编码 FileOutputStream output = new FileOutputStream("dikuai.properties"); OutputStreamWriter writer = new OutputStreamWriter(output, StandardCharsets.UTF_8); properties.store(writer, "Dikuai Properties"); writer.close(); output.close(); } catch (IOException e) { System.err.println("无法保存dikuai.properties文件: " + e.getMessage()); } } // Getter 和 Setter 方法 public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getLandNumber() { return landNumber; } public void setLandNumber(String landNumber) { this.landNumber = landNumber; } public String getLandName() { return landName; } public void setLandName(String landName) { this.landName = landName; } public String getBoundaryOriginalCoordinates() { return boundaryOriginalCoordinates; } public void setBoundaryOriginalCoordinates(String boundaryOriginalCoordinates) { this.boundaryOriginalCoordinates = boundaryOriginalCoordinates; } public String getBoundaryCoordinates() { return boundaryCoordinates; } public void setBoundaryCoordinates(String boundaryCoordinates) { this.boundaryCoordinates = boundaryCoordinates; } public String getPlannedPath() { return plannedPath; } public void setPlannedPath(String plannedPath) { this.plannedPath = plannedPath; } public String getReturnPointCoordinates() { return returnPointCoordinates; } public void setReturnPointCoordinates(String returnPointCoordinates) { this.returnPointCoordinates = returnPointCoordinates; } public String getBoundaryPointInterval() { return boundaryPointInterval; } public void setBoundaryPointInterval(String boundaryPointInterval) { this.boundaryPointInterval = boundaryPointInterval; } public String getAngleThreshold() { return angleThreshold; } public void setAngleThreshold(String angleThreshold) { this.angleThreshold = angleThreshold; } public String getIntelligentSceneAnalysis() { return intelligentSceneAnalysis; } public void setIntelligentSceneAnalysis(String intelligentSceneAnalysis) { this.intelligentSceneAnalysis = intelligentSceneAnalysis; } public String getLandArea() { return landArea; } public void setLandArea(String landArea) { this.landArea = landArea; } public String getBaseStationCoordinates() { return baseStationCoordinates; } public void setBaseStationCoordinates(String baseStationCoordinates) { this.baseStationCoordinates = baseStationCoordinates; } public String getCreateTime() { return createTime; } public void setCreateTime(String createTime) { this.createTime = createTime; } public String getUpdateTime() { return updateTime; } public void setUpdateTime(String updateTime) { this.updateTime = updateTime; } public String getMowingPattern() { return mowingPattern; } public void setMowingPattern(String mowingPattern) { this.mowingPattern = mowingPattern; } public String getMowingWidth() { return mowingWidth; } public void setMowingWidth(String mowingWidth) { this.mowingWidth = mowingWidth; } public String getMowingTrack() { return mowingTrack; } public void setMowingTrack(String mowingTrack) { this.mowingTrack = mowingTrack; } public String getMowingBladeWidth() { return mowingBladeWidth; } public void setMowingBladeWidth(String mowingBladeWidth) { this.mowingBladeWidth = mowingBladeWidth; } public String getMowingOverlapDistance() { return mowingOverlapDistance; } public void setMowingOverlapDistance(String mowingOverlapDistance) { this.mowingOverlapDistance = mowingOverlapDistance; } @Override public String toString() { return "Dikuai{" + "userId='" + userId + '\'' + ", landNumber='" + landNumber + '\'' + ", landName='" + landName + '\'' + ", boundaryOriginalCoordinates='" + boundaryOriginalCoordinates + '\'' + ", boundaryCoordinates='" + boundaryCoordinates + '\'' + ", plannedPath='" + plannedPath + '\'' + ", returnPointCoordinates='" + returnPointCoordinates + '\'' + ", boundaryPointInterval='" + boundaryPointInterval + '\'' + ", angleThreshold='" + angleThreshold + '\'' + ", intelligentSceneAnalysis='" + intelligentSceneAnalysis + '\'' + ", landArea='" + landArea + '\'' + ", baseStationCoordinates='" + baseStationCoordinates + '\'' + ", createTime='" + createTime + '\'' + ", updateTime='" + updateTime + '\'' + ", mowingPattern='" + mowingPattern + '\'' + ", mowingWidth='" + mowingWidth + '\'' + '}'; } }