package com.yssh.service.impl;
|
|
import java.io.IOException;
|
import java.io.StringWriter;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import org.geotools.geojson.geom.GeometryJSON;
|
import org.locationtech.jts.geom.Coordinate;
|
import org.locationtech.jts.geom.Geometry;
|
import org.locationtech.jts.geom.GeometryFactory;
|
import org.locationtech.jts.geom.MultiPoint;
|
import org.locationtech.jts.triangulate.ConformingDelaunayTriangulationBuilder;
|
import org.locationtech.jts.triangulate.DelaunayTriangulationBuilder;
|
import org.locationtech.jts.triangulate.VoronoiDiagramBuilder;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import com.yssh.dao.ExpPointMapper;
|
import com.yssh.dao.StratumMapper;
|
import com.yssh.entity.ExpPoint;
|
import com.yssh.entity.Stratum;
|
import com.yssh.service.IExpPointServer;
|
import com.yssh.utils.GisUtil;
|
|
@Service
|
public class ExpPointServerImpl implements IExpPointServer {
|
|
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
|
|
@Autowired
|
private ExpPointMapper expPointMapper;
|
|
@Autowired
|
private StratumMapper stratumMapper;
|
|
@Override
|
public GeometryJSON selectList() throws IOException {
|
String sourceCRS = "EPSG:4530";
|
String targetCRS = "EPSG:4490";
|
List<ExpPoint> list = expPointMapper.selectList();
|
System.err.println(list.size());
|
/*AtomicInteger i = new AtomicInteger(0);
|
Coordinate[] coordinates = new Coordinate[list.size()];*/
|
List<Coordinate> coordinates = new ArrayList<>();
|
list.forEach(e -> {
|
Coordinate transform = GisUtil.coordinateTransform(sourceCRS, targetCRS, e.getOrdinateX(), e.getAbscissaY());
|
transform.setZ(e.getElevation());
|
coordinates.add(transform);
|
});
|
|
//创建Delaunay三角网:
|
DelaunayTriangulationBuilder builder = new DelaunayTriangulationBuilder();
|
builder.setSites(coordinates);
|
Geometry geo = builder.getEdges(new GeometryFactory());
|
|
GeometryJSON geometryJson = new GeometryJSON(6);
|
StringWriter writer = new StringWriter();
|
geometryJson.write(geo, writer);
|
System.err.println(writer.toString());
|
writer.close();
|
|
int numPoints = geo.getNumPoints();
|
return geometryJson;
|
}
|
|
|
public List<ExpPoint> selectList2() {
|
String sourceCRS = "EPSG:4530";
|
String targetCRS = "EPSG:4490";
|
List<ExpPoint> list = expPointMapper.selectList();
|
System.err.println(list.size());
|
AtomicInteger i = new AtomicInteger(0);
|
Coordinate[] coordinates = new Coordinate[list.size()];
|
list.forEach(e -> {
|
Coordinate transform = GisUtil.coordinateTransform(sourceCRS, targetCRS, e.getOrdinateX(), e.getAbscissaY());
|
transform.setZ(e.getElevation());
|
coordinates[i.intValue()] = transform;
|
});
|
|
//创建Delaunay三角网:
|
/*GeometryFactory geoFactory = new GeometryFactory();
|
ConformingDelaunayTriangulationBuilder builder = new ConformingDelaunayTriangulationBuilder();
|
builder.setSites(geoFactory.createMultiPointFromCoords(coordinates));*/
|
GeometryFactory geoFactory = new GeometryFactory();
|
VoronoiDiagramBuilder voronoiBuilder = new VoronoiDiagramBuilder();
|
voronoiBuilder.setSites(geoFactory.createMultiPointFromCoords(coordinates));
|
Geometry geo =voronoiBuilder.getDiagram(geoFactory);
|
|
int numPoints = geo.getNumPoints();
|
|
/*List<Coordinate> cs = new ArrayList<>(Arrays.asList(geo.getCoordinates()));
|
cs.forEach(c -> {
|
System.out.println(c.getY() + " " + c.getX() + " " + c.getZ());
|
});*/
|
System.out.println(numPoints);
|
|
/*String text = union.toText();
|
System.out.println(text);*/
|
|
/*List<String> expSiteNumbers = new ArrayList<>();
|
list.forEach(e -> {expSiteNumbers.add(e.getExpSiteNumber());});
|
//第一层
|
List<Stratum> one = stratumMapper.selectByExpSiteNumbers(expSiteNumbers);
|
//1、获取一次层结构分类
|
List<Stratum> geotechnicalNames = filterGeotechnicalName(one);
|
//2、遍历结构分类
|
geotechnicalNames.forEach(s -> {
|
System.err.println(s.toString());
|
Map<String, Object> param = new HashMap<>();
|
param.put("expSiteNumber", s.getExpSiteNumber());
|
param.put("geotechnicalName", s.getGeotechnicalName());
|
param.put("start", 1);
|
param.put("rows", 1);
|
Stratum stratum = stratumMapper.selectByGeotechnicalName(param);
|
System.err.println(stratum);
|
|
});
|
List<String> ess = new ArrayList<>();
|
one.forEach(s -> {
|
String geotechnicalName = "粉质黏土";
|
if (s.getGeotechnicalName().equals(geotechnicalName)) {
|
Map<String, Object> param = new HashMap<>();
|
param.put("expSiteNumber", s.getExpSiteNumber());
|
param.put("geotechnicalName", s.getGeotechnicalName());
|
param.put("start", 1);
|
param.put("rows", 1);
|
Stratum stratum = stratumMapper.selectByGeotechnicalName(param);
|
if (StringUtils.isNotNull(stratum)) {
|
s.setLayerDepth(stratum.getLayerDepth());
|
}
|
ess.add(s.getExpSiteNumber());
|
}
|
});
|
List<ExpPoint> numbers = expPointMapper.selectByExpSiteNumbers(ess);
|
numbers.forEach(e -> {
|
Coordinate transform = GisUtil.coordinateTransform(sourceCRS, targetCRS, e.getOrdinateX(), e.getAbscissaY());
|
one.forEach(s -> {
|
if (s.getExpSiteNumber().equals(e.getExpSiteNumber())) {
|
e.setElevation(e.getElevation() - s.getLayerDepth());
|
}
|
});
|
System.err.println("------");
|
System.out.println(transform.getY() + " " + transform.getX() + " " + e.getElevation());
|
});*/
|
/*Boolean flag = true;
|
while (flag) {
|
}*/
|
|
//第二层
|
/*List<Stratum> two = stratumMapper.select(e.getExpSiteNumber(), 1, 1);
|
two.forEach(s -> {
|
System.out.println(s.toString());
|
});
|
//第三层
|
List<Stratum> three = stratumMapper.select(e.getExpSiteNumber(), 2, 1);
|
three.forEach(s -> {
|
System.err.println(s.toString());
|
});
|
System.out.println();*/
|
|
//3、获取第二层该结构的信息
|
//4、遍历第三层是满足条件的点位
|
return list;
|
}
|
|
private List<Stratum> filterGeotechnicalName(List<Stratum> list){
|
List<Stratum> result = new ArrayList<Stratum>();
|
List<String> temp = new ArrayList<String>();
|
list.forEach(e -> {
|
String geotechnicalName = e.getGeotechnicalName();
|
if (!temp.contains(geotechnicalName)) {
|
result.add(e);
|
temp.add(geotechnicalName);
|
}
|
});
|
return result;
|
}
|
}
|