Как получить пересекающиеся линии по конечной или начальной точке с помощью фильтра Geotools

У меня есть LineString featureSource. Для одной функции из источника я хочу взять пересекающиеся линии по startPoint или endPoint из того же featureSource.

Я пробовал это только для endPoint:

Filter filter = ff.intersects(ff.literal(featureLastCoordinate), ff.function("endPoint", ff.literal(featureGeom)));
FeatureCollection<SimpleFeatureType, SimpleFeature> intersectedFeatColl = inputSource.getFeatures(filter);

И это:

Filter filter = ff.and(ff.intersects(ff.property(featureGeomPropName), ff.literal(featureLastCoordinate)), ff.function("endPoint", ff.literal(featureGeom)));

Не могу найти правильные выражения для фильтра. Например:

exampleImg

Я хочу получить другие линии для желтой линии.


person cgrgcn    schedule 23.10.2014    source источник


Ответы (1)


В зависимости от того, насколько вы уверены, что линии соприкасаются, вы можете сделать что-то вроде этого:

LineString lineString = (LineString) first.getDefaultGeometry();
Point[] points = { lineString.getStartPoint(), lineString.getEndPoint() };
for (Point p : points) {
  Filter f = CQL.toFilter("intersects( " + geom + ", " + p + ")");
  SimpleFeatureCollection res = featureSource.getFeatures(f);
  if (!res.isEmpty()) {
    System.out.println("Point " + p + " touches ");
    try (SimpleFeatureIterator itr = res.features()) {
      while (itr.hasNext()) {
        System.out.println(itr.next());
      }
    }
  }

  Polygon poly = (Polygon) p.buffer(10);
  f = CQL.toFilter("intersects( " + geom + ", " + poly + ")");
  res = featureSource.getFeatures(f);
  if (!res.isEmpty()) {
    System.out.println("Point " + p + " is close to ");
    try (SimpleFeatureIterator itr = res.features()) {
      while (itr.hasNext()) {
        System.out.println(itr.next());
      }
    }
  }
}
person Ian Turton    schedule 15.03.2021