From c498385fb7e372d13e2ee76d7b54ae2381728082 Mon Sep 17 00:00:00 2001
From: 张世豪 <979909237@qq.com>
Date: 星期三, 17 十二月 2025 19:35:57 +0800
Subject: [PATCH] 新增了测量模式
---
src/dikuai/addzhangaiwu.java | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 250 insertions(+), 20 deletions(-)
diff --git a/src/dikuai/addzhangaiwu.java b/src/dikuai/addzhangaiwu.java
index 098de63..2952d93 100644
--- a/src/dikuai/addzhangaiwu.java
+++ b/src/dikuai/addzhangaiwu.java
@@ -56,6 +56,7 @@
import zhangaiwu.yulanzhangaiwu;
import zhuye.buttonset;
import bianjie.bianjieguihua2;
+import bianjie.ThreePointCircle;
/**
* 闅滅鐗╂柊澧�/缂栬緫瀵硅瘽妗嗐�傝璁¤瑷�鍙傝�� {@link AddDikuai}锛屾敮鎸侀�氳繃瀹炲湴缁樺埗閲囬泦闅滅鐗╁潗鏍囥��
@@ -921,6 +922,12 @@
boundaryStatusLabel.setVisible(false);
boundaryStatusLabel.setText("");
}
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝闅愯棌鐢熸垚杈圭晫鎸夐挳
+ String shapeKey = formData.get("obstacleShape");
+ boolean isCircle = "circle".equals(shapeKey);
+ if (isCircle && generateBoundaryButton != null) {
+ generateBoundaryButton.setVisible(false);
+ }
String method = formData.get("drawingMethod");
if (!isMeaningfulValue(method)) {
@@ -1095,14 +1102,11 @@
session.captureMessage = "鏃犳硶鏍规嵁閲囬泦鐨勭偣鐢熸垚鍦嗭紝璇风‘淇濋�夋嫨浜嗕笁涓潪鍏辩嚎鐨勫渾鍛ㄧ偣";
return;
}
- double[] radiusPoint = pickRadiusPoint(xyPoints, circle);
- if (radiusPoint == null) {
- session.captureSuccessful = false;
- session.captureMessage = "閲囬泦鐨勫渾鍛ㄧ偣寮傚父锛屾棤娉曠敓鎴愬渾";
- return;
- }
+ // 浣跨敤璁$畻鍑虹殑鍗婂緞鐢熸垚涓�涓湡姝g殑鍦嗕笂鐐癸紙鍦嗗績鍙充晶鐨勭偣锛夛紝纭繚棰勮鏃惰绠楃殑鍗婂緞鍜岀粨鏉熺粯鍒舵椂鐨勫崐寰勪竴鑷�
+ double radiusX = circle.centerX + circle.radius;
+ double radiusY = circle.centerY;
String result = String.format(Locale.US, "%.2f,%.2f;%.2f,%.2f",
- circle.centerX, circle.centerY, radiusPoint[0], radiusPoint[1]);
+ circle.centerX, circle.centerY, radiusX, radiusY);
session.data.put("obstacleCoordinates", result);
session.captureSuccessful = true;
session.captureMessage = "宸查噰闆嗗渾褰㈤殰纰嶇墿锛屽叡 " + xyPoints.size() + " 涓偣";
@@ -1436,16 +1440,26 @@
return;
}
String coords = formData.get("obstacleCoordinates");
+ String shapeKey = formData.get("obstacleShape");
+ boolean isCircle = "circle".equals(shapeKey);
+
if (isMeaningfulValue(coords)) {
- int count = countCoordinatePairs(coords);
- drawingStatusLabel.setText("宸查噰闆嗛殰纰嶇墿鏁版嵁锛岀偣鏁帮細" + count);
+ if (isCircle) {
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝鏄剧ず鍦嗗績鍧愭爣鍜屽崐寰�
+ String statusText = parseCircleStatusText(coords);
+ drawingStatusLabel.setText(statusText);
+ } else {
+ // 瀵逛簬澶氳竟褰㈤殰纰嶇墿锛屾樉绀虹偣鏁�
+ int count = countCoordinatePairs(coords);
+ drawingStatusLabel.setText("宸查噰闆嗛殰纰嶇墿鏁版嵁锛岀偣鏁帮細" + count);
+ }
if (!drawingInProgress && drawButton != null) {
drawButton.setText("閲嶆柊缁樺埗");
drawButton.setEnabled(true);
}
- // 缁樺埗瀹屾垚鍚庢樉绀�"鐢熸垚闅滅鐗╄竟鐣�"鎸夐挳
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝涓嶆樉绀�"鐢熸垚闅滅鐗╄竟鐣�"鎸夐挳
if (generateBoundaryButton != null) {
- generateBoundaryButton.setVisible(true);
+ generateBoundaryButton.setVisible(!isCircle);
}
} else {
drawingStatusLabel.setText("灏氭湭閲囬泦闅滅鐗╁潗鏍�");
@@ -1493,10 +1507,20 @@
if (previewButton == null) {
return;
}
+
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝涓嶆樉绀洪瑙堟寜閽�
+ String shapeKey = formData.get("obstacleShape");
+ boolean isCircle = "circle".equals(shapeKey);
+ if (isCircle) {
+ previewButton.setVisible(false);
+ previewButton.setEnabled(false);
+ return;
+ }
+
// 鍙湁鍦ㄧ敓鎴愯竟鐣屽悗鎵嶆樉绀洪瑙堟寜閽�
String generatedBoundary = formData.get("generatedBoundaryCoordinates");
boolean hasGeneratedBoundary = isMeaningfulValue(generatedBoundary);
-
+
if (hasGeneratedBoundary) {
// 鐢熸垚杈圭晫鍚庯紝閲嶆柊鍒涘缓缁胯壊鐨勯瑙堟寜閽�
// 鑾峰彇鎸夐挳鐨勭埗瀹瑰櫒鍜屼綅缃�
@@ -1572,6 +1596,49 @@
}
return count;
}
+
+ /**
+ * 瑙f瀽鍦嗗舰闅滅鐗╁潗鏍囷紝鐢熸垚鐘舵�佹枃鏈�
+ * 鏍煎紡锛歝enterX,centerY;radiusX,radiusY
+ * 杩斿洖锛氬綋鍓嶉噰闆嗗渾褰㈠渾蹇冨潗鏍噚,y,鍗婂緞n绫�
+ */
+ private String parseCircleStatusText(String coords) {
+ if (!isMeaningfulValue(coords)) {
+ return "灏氭湭閲囬泦鍦嗗舰闅滅鐗╁潗鏍�";
+ }
+
+ try {
+ String[] pairs = coords.split(";");
+ if (pairs.length < 2) {
+ return "鍦嗗舰闅滅鐗╁潗鏍囨牸寮忛敊璇�";
+ }
+
+ // 瑙f瀽鍦嗗績鍧愭爣
+ String[] centerParts = pairs[0].trim().split(",");
+ if (centerParts.length < 2) {
+ return "鍦嗗舰闅滅鐗╁潗鏍囨牸寮忛敊璇�";
+ }
+ double centerX = Double.parseDouble(centerParts[0].trim());
+ double centerY = Double.parseDouble(centerParts[1].trim());
+
+ // 瑙f瀽鍦嗕笂涓�鐐瑰潗鏍�
+ String[] radiusParts = pairs[1].trim().split(",");
+ if (radiusParts.length < 2) {
+ return "鍦嗗舰闅滅鐗╁潗鏍囨牸寮忛敊璇�";
+ }
+ double radiusX = Double.parseDouble(radiusParts[0].trim());
+ double radiusY = Double.parseDouble(radiusParts[1].trim());
+
+ // 璁$畻鍗婂緞锛堢背锛�
+ double radius = Math.sqrt(Math.pow(radiusX - centerX, 2) + Math.pow(radiusY - centerY, 2));
+
+ // 鏍煎紡鍖栨樉绀猴細褰撳墠閲囬泦鍦嗗舰鍦嗗績鍧愭爣x,y,鍗婂緞n绫�
+ return String.format(Locale.US, "褰撳墠閲囬泦鍦嗗舰鍦嗗績鍧愭爣%.2f,%.2f,鍗婂緞%.2f绫�",
+ centerX, centerY, radius);
+ } catch (Exception e) {
+ return "鍦嗗舰闅滅鐗╁潗鏍囪В鏋愬け璐�";
+ }
+ }
private void updateSaveButtonState() {
if (saveButton != null) {
@@ -1651,8 +1718,16 @@
String coords = coordsValue.trim();
String originalCoords = isMeaningfulValue(originalValue) ? originalValue.trim() : null;
- // 濡傛灉鏈夌敓鎴愮殑杈圭晫鍧愭爣锛屼娇鐢ㄧ敓鎴愮殑杈圭晫鍧愭爣锛涘惁鍒欎娇鐢ㄥ師濮嬪潗鏍�
- String finalCoords = isMeaningfulValue(generatedBoundaryValue) ? generatedBoundaryValue.trim() : coords;
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝鐩存帴浣跨敤obstacleCoordinates锛堝湪绗�3涓偣纭鏃跺凡鐢熸垚锛�
+ // 瀵逛簬澶氳竟褰㈤殰纰嶇墿锛屽鏋滄湁鐢熸垚鐨勮竟鐣屽潗鏍囷紝浣跨敤鐢熸垚鐨勮竟鐣屽潗鏍囷紱鍚﹀垯浣跨敤鍘熷鍧愭爣
+ String finalCoords;
+ if ("circle".equals(shapeKey)) {
+ // 鍦嗗舰闅滅鐗╃洿鎺ヤ娇鐢ㄥ凡鐢熸垚鐨勫潗鏍�
+ finalCoords = coords;
+ } else {
+ // 澶氳竟褰㈤殰纰嶇墿浼樺厛浣跨敤鐢熸垚鐨勮竟鐣屽潗鏍�
+ finalCoords = isMeaningfulValue(generatedBoundaryValue) ? generatedBoundaryValue.trim() : coords;
+ }
String trimmedName = isMeaningfulValue(obstacleName) ? obstacleName.trim() : null;
if (!isMeaningfulValue(trimmedName)) {
JOptionPane.showMessageDialog(this, "闅滅鐗╁悕绉版棤鏁�", "閿欒", JOptionPane.ERROR_MESSAGE);
@@ -1694,14 +1769,128 @@
}
String shapeKey = formData.get("obstacleShape");
- if (!"polygon".equals(shapeKey)) {
- JOptionPane.showMessageDialog(this, "鍙湁澶氳竟褰㈤殰纰嶇墿鎵嶉渶瑕佺敓鎴愯竟鐣屽潗鏍�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
- return;
- }
try {
- // 妫�鏌ョ粯鍒舵柟寮忥紝鍙湁鍓茶崏鏈虹粯鍒剁殑澶氳竟褰㈡墠璋冪敤bianjieguihua2
String method = formData.get("drawingMethod");
+
+ // 澶勭悊鍦嗗舰闅滅鐗�
+ if ("circle".equals(shapeKey)) {
+ if (!"mower".equals(method)) {
+ JOptionPane.showMessageDialog(this, "鍙湁鍓茶崏鏈虹粯鍒剁殑鍦嗗舰闅滅鐗╂墠鏀寔鐢熸垚杈圭晫鍧愭爣", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+
+ // 灏嗗師濮嬪潗鏍囪浆鎹负Coordinate瀵硅薄鍒楄〃
+ List<Coordinate> coordinateList = parseOriginalCoordinatesToCoordinateList(originalCoords);
+ if (coordinateList.size() < 3) {
+ JOptionPane.showMessageDialog(this, "鍦嗗舰闅滅鐗╄嚦灏戦渶瑕佷笁涓噰闆嗙偣", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 瑙f瀽鍩虹珯鍧愭爣
+ String[] baseParts = baseStation.split(",");
+ if (baseParts.length < 4) {
+ JOptionPane.showMessageDialog(this, "鍩虹珯鍧愭爣鏍煎紡鏃犳晥", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ double baseLat = parseDMToDecimal(baseParts[0].trim(), baseParts[1].trim());
+ double baseLon = parseDMToDecimal(baseParts[2].trim(), baseParts[3].trim());
+
+ // 灏嗗師濮嬪潗鏍囪浆鎹负XY鍧愭爣锛堟湰鍦板潗鏍囩郴锛�
+ List<double[]> xyPoints = new ArrayList<>();
+ for (Coordinate coord : coordinateList) {
+ double lat = parseDMToDecimal(coord.getLatitude(), coord.getLatDirection());
+ double lon = parseDMToDecimal(coord.getLongitude(), coord.getLonDirection());
+ xyPoints.add(convertLatLonToLocal(lat, lon, baseLat, baseLon));
+ }
+
+ // 浣跨敤ThreePointCircle绠楁硶璁$畻鍦嗗績鍜屽崐寰�
+ if (xyPoints.size() < 3) {
+ JOptionPane.showMessageDialog(this, "鑷冲皯闇�瑕佷笁涓偣鎵嶈兘鐢熸垚鍦嗗舰杈圭晫", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 鍙栧墠涓変釜鐐硅绠楀渾
+ double[] p1 = xyPoints.get(0);
+ double[] p2 = xyPoints.get(1);
+ double[] p3 = xyPoints.get(2);
+
+ String point1 = String.format(Locale.US, "%.2f,%.2f", p1[0], p1[1]);
+ String point2 = String.format(Locale.US, "%.2f,%.2f", p2[0], p2[1]);
+ String point3 = String.format(Locale.US, "%.2f,%.2f", p3[0], p3[1]);
+
+ String circleResult = bianjie.ThreePointCircle.getCircleFromPoints(point1, point2, point3);
+
+ // 瑙f瀽缁撴灉锛氭牸寮忎负 "鍦嗗績: x,y; 鍗婂緞: r"
+ if (circleResult == null || circleResult.startsWith("閿欒")) {
+ JOptionPane.showMessageDialog(this, "鐢熸垚鍦嗗舰杈圭晫澶辫触: " + circleResult, "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 瑙f瀽鍦嗗績鍜屽崐寰�
+ String[] parts = circleResult.split(";");
+ if (parts.length < 2) {
+ JOptionPane.showMessageDialog(this, "瑙f瀽鍦嗗舰杈圭晫缁撴灉澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ // 鎻愬彇鍦嗗績鍧愭爣
+ String centerPart = parts[0].trim(); // "鍦嗗績: x,y"
+ String radiusPart = parts[1].trim(); // "鍗婂緞: r"
+
+ String centerCoords = centerPart.substring(centerPart.indexOf(":") + 1).trim();
+ String radiusStr = radiusPart.substring(radiusPart.indexOf(":") + 1).trim();
+
+ String[] centerXY = centerCoords.split(",");
+ if (centerXY.length < 2) {
+ JOptionPane.showMessageDialog(this, "瑙f瀽鍦嗗績鍧愭爣澶辫触", "閿欒", JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ double centerX = Double.parseDouble(centerXY[0].trim());
+ double centerY = Double.parseDouble(centerXY[1].trim());
+ double radius = Double.parseDouble(radiusStr.trim());
+
+ // 璁$畻鍦嗕笂涓�鐐癸紙鍦嗗績鍙充晶鐨勭偣锛�
+ double radiusX = centerX + radius;
+ double radiusY = centerY;
+
+ // 鐢熸垚杈圭晫鍧愭爣鏍煎紡锛氬渾蹇僗,鍦嗗績Y;鍦嗕笂鐐筙,鍦嗕笂鐐筜
+ String boundaryCoords = String.format(Locale.US, "%.2f,%.2f;%.2f,%.2f",
+ centerX, centerY, radiusX, radiusY);
+
+ // 淇濆瓨鐢熸垚鐨勮竟鐣屽潗鏍�
+ formData.put("generatedBoundaryCoordinates", boundaryCoords);
+
+ // 鏇存柊杈圭晫鐘舵�佹爣绛炬樉绀猴紙鍦嗗舰鍙湁2涓偣锛氬渾蹇冨拰鍦嗕笂涓�鐐癸級
+ updateBoundaryStatusLabel(2);
+
+ // 鏇存柊棰勮鎸夐挳鏄剧ず锛堝彉鎴愮豢鑹插彲鐐瑰嚮锛�
+ updatePreviewButtonState();
+
+ // 鏇存柊淇濆瓨鎸夐挳鐘舵�侊紙鍙樻垚鍙偣鍑伙級
+ updateSaveButtonState();
+
+ // 寮哄埗鍒锋柊UI
+ SwingUtilities.invokeLater(() -> {
+ if (previewButton != null) {
+ previewButton.revalidate();
+ previewButton.repaint();
+ }
+ });
+
+ JOptionPane.showMessageDialog(this, "鍦嗗舰闅滅鐗╄竟鐣屽潗鏍囧凡鐢熸垚", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+
+ // 澶勭悊澶氳竟褰㈤殰纰嶇墿
+ if (!"polygon".equals(shapeKey)) {
+ JOptionPane.showMessageDialog(this, "鍙湁澶氳竟褰㈡垨鍦嗗舰闅滅鐗╂墠闇�瑕佺敓鎴愯竟鐣屽潗鏍�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+
+ // 妫�鏌ョ粯鍒舵柟寮忥紝鍙湁鍓茶崏鏈虹粯鍒剁殑澶氳竟褰㈡墠璋冪敤bianjieguihua2
if (!"mower".equals(method)) {
JOptionPane.showMessageDialog(this, "鍙湁鍓茶崏鏈虹粯鍒剁殑澶氳竟褰㈡墠鏀寔鐢熸垚杈圭晫鍧愭爣", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
return;
@@ -1816,6 +2005,36 @@
String landName = targetDikuai.getLandName();
String boundary = targetDikuai.getBoundaryCoordinates();
+ // 鑾峰彇闅滅鐗╁潗鏍囷紙浼樺厛浣跨敤鐢熸垚鐨勮竟鐣屽潗鏍囷紝濡傛灉娌℃湁鍒欎娇鐢ㄥ師濮嬪潗鏍囷級
+ String obstacleCoords = generatedBoundary;
+ String shapeKey = formData.get("obstacleShape");
+ String obstacleName = formData.get("obstacleName");
+
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝鐢熸垚鐨勮竟鐣屽潗鏍囨牸寮忓氨鏄殰纰嶇墿鍧愭爣鏍煎紡锛屽彲浠ョ洿鎺ヤ娇鐢�
+ // 瀵逛簬澶氳竟褰㈤殰纰嶇墿锛屼篃闇�瑕佷娇鐢ㄧ敓鎴愮殑杈圭晫鍧愭爣
+ // 濡傛灉鐢熸垚鐨勮竟鐣屽潗鏍囦笉鍙敤锛屽皾璇曚娇鐢ㄥ師濮嬮殰纰嶇墿鍧愭爣
+ if (!isMeaningfulValue(obstacleCoords)) {
+ obstacleCoords = formData.get("obstacleCoordinates");
+ if (!isMeaningfulValue(obstacleCoords)) {
+ JOptionPane.showMessageDialog(this, "鏃犳硶鑾峰彇闅滅鐗╁潗鏍囪繘琛岄瑙�", "鎻愮ず", JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+ }
+
+ // 鏋勫缓闅滅鐗╂暟鎹瓧绗︿覆锛屽寘鍚悕绉般�佸舰鐘跺拰鍧愭爣
+ // 鏍煎紡锛氶殰纰嶇墿鍚嶇О::褰㈢姸::鍧愭爣 鎴� 闅滅鐗╁悕绉�:褰㈢姸:鍧愭爣
+ final String obstacleData;
+ if (isMeaningfulValue(obstacleName) && isMeaningfulValue(shapeKey)) {
+ // 浣跨敤 :: 鍒嗛殧绗︽牸寮忥細鍚嶇О::褰㈢姸::鍧愭爣
+ obstacleData = obstacleName.trim() + "::" + shapeKey.trim() + "::" + obstacleCoords;
+ } else if (isMeaningfulValue(shapeKey)) {
+ // 鍙湁褰㈢姸锛氬舰鐘�::鍧愭爣
+ obstacleData = shapeKey.trim() + "::" + obstacleCoords;
+ } else {
+ // 鍙湁鍧愭爣
+ obstacleData = obstacleCoords;
+ }
+
// 鍏抽棴褰撳墠瀵硅瘽妗�
setVisible(false);
@@ -1827,7 +2046,7 @@
landNumber,
landName,
boundary,
- generatedBoundary, // 浣跨敤鐢熸垚鐨勮竟鐣屽潗鏍囦綔涓洪殰纰嶇墿鍧愭爣
+ obstacleData, // 浣跨敤鍖呭惈鍚嶇О鍜屽舰鐘剁殑闅滅鐗╂暟鎹�
null,
() -> SwingUtilities.invokeLater(() -> {
// 閲嶆柊鎵撳紑鏂板闅滅鐗╂楠�2椤甸潰
@@ -2056,6 +2275,17 @@
saveButton.setVisible(true);
updateDrawingStatus();
updatePreviewButtonState();
+ // 瀵逛簬鍦嗗舰闅滅鐗╋紝纭繚棰勮鎸夐挳鍜岀敓鎴愯竟鐣屾寜閽殣钘�
+ String shapeKey = formData.get("obstacleShape");
+ boolean isCircle = "circle".equals(shapeKey);
+ if (isCircle) {
+ if (previewButton != null) {
+ previewButton.setVisible(false);
+ }
+ if (generateBoundaryButton != null) {
+ generateBoundaryButton.setVisible(false);
+ }
+ }
}
updateSaveButtonState();
revalidate();
--
Gitblit v1.10.0