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 list = expPointMapper.selectList(); System.err.println(list.size()); /*AtomicInteger i = new AtomicInteger(0); Coordinate[] coordinates = new Coordinate[list.size()];*/ List 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 selectList2() { String sourceCRS = "EPSG:4530"; String targetCRS = "EPSG:4490"; List 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 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 expSiteNumbers = new ArrayList<>(); list.forEach(e -> {expSiteNumbers.add(e.getExpSiteNumber());}); //第一层 List one = stratumMapper.selectByExpSiteNumbers(expSiteNumbers); //1、获取一次层结构分类 List geotechnicalNames = filterGeotechnicalName(one); //2、遍历结构分类 geotechnicalNames.forEach(s -> { System.err.println(s.toString()); Map 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 ess = new ArrayList<>(); one.forEach(s -> { String geotechnicalName = "粉质黏土"; if (s.getGeotechnicalName().equals(geotechnicalName)) { Map 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 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 two = stratumMapper.select(e.getExpSiteNumber(), 1, 1); two.forEach(s -> { System.out.println(s.toString()); }); //第三层 List three = stratumMapper.select(e.getExpSiteNumber(), 2, 1); three.forEach(s -> { System.err.println(s.toString()); }); System.out.println();*/ //3、获取第二层该结构的信息 //4、遍历第三层是满足条件的点位 return list; } private List filterGeotechnicalName(List list){ List result = new ArrayList(); List temp = new ArrayList(); list.forEach(e -> { String geotechnicalName = e.getGeotechnicalName(); if (!temp.contains(geotechnicalName)) { result.add(e); temp.add(geotechnicalName); } }); return result; } }