Результат полигона Emty из точечной геометрии при использовании JTS BufferOP с параметром capstyle flat - PullRequest
0 голосов
/ 06 января 2019

Я использую geotools и jts-класс BufferOP, чтобы создать буфер вокруг моей геометрии. Во время тестирования я получил странный результат с точечной геометрией. Если я установлю capstyle на flat, мой результат всегда будет пустым многоугольником.

Линии и Полигоны работают. Кажется, только у этой проблемы есть проблемы.

Если я изменю его на параметр округления или квадрата, я получу ожидаемый результат.

Я использую снимок geotools 21 с Maven и Jave 8. вот файл maven pom, который я использовал, и пример кода

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <maven.compiler.source>1.7</maven.compiler.source>
 <maven.compiler.target>1.7</maven.compiler.target>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <geotools.version>21-SNAPSHOT</geotools.version>
</properties>

<dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.11</version>
  <scope>test</scope>
 </dependency>
 <dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-geometry</artifactId>
  <version>${geotools.version}</version>
 </dependency>
 <dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-epsg-hsql</artifactId>
  <version>${geotools.version}</version>
 </dependency>
 <dependency>
  <groupId>org.geotools</groupId>
  <artifactId>gt-epsg-wkt </artifactId>
  <version>${geotools.version}</version>
 </dependency>

import org.geotools.geometry.jts.JTSFactoryFinder;
import org.geotools.referencing.CRS;
import org.geotools.util.factory.Hints;
import org.locationtech.jts.geom.*;
import org.locationtech.jts.io.ParseException;
import org.locationtech.jts.io.WKTReader;
import org.locationtech.jts.operation.buffer.BufferOp;
import org.locationtech.jts.operation.buffer.BufferParameters;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
import java.io.IOException;

public class App 
{
 public static void main( String[] args ) throws ParseException, IOException, FactoryException, TransformException {


    Integer epsg= 32632;
    String wkt = "POINT (5293201.002716452 1208988.4067087262)";
    //setup geometry point in utm coordinates (meter)

    // create geometry
    CoordinateReferenceSystem crs = CRS.decode(("EPSG:"+ epsg.toString()));
    Hints hints = new Hints(Hints.CRS, crs);
    GeometryFactory geometryFactoryWKT = JTSFactoryFinder.getGeometryFactory(hints);
    WKTReader wktReader = new WKTReader(geometryFactoryWKT);
    Geometry geom =  wktReader.read(wkt);
    geom.setSRID(epsg);


    // creates BufferParameters
    BufferParameters bufferParam = new BufferParameters();

    bufferParam.setEndCapStyle(BufferParameters.CAP_FLAT);
    // if using any other parameter result is as expected
    // bufferParam.setEndCapStyle(BufferParameters.CAP_ROUND);
    bufferParam.setJoinStyle(BufferParameters.JOIN_BEVEL );
    bufferParam.setMitreLimit(5);
    bufferParam.setSimplifyFactor(0.01);
    bufferParam.setQuadrantSegments(8);


    // creates buffer geom on point with 10m distance and use set bufferParameters
    Geometry bufferGeom =  BufferOp.bufferOp(geom ,10, bufferParam);

    System.out.println(bufferGeom);
}

Кто-нибудь знает почему?

1 Ответ

0 голосов
/ 07 января 2019

Посмотрев на код, кажется, сводится к тому, как OffsetCurveBuilder обрабатывает заглушки. Кажется, что (вполне разумно, на мой взгляд) не рассчитывать что-либо для плоских концевых колпачков, и поскольку точка ничего не генерирует, кроме концов, вы ничего не получаете за плоскую концевую заглушку.

  private void computePointCurve(Coordinate pt, OffsetSegmentGenerator segGen) {
    switch (bufParams.getEndCapStyle()) {
      case BufferParameters.CAP_ROUND:
        segGen.createCircle(pt);
        break;
      case BufferParameters.CAP_SQUARE:
        segGen.createSquare(pt);
        break;
      // otherwise curve is empty (e.g. for a butt cap);
    }
  }
...