У меня есть коллекция объектов геометрии. Теперь я хочу вычислить минимальный ограничивающий прямоугольник из всей коллекции. Я использую пакет топологии Java, но не могу понять, как это сделать?
Минимальный ограничивающий прямоугольник с JTS
Ответы (3)
Посмотрите http://tsusiatsoftware.net/jts/javadoc/index.html.
Если я предполагаю, что вы используете экземпляр GeometryCollection. Если это правда, вы можете напрямую позвонить
geometry.getEnvelope();
or
geometry.getEnvelopeInternal();
Если вам нужен экземпляр Envelope
Он вернет вам минимальный прямоугольник GeometryCollection.
Если у вас есть коллекция геометрий, вы можете напрямую использовать оболочку и расширять ее каждый раз, когда обрабатываете новую геометрию вашей коллекции.
Envelope env = new Envelope();
for(Geometry g : mySet){
env.expandToInclude(g.getEnvelopeInternal()):
}
or
Envelope env = new Envelope();
for(Geometry g : mySet){
env.expandToInclude(g.getBoundary().getEnvelopeInternal()):
}
getEnvelopeInternal()
будет игнорировать точную модель вашей геометрии.
- person Campa; 27.06.2019
Я просто собрал вот так.
Класс Geometry имеет метод getEnvelopeInternal(), который возвращает вписанный конверт, но метод getEnvelope() просто возвращает другую геометрию.
Глядя на javadoc, кажется, что возвращаемый объект Geometry:
- Пустая точка, соответствующая пустому объекту Geometry.
- Одна точка, совпадающая с переданной точкой.
- Многоугольник с 4 координатами, который определяет охватывающую оболочку.
Глядя на другие заметки об оболочке, я вижу, что вы можете «расширить» оболочку... так что вот статическая утилита, которую я создал для преобразования:
public static Envelope enclosingEnvelopFromGeometry(Geometry geometry) {
final Envelope envelope = new Envelope();
final Geometry enclosingGeometry = geometry.getEnvelope();
final Coordinate[] enclosingCoordinates = enclosingGeometry.getCoordinates();
for (Coordinate c : enclosingCoordinates) {
envelope.expandToInclude(c);
}
return envelope;
}
Я никогда не использовал jts, но погуглил это:
Итерация по коллекции и для каждого вызова объекта getBoundary().getEnvelopeInternal()
getEnvelopeInternal()
будет игнорировать точную модель вашей геометрии.
- person Campa; 27.06.2019