代码提交
This commit is contained in:
parent
f36868808d
commit
4bf1cd70df
|
|
@ -88,7 +88,6 @@
|
|||
<artifactId>proj4j</artifactId>
|
||||
<version>1.1.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.geotools</groupId>
|
||||
<artifactId>gt-referencing</artifactId>
|
||||
|
|
|
|||
|
|
@ -14,8 +14,10 @@ import java.util.UUID;
|
|||
|
||||
public class DxfClient {
|
||||
|
||||
private static final String GET_LAYERS_URL = "http://192.168.0.14:21010/get_layers";
|
||||
private static final String EXTRACT_LAYERS_URL = "http://192.168.0.14:21010/extract_layers";
|
||||
/* private static final String GET_LAYERS_URL = "http://192.168.0.14:21010/get_layers";
|
||||
private static final String EXTRACT_LAYERS_URL = "http://192.168.0.14:21010/extract_layers";*/
|
||||
private static final String GET_LAYERS_URL = "http://192.168.0.37:8008/get_layers";
|
||||
private static final String EXTRACT_LAYERS_URL = "http://192.168.0.37:8008/extract_layers";
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
//获取图层函数代码
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ public class CadData {
|
|||
* 完整 geometry JSON(备份原始结构)
|
||||
*/
|
||||
private String geometry;
|
||||
private String geometryWGS84;
|
||||
|
||||
private LocalDateTime createdAt;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,11 +10,10 @@ import com.bonus.waterdesign.mapper.ProjectMapper;
|
|||
import com.bonus.waterdesign.service.ModelService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.locationtech.proj4j.*;
|
||||
import org.opengis.referencing.FactoryException;
|
||||
import org.opengis.referencing.operation.TransformException;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
|
|
@ -125,7 +124,7 @@ public class ModelServiceImpl implements ModelService {
|
|||
@Override
|
||||
public boolean add(PeojectNodes node) {
|
||||
//id给我随机生成32为的字符串
|
||||
node.setId(java.util.UUID.randomUUID().toString());
|
||||
node.setId(UUID.randomUUID().toString());
|
||||
return modelMapper.insert(node) > 0;
|
||||
}
|
||||
|
||||
|
|
@ -146,98 +145,302 @@ public class ModelServiceImpl implements ModelService {
|
|||
CRSFactory crsFactory = new CRSFactory();
|
||||
CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();
|
||||
|
||||
// 定义坐标系(CGCS2000 GK Zone 20 → WGS84)
|
||||
CoordinateReferenceSystem gkZone20 = crsFactory.createFromParameters("EPSG:4498",
|
||||
"+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
|
||||
// 定义坐标系:CGCS2000 3-degree GK zone 20 → WGS84
|
||||
CoordinateReferenceSystem cgcs2000Zone20 = crsFactory.createFromName("EPSG:4498");
|
||||
CoordinateReferenceSystem wgs84 = crsFactory.createFromName("EPSG:4326");
|
||||
|
||||
CoordinateTransform transform = ctFactory.createTransform(gkZone20, wgs84);
|
||||
CoordinateTransform transform = ctFactory.createTransform(cgcs2000Zone20, wgs84);
|
||||
|
||||
for (CadData cadDatum : cadData) {
|
||||
String geometry = cadDatum.getGeometry();
|
||||
JSONObject jsonObject = JSON.parseObject(geometry);
|
||||
|
||||
if (jsonObject.get("type").equals("LINE")) {
|
||||
JSONArray startArray = jsonObject.getJSONArray("start");
|
||||
JSONArray endArray = jsonObject.getJSONArray("end");
|
||||
// 获取第一个元素(X坐标)
|
||||
double x = startArray.getDouble(0);
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y = startArray.getDouble(1);
|
||||
// 获取第一个元素(X坐标)
|
||||
double x1 = endArray.getDouble(0);
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y1 = endArray.getDouble(1);
|
||||
|
||||
// 原始坐标
|
||||
ProjCoordinate startGk = new ProjCoordinate(x, y);
|
||||
ProjCoordinate endGk = new ProjCoordinate(x1, y1);
|
||||
// 获取投影坐标并加上20带号
|
||||
double startX = startArray.getDouble(0) + 20000000;
|
||||
double startY = startArray.getDouble(1);
|
||||
double endX = endArray.getDouble(0) + 20000000;
|
||||
double endY = endArray.getDouble(1);
|
||||
|
||||
// 转换
|
||||
// 1. 投影坐标 → WGS84经纬度(高精度)
|
||||
ProjCoordinate startWgs84 = new ProjCoordinate();
|
||||
ProjCoordinate endWgs84 = new ProjCoordinate();
|
||||
transform.transform(startGk, startWgs84);
|
||||
transform.transform(endGk, endWgs84);
|
||||
transform.transform(new ProjCoordinate(startX, startY), startWgs84);
|
||||
transform.transform(new ProjCoordinate(endX, endY), endWgs84);
|
||||
|
||||
|
||||
startArray.set(0, startWgs84.x);
|
||||
startArray.set(1, startWgs84.y);
|
||||
endArray.set(0, endWgs84.x);
|
||||
endArray.set(1, endWgs84.y);
|
||||
cadDatum.setGeometryWGS84(jsonObject.toString());
|
||||
|
||||
// 2. WGS84经纬度 → 百度BD09坐标(高精度)
|
||||
double[] startBd09 = wgs84ToBd09WithPrecision(startWgs84.x, startWgs84.y);
|
||||
double[] endBd09 = wgs84ToBd09WithPrecision(endWgs84.x, endWgs84.y);
|
||||
|
||||
// 更新为百度BD09坐标,保留高精度
|
||||
startArray.set(0, formatCoordinate(startBd09[0]));
|
||||
startArray.set(1, formatCoordinate(startBd09[1]));
|
||||
endArray.set(0, formatCoordinate(endBd09[0]));
|
||||
endArray.set(1, formatCoordinate(endBd09[1]));
|
||||
|
||||
cadDatum.setGeometry(jsonObject.toString());
|
||||
}
|
||||
|
||||
if (jsonObject.get("type").equals("LWPOLYLINE")) {
|
||||
JSONArray pointsArray = jsonObject.getJSONArray("points");
|
||||
JSONArray pointsArray = jsonObject.getJSONArray("segments");
|
||||
|
||||
// === 深拷贝 points 数组,用于 WGS84 转换 ===
|
||||
JSONArray pointsArrayWGS84 = JSON.parseArray(JSON.toJSONString(pointsArray));
|
||||
|
||||
// === 1. 处理 BD09 坐标:修改原始 pointsArray,并生成 BD09 的 geometry ===
|
||||
for (int i = 0; i < pointsArray.size(); i++) {
|
||||
JSONArray point = pointsArray.getJSONArray(i);
|
||||
double x = point.getDouble(0);
|
||||
double y = point.getDouble(1);
|
||||
JSONObject point = pointsArray.getJSONObject(i);
|
||||
if (point.get("type").equals("line")) {
|
||||
if (point.containsKey("start")) {
|
||||
JSONArray startArray = point.getJSONArray("start");
|
||||
double x = startArray.getDoubleValue(0) + 20000000;
|
||||
double y = startArray.getDoubleValue(1);
|
||||
|
||||
// 原始坐标
|
||||
ProjCoordinate pointstGk = new ProjCoordinate(x, y);
|
||||
// 假设 transform 和 wgs84ToBd09WithPrecision 已定义
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
double[] bd09 = wgs84ToBd09WithPrecision(wgs84Coord.x, wgs84Coord.y);
|
||||
|
||||
// 转换
|
||||
ProjCoordinate pointstGkWgs84 = new ProjCoordinate();
|
||||
transform.transform(pointstGk, pointstGkWgs84);
|
||||
// 更新 start 数组
|
||||
startArray.set(0, formatCoordinate(bd09[0]));
|
||||
startArray.set(1, formatCoordinate(bd09[1]));
|
||||
}
|
||||
if (point.containsKey("end")) {
|
||||
JSONArray endArray = point.getJSONArray("end");
|
||||
double x = endArray.getDoubleValue(0) + 20000000;
|
||||
double y = endArray.getDoubleValue(1);
|
||||
|
||||
point.set(0, pointstGkWgs84.x);
|
||||
point.set(1, pointstGkWgs84.y);
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
double[] bd09 = wgs84ToBd09WithPrecision(wgs84Coord.x, wgs84Coord.y);
|
||||
|
||||
// 更新 end 数组
|
||||
endArray.set(0, formatCoordinate(bd09[0]));
|
||||
endArray.set(1, formatCoordinate(bd09[1]));
|
||||
}
|
||||
} else if (point.get("type").equals("arc")) {
|
||||
if (point.containsKey("center")) {
|
||||
JSONArray arcArray = point.getJSONArray("center");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
double[] bd09 = wgs84ToBd09WithPrecision(wgs84Coord.x, wgs84Coord.y);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, formatCoordinate(bd09[0]));
|
||||
arcArray.set(1, formatCoordinate(bd09[1]));
|
||||
}
|
||||
if (point.containsKey("end_point")) {
|
||||
JSONArray arcArray = point.getJSONArray("end_point");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
double[] bd09 = wgs84ToBd09WithPrecision(wgs84Coord.x, wgs84Coord.y);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, formatCoordinate(bd09[0]));
|
||||
arcArray.set(1, formatCoordinate(bd09[1]));
|
||||
}
|
||||
if (point.containsKey("start_point")) {
|
||||
JSONArray arcArray = point.getJSONArray("start_point");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
double[] bd09 = wgs84ToBd09WithPrecision(wgs84Coord.x, wgs84Coord.y);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, formatCoordinate(bd09[0]));
|
||||
arcArray.set(1, formatCoordinate(bd09[1]));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
cadDatum.setGeometry(jsonObject.toString());
|
||||
// 此时 jsonObject 的 points 已变成 BD09 坐标
|
||||
cadDatum.setGeometry(jsonObject.toString()); // 存储 BD09
|
||||
}
|
||||
|
||||
if (jsonObject.get("type").equals("CIRCLE")) {
|
||||
JSONArray centerArray = jsonObject.getJSONArray("center");
|
||||
// 获取第一个元素(X坐标)
|
||||
double x = centerArray.getDouble(0);
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y = centerArray.getDouble(1);
|
||||
// 原始坐标
|
||||
ProjCoordinate startGk = new ProjCoordinate(x, y);
|
||||
ProjCoordinate startWgs84 = new ProjCoordinate();
|
||||
transform.transform(startGk, startWgs84);
|
||||
centerArray.set(0, startWgs84.x);
|
||||
centerArray.set(1, startWgs84.y);
|
||||
double centerX = centerArray.getDouble(0) + 20000000;
|
||||
double centerY = centerArray.getDouble(1);
|
||||
|
||||
// 投影坐标 → WGS84
|
||||
ProjCoordinate centerWgs84 = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(centerX, centerY), centerWgs84);
|
||||
centerArray.set(0, centerWgs84.x);
|
||||
centerArray.set(1, centerWgs84.y);
|
||||
cadDatum.setGeometryWGS84(jsonObject.toString());
|
||||
|
||||
// WGS84 → BD09(高精度)
|
||||
double[] centerBd09 = wgs84ToBd09WithPrecision(centerWgs84.x, centerWgs84.y);
|
||||
|
||||
centerArray.set(0, formatCoordinate(centerBd09[0]));
|
||||
centerArray.set(1, formatCoordinate(centerBd09[1]));
|
||||
cadDatum.setGeometry(jsonObject.toString());
|
||||
}
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("坐标转换错误", e);
|
||||
}
|
||||
return cadData;
|
||||
}
|
||||
|
||||
|
||||
// 高精度 WGS84转百度BD09坐标
|
||||
private static double[] wgs84ToBd09WithPrecision(double wgsLon, double wgsLat) {
|
||||
// WGS84 → GCJ02(高精度)
|
||||
double[] gcj02 = wgs84ToGcj02WithPrecision(wgsLon, wgsLat);
|
||||
// GCJ02 → BD09(高精度)
|
||||
return gcj02ToBd09WithPrecision(gcj02[0], gcj02[1]);
|
||||
}
|
||||
|
||||
// 高精度 WGS84转火星坐标系GCJ02
|
||||
private static double[] wgs84ToGcj02WithPrecision(double wgsLon, double wgsLat) {
|
||||
if (outOfChina(wgsLon, wgsLat)) {
|
||||
return new double[]{wgsLon, wgsLat};
|
||||
}
|
||||
|
||||
// 使用 BigDecimal 进行高精度计算
|
||||
BigDecimal lon = BigDecimal.valueOf(wgsLon);
|
||||
BigDecimal lat = BigDecimal.valueOf(wgsLat);
|
||||
|
||||
double[] delta = deltaWithPrecision(lon.doubleValue(), lat.doubleValue());
|
||||
return new double[]{
|
||||
lon.add(BigDecimal.valueOf(delta[0])).doubleValue(),
|
||||
lat.add(BigDecimal.valueOf(delta[1])).doubleValue()
|
||||
};
|
||||
}
|
||||
|
||||
// 高精度 火星坐标系GCJ02转百度BD09
|
||||
private static double[] gcj02ToBd09WithPrecision(double gcjLon, double gcjLat) {
|
||||
BigDecimal x = BigDecimal.valueOf(gcjLon);
|
||||
BigDecimal y = BigDecimal.valueOf(gcjLat);
|
||||
BigDecimal pi = BigDecimal.valueOf(Math.PI);
|
||||
|
||||
// 计算 z = sqrt(x² + y²) + 0.00002 * sin(y * π)
|
||||
BigDecimal xSquared = x.multiply(x);
|
||||
BigDecimal ySquared = y.multiply(y);
|
||||
BigDecimal sumSquared = xSquared.add(ySquared);
|
||||
BigDecimal z = BigDecimal.valueOf(Math.sqrt(sumSquared.doubleValue()))
|
||||
.add(BigDecimal.valueOf(0.00002)
|
||||
.multiply(BigDecimal.valueOf(Math.sin(y.multiply(pi).doubleValue()))));
|
||||
|
||||
// 计算 theta = atan2(y, x) + 0.000003 * cos(x * π)
|
||||
BigDecimal theta = BigDecimal.valueOf(Math.atan2(y.doubleValue(), x.doubleValue()))
|
||||
.add(BigDecimal.valueOf(0.000003)
|
||||
.multiply(BigDecimal.valueOf(Math.cos(x.multiply(pi).doubleValue()))));
|
||||
|
||||
// 计算百度坐标
|
||||
double bdLon = z.multiply(BigDecimal.valueOf(Math.cos(theta.doubleValue())))
|
||||
.add(BigDecimal.valueOf(0.0065)).doubleValue();
|
||||
double bdLat = z.multiply(BigDecimal.valueOf(Math.sin(theta.doubleValue())))
|
||||
.add(BigDecimal.valueOf(0.006)).doubleValue();
|
||||
|
||||
return new double[]{bdLon, bdLat};
|
||||
}
|
||||
|
||||
// 高精度计算WGS84到GCJ02的偏移量
|
||||
private static double[] deltaWithPrecision(double wgsLon, double wgsLat) {
|
||||
BigDecimal lon = BigDecimal.valueOf(wgsLon);
|
||||
BigDecimal lat = BigDecimal.valueOf(wgsLat);
|
||||
|
||||
double a = 6378245.0;
|
||||
double ee = 0.00669342162296594323;
|
||||
|
||||
double dLat = transformLatWithPrecision(lon.doubleValue() - 105.0, lat.doubleValue() - 35.0);
|
||||
double dLon = transformLonWithPrecision(lon.doubleValue() - 105.0, lat.doubleValue() - 35.0);
|
||||
|
||||
double radLat = lat.doubleValue() / 180.0 * Math.PI;
|
||||
double magic = Math.sin(radLat);
|
||||
magic = 1 - ee * magic * magic;
|
||||
double sqrtMagic = Math.sqrt(magic);
|
||||
|
||||
dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * Math.PI);
|
||||
dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * Math.PI);
|
||||
|
||||
return new double[]{dLon, dLat};
|
||||
}
|
||||
|
||||
// 高精度纬度转换
|
||||
private static double transformLatWithPrecision(double x, double y) {
|
||||
BigDecimal bdX = BigDecimal.valueOf(x);
|
||||
BigDecimal bdY = BigDecimal.valueOf(y);
|
||||
BigDecimal pi = BigDecimal.valueOf(Math.PI);
|
||||
|
||||
double ret = -100.0 + 2.0 * bdX.doubleValue() + 3.0 * bdY.doubleValue() +
|
||||
0.2 * bdY.doubleValue() * bdY.doubleValue() +
|
||||
0.1 * bdX.doubleValue() * bdY.doubleValue() +
|
||||
0.2 * Math.sqrt(Math.abs(bdX.doubleValue()));
|
||||
|
||||
ret += (20.0 * Math.sin(6.0 * bdX.doubleValue() * Math.PI) +
|
||||
20.0 * Math.sin(2.0 * bdX.doubleValue() * Math.PI)) * 2.0 / 3.0;
|
||||
ret += (20.0 * Math.sin(bdY.doubleValue() * Math.PI) +
|
||||
40.0 * Math.sin(bdY.doubleValue() / 3.0 * Math.PI)) * 2.0 / 3.0;
|
||||
ret += (160.0 * Math.sin(bdY.doubleValue() / 12.0 * Math.PI) +
|
||||
320 * Math.sin(bdY.doubleValue() * Math.PI / 30.0)) * 2.0 / 3.0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 高精度经度转换
|
||||
private static double transformLonWithPrecision(double x, double y) {
|
||||
BigDecimal bdX = BigDecimal.valueOf(x);
|
||||
BigDecimal bdY = BigDecimal.valueOf(y);
|
||||
|
||||
double ret = 300.0 + bdX.doubleValue() + 2.0 * bdY.doubleValue() +
|
||||
0.1 * bdX.doubleValue() * bdX.doubleValue() +
|
||||
0.1 * bdX.doubleValue() * bdY.doubleValue() +
|
||||
0.1 * Math.sqrt(Math.abs(bdX.doubleValue()));
|
||||
|
||||
ret += (20.0 * Math.sin(6.0 * bdX.doubleValue() * Math.PI) +
|
||||
20.0 * Math.sin(2.0 * bdX.doubleValue() * Math.PI)) * 2.0 / 3.0;
|
||||
ret += (20.0 * Math.sin(bdX.doubleValue() * Math.PI) +
|
||||
40.0 * Math.sin(bdX.doubleValue() / 3.0 * Math.PI)) * 2.0 / 3.0;
|
||||
ret += (150.0 * Math.sin(bdX.doubleValue() / 12.0 * Math.PI) +
|
||||
300.0 * Math.sin(bdX.doubleValue() / 30.0 * Math.PI)) * 2.0 / 3.0;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// 格式化坐标值,保留足够精度(10位小数)
|
||||
private double formatCoordinate(double value) {
|
||||
return Math.round(value * 10000000000.0) / 10000000000.0; // 保留10位小数
|
||||
}
|
||||
|
||||
// 判断是否在中国境外(保持不变)
|
||||
private static boolean outOfChina(double lon, double lat) {
|
||||
return lon < 72.004 || lon > 137.8347 || lat < 0.8293 || lat > 55.8271;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<CadData> openAllView(PeojectNodes node) throws FactoryException, TransformException {
|
||||
public List<CadData> openAllView(PeojectNodes node) {
|
||||
List<CadData> cadData = modelMapper.openAllView(node.getIds());
|
||||
try {
|
||||
CRSFactory crsFactory = new CRSFactory();
|
||||
CoordinateTransformFactory ctFactory = new CoordinateTransformFactory();
|
||||
|
||||
// 定义坐标系(CGCS2000 GK Zone 20 → WGS84)
|
||||
CoordinateReferenceSystem gkZone20 = crsFactory.createFromParameters("EPSG:4498",
|
||||
"+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
|
||||
|
||||
CoordinateReferenceSystem cgcs2000Zone20 = crsFactory.createFromName("EPSG:4498");
|
||||
CoordinateReferenceSystem wgs84 = crsFactory.createFromName("EPSG:4326");
|
||||
|
||||
CoordinateTransform transform = ctFactory.createTransform(gkZone20, wgs84);
|
||||
CoordinateTransform transform = ctFactory.createTransform(cgcs2000Zone20, wgs84);
|
||||
|
||||
for (CadData cadDatum : cadData) {
|
||||
String geometry = cadDatum.getGeometry();
|
||||
|
|
@ -246,11 +449,11 @@ public class ModelServiceImpl implements ModelService {
|
|||
JSONArray startArray = jsonObject.getJSONArray("start");
|
||||
JSONArray endArray = jsonObject.getJSONArray("end");
|
||||
// 获取第一个元素(X坐标)
|
||||
double x = startArray.getDouble(0);
|
||||
double x = startArray.getDouble(0) + 20000000;
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y = startArray.getDouble(1);
|
||||
// 获取第一个元素(X坐标)
|
||||
double x1 = endArray.getDouble(0);
|
||||
double x1 = endArray.getDouble(0) + 20000000;
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y1 = endArray.getDouble(1);
|
||||
|
||||
|
|
@ -271,28 +474,84 @@ public class ModelServiceImpl implements ModelService {
|
|||
cadDatum.setGeometry(jsonObject.toString());
|
||||
}
|
||||
if (jsonObject.get("type").equals("LWPOLYLINE")) {
|
||||
JSONArray pointsArray = jsonObject.getJSONArray("points");
|
||||
JSONArray pointsArray = jsonObject.getJSONArray("segments");
|
||||
|
||||
// === 1. 处理 BD09 坐标:修改原始 pointsArray,并生成 BD09 的 geometry ===
|
||||
for (int i = 0; i < pointsArray.size(); i++) {
|
||||
JSONArray point = pointsArray.getJSONArray(i);
|
||||
double x = point.getDouble(0);
|
||||
double y = point.getDouble(1);
|
||||
JSONObject point = pointsArray.getJSONObject(i);
|
||||
if (point.get("type").equals("line")) {
|
||||
if (point.containsKey("start")) {
|
||||
JSONArray startArray = point.getJSONArray("start");
|
||||
double x = startArray.getDoubleValue(0) + 20000000;
|
||||
double y = startArray.getDoubleValue(1);
|
||||
|
||||
// 原始坐标
|
||||
ProjCoordinate pointstGk = new ProjCoordinate(x, y);
|
||||
// 假设 transform 和 wgs84ToBd09WithPrecision 已定义
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
|
||||
// 转换
|
||||
ProjCoordinate pointstGkWgs84 = new ProjCoordinate();
|
||||
transform.transform(pointstGk, pointstGkWgs84);
|
||||
// 更新 start 数组
|
||||
startArray.set(0, wgs84Coord.x);
|
||||
startArray.set(1, wgs84Coord.y);
|
||||
}
|
||||
if (point.containsKey("end")) {
|
||||
JSONArray endArray = point.getJSONArray("end");
|
||||
double x = endArray.getDoubleValue(0) + 20000000;
|
||||
double y = endArray.getDoubleValue(1);
|
||||
|
||||
point.set(0, pointstGkWgs84.x);
|
||||
point.set(1, pointstGkWgs84.y);
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
|
||||
// 更新 end 数组
|
||||
endArray.set(0, wgs84Coord.x);
|
||||
endArray.set(1, wgs84Coord.y);
|
||||
}
|
||||
} else if (point.get("type").equals("arc")) {
|
||||
if (point.containsKey("center")) {
|
||||
JSONArray arcArray = point.getJSONArray("center");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, wgs84Coord.x);
|
||||
arcArray.set(1, wgs84Coord.y);
|
||||
}
|
||||
if (point.containsKey("end_point")) {
|
||||
JSONArray arcArray = point.getJSONArray("end_point");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, wgs84Coord.x);
|
||||
arcArray.set(1, wgs84Coord.y);
|
||||
}
|
||||
if (point.containsKey("start_point")) {
|
||||
JSONArray arcArray = point.getJSONArray("start_point");
|
||||
double x = arcArray.getDoubleValue(0) + 20000000;
|
||||
double y = arcArray.getDoubleValue(1);
|
||||
|
||||
ProjCoordinate wgs84Coord = new ProjCoordinate();
|
||||
transform.transform(new ProjCoordinate(x, y), wgs84Coord);
|
||||
|
||||
// 更新 end 数组
|
||||
arcArray.set(0, wgs84Coord.x);
|
||||
arcArray.set(1, wgs84Coord.y);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
cadDatum.setGeometry(jsonObject.toString());
|
||||
}
|
||||
|
||||
if (jsonObject.get("type").equals("CIRCLE")) {
|
||||
JSONArray centerArray = jsonObject.getJSONArray("center");
|
||||
// 获取第一个元素(X坐标)
|
||||
double x = centerArray.getDouble(0);
|
||||
double x = centerArray.getDouble(0) + 20000000;
|
||||
// 获取第二个元素(Y坐标)
|
||||
double y = centerArray.getDouble(1);
|
||||
// 原始坐标
|
||||
|
|
|
|||
Loading…
Reference in New Issue