将多条MultiLineString拆分为一条MultiLineString
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.geotools.geojson.geom.GeometryJSON;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.io.ByteOrderValues;
import org.locationtech.jts.io.WKBReader;
import org.locationtech.jts.io.WKBWriter;
import org.locationtech.jts.operation.distance.DistanceOp;
import javax.annotation.PostConstruct;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
public static Geometry mergeLine(List<Geometry> geom) {
int index = geom.get(0).getNumGeometries();
for (int i = 0; i < geom.size() - 1; i++) {
if (geom.get(i).getNumGeometries() < geom.get(i + 1).getNumGeometries()) {
index = geom.get(i + 1
).getNumGeometries();
List<LineString> lineList = new ArrayList<>();
for (int i = 0; i < index; i++) {
List<LineString> line = new ArrayList<>();
int size = 0;
for (Geometry geometry : geom) {
LineString ls = null;
if (i < geometry.getNumGeometries()) {
Geometry mlsGeom = geometry.getGeometryN(i);
ls = (LineString) mlsGeom;
if (ls != null) {
line.add(ls);
} else {
size++;
if (size == geom.size()) {
throw new BusinessException("河段不存在");
lineList.add(mergeLineStrings(line));
if (!CollectionUtils.isEmpty(lineList)) {
return getMultiLineString(lineList);
return null;
public static LineString mergeLineStrings(List<LineString> line) {
if (line.size() == 1) {
return line.get(0);
List<LineString> lineList = new ArrayList<>();
int numPoints = line.get(0).getNumPoints();
int size = 0;
lineList.add(line.get(0));
while (lineList.size() < line.size()) {
for (LineString lineString : line) {
if (!lineString.equals(lineList.get(0))
&& !lineString.equals(lineList.get(lineList.size() - 1))) {
if (lineString.getStartPoint().equals(lineList.get(lineList.size() - 1).getEndPoint())) {
numPoints = numPoints + lineString.getNumPoints() - 1;
lineList.add(lineString);
} else if (lineString.getEndPoint().equals(lineList.get(0).getStartPoint())) {
numPoints = numPoints + lineString.getNumPoints() - 1;
lineList.add(0, lineString);
size++;
if (size >= 100) {
throw new BusinessException("合并失败");
CoordinateSequenceFactory csFactory =
lineList.get(0).getFactory().getCoordinateSequenceFactory();
CoordinateSequence mergedSeq = csFactory.create(numPoints, 2);
System.arraycopy(
lineList.get(0).getCoordinateSequence().toCoordinateArray(),
mergedSeq.toCoordinateArray(),
lineList.get(0).getNumPoints());
int points = lineList.get(0).getNumPoints();
for (int i = 1; i < lineList.size(); i++) {
System.arraycopy(
lineList.get(i).getCoordinateSequence().toCoordinateArray(),
mergedSeq.toCoordinateArray(),
points,
lineList.get(i).getNumPoints() - 1);
points = points + lineList.get(i).getNumPoints() - 1;
return geometryFactory.createLineString(mergedSeq);
public static MultiLineString getMultiLineString(List<LineString> lineStrings) {
try {
return geometryFactory.createMultiLineString(lineStrings.toArray(new LineString[0]));
} catch (Exception e) {
e.printStackTrace();
return null;