Java 如何分割JTS多边形

Java 如何分割JTS多边形,java,geotools,jts,Java,Geotools,Jts,我有一个大多边形,我想找到和多边形相交的特征,但由于多边形太大,我得到了超时异常 我试图研究JTS方法,但不知道如何使用它 final List<Coordinate> coordinates = List.of(new Coordinate(0, 0), new Coordinate(-1, 1), new Coordinate(1, 3), new Coordinate(2, 3), new Coordinate(3, 1), new Coordinate(0,

我有一个大多边形,我想找到和多边形相交的特征,但由于多边形太大,我得到了超时异常

我试图研究JTS方法,但不知道如何使用它

final List<Coordinate> coordinates = List.of(new Coordinate(0, 0), new Coordinate(-1, 1),
        new Coordinate(1, 3), new Coordinate(2, 3), new Coordinate(3, 1), new Coordinate(0, 0));
final GeometryFactory factory = new GeometryFactory();
final Polygon polygon = factory.createPolygon(coordinates.toArray(new Coordinate[0]));
final Geometry envelope = polygon.getEnvelope();
final List coordinates=List.of(新坐标(0,0),新坐标(-1,1),
新坐标(1,3)、新坐标(2,3)、新坐标(3,1)、新坐标(0,0));
最终GeometryFactory=新GeometryFactory();
最终多边形=factory.createPolygon(坐标.toArray(新坐标[0]);
最终几何体封套=polygon.getEnvelope();
有人能告诉我如何分割多边形对象吗?

分割多边形的方法有很多(无穷多个),但我会这样做,通过计算封套的中线并将新封套与多边形相交

public List<Geometry> split(Polygon p) {
    List<Geometry> ret = new ArrayList<>();
    final Envelope envelope = p.getEnvelopeInternal();
    double minX = envelope.getMinX();
    double maxX = envelope.getMaxX();
    double midX = minX + (maxX - minX) / 2.0;
    double minY = envelope.getMinY();
    double maxY = envelope.getMaxY();
    double midY = minY + (maxY - minY) / 2.0;

    Envelope llEnv = new Envelope(minX, midX, minY, midY);
    Envelope lrEnv = new Envelope(midX, maxX, minY, midY);
    Envelope ulEnv = new Envelope(minX, midX, midY, maxY);
    Envelope urEnv = new Envelope(midX, maxX, midY, maxY);
    Geometry ll = JTS.toGeometry(llEnv).intersection(p);
    Geometry lr = JTS.toGeometry(lrEnv).intersection(p);
    Geometry ul = JTS.toGeometry(ulEnv).intersection(p);
    Geometry ur = JTS.toGeometry(urEnv).intersection(p);
    ret.add(ll);
    ret.add(lr);
    ret.add(ul);
    ret.add(ur);

    return ret;
  }
公共列表拆分(多边形p){
List ret=new ArrayList();
最终信封=p.getEnvelopeInternal();
double minX=envelope.getMinX();
double maxX=envelope.getMaxX();
double midX=minX+(maxX-minX)/2.0;
double minY=envelope.getMinY();
double maxY=envelope.getMaxY();
双米=米尼+(最大-米尼)/2.0;
信封llEnv=新信封(minX、midX、minY、midY);
信封lrEnv=新信封(midX、maxX、minY、midY);
信封ulEnv=新信封(minX、midX、midY、maxY);
信封urEnv=新信封(midX、maxX、midY、maxY);
几何ll=JTS几何(llEnv)交点(p);
几何lr=JTS几何(lrEnv)交点(p);
几何ul=JTS几何(ulEnv)交点(p);
几何ur=JTS几何(urEnv)交点(p);
ret.add(ll);
重新添加(lr);
再添加(ul);
ret.add(ur);
返回ret;
}
这将为多边形提供以下内容:

如果您再次调用该输出:

在生产设置中,您需要进行一些错误检查,以确保能够处理生成的点。

分割多边形的方法有很多(无限多个),但我会这样做,通过计算封套的中线并将新封套与多边形相交

public List<Geometry> split(Polygon p) {
    List<Geometry> ret = new ArrayList<>();
    final Envelope envelope = p.getEnvelopeInternal();
    double minX = envelope.getMinX();
    double maxX = envelope.getMaxX();
    double midX = minX + (maxX - minX) / 2.0;
    double minY = envelope.getMinY();
    double maxY = envelope.getMaxY();
    double midY = minY + (maxY - minY) / 2.0;

    Envelope llEnv = new Envelope(minX, midX, minY, midY);
    Envelope lrEnv = new Envelope(midX, maxX, minY, midY);
    Envelope ulEnv = new Envelope(minX, midX, midY, maxY);
    Envelope urEnv = new Envelope(midX, maxX, midY, maxY);
    Geometry ll = JTS.toGeometry(llEnv).intersection(p);
    Geometry lr = JTS.toGeometry(lrEnv).intersection(p);
    Geometry ul = JTS.toGeometry(ulEnv).intersection(p);
    Geometry ur = JTS.toGeometry(urEnv).intersection(p);
    ret.add(ll);
    ret.add(lr);
    ret.add(ul);
    ret.add(ur);

    return ret;
  }
公共列表拆分(多边形p){
List ret=new ArrayList();
最终信封=p.getEnvelopeInternal();
double minX=envelope.getMinX();
double maxX=envelope.getMaxX();
double midX=minX+(maxX-minX)/2.0;
double minY=envelope.getMinY();
double maxY=envelope.getMaxY();
双米=米尼+(最大-米尼)/2.0;
信封llEnv=新信封(minX、midX、minY、midY);
信封lrEnv=新信封(midX、maxX、minY、midY);
信封ulEnv=新信封(minX、midX、midY、maxY);
信封urEnv=新信封(midX、maxX、midY、maxY);
几何ll=JTS几何(llEnv)交点(p);
几何lr=JTS几何(lrEnv)交点(p);
几何ul=JTS几何(ulEnv)交点(p);
几何ur=JTS几何(urEnv)交点(p);
ret.add(ll);
重新添加(lr);
再添加(ul);
ret.add(ur);
返回ret;
}
这将为多边形提供以下内容:

如果您再次调用该输出:

在生产设置中,您需要进行一些错误检查,以确保能够处理生成的点