Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ xxxx-xx-xx
- Improve ConvexHull radial sort robustness (GH-724, Martin Davis)
- Use more robust Delaunay Triangulation frame size heuristic (GH-728, Martin Davis)
- DiscreteFrechetDistance: Fix crash with empty inputs (GH-751, Dan Baston)
- PreparedLineStringIntersects: Fix incorrect result with mixed-dim collection (GH-774, Dan Baston)


## Changes in 3.11.0
Expand Down
5 changes: 5 additions & 0 deletions include/geos/geom/Geometry.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,11 @@ class GEOS_DLL Geometry {
/// Returns the dimension of this Geometry (0=point, 1=line, 2=surface)
virtual Dimension::DimensionType getDimension() const = 0; //Abstract

/// Checks whether any component of this geometry has dimension d
virtual bool hasDimension(Dimension::DimensionType d) const {
return getDimension() == d;
}

/// Checks whether this Geometry consists only of components having dimension d.
virtual bool isDimensionStrict(Dimension::DimensionType d) const {
return d == getDimension();
Expand Down
2 changes: 2 additions & 0 deletions include/geos/geom/GeometryCollection.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,8 @@ class GEOS_DLL GeometryCollection : public Geometry {
*/
Dimension::DimensionType getDimension() const override;

bool hasDimension(Dimension::DimensionType d) const override;

bool isDimensionStrict(Dimension::DimensionType d) const override;

/// Returns coordinate dimension.
Expand Down
4 changes: 4 additions & 0 deletions include/geos/geom/MultiLineString.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,10 @@ class GEOS_DLL MultiLineString: public GeometryCollection {
/// Returns line dimension (1)
Dimension::DimensionType getDimension() const override;

bool hasDimension(Dimension::DimensionType d) const override {
return d == Dimension::L;
}

bool isDimensionStrict(Dimension::DimensionType d) const override {
return d == Dimension::L;
}
Expand Down
4 changes: 4 additions & 0 deletions include/geos/geom/MultiPoint.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@ class GEOS_DLL MultiPoint: public GeometryCollection {
return d == Dimension::P;
}

bool hasDimension(Dimension::DimensionType d) const override {
return d == Dimension::P;
}

/// Returns Dimension::False (Point has no boundary)
int getBoundaryDimension() const override;

Expand Down
4 changes: 4 additions & 0 deletions include/geos/geom/MultiPolygon.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,10 @@ class GEOS_DLL MultiPolygon: public GeometryCollection {
/// Returns surface dimension (2)
Dimension::DimensionType getDimension() const override;

bool hasDimension(Dimension::DimensionType d) const override {
return d == Dimension::A;
}

bool isDimensionStrict(Dimension::DimensionType d) const override {
return d == Dimension::A;
}
Expand Down
9 changes: 9 additions & 0 deletions src/geom/GeometryCollection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ GeometryCollection::isDimensionStrict(Dimension::DimensionType d) const {
});
}

bool
GeometryCollection::hasDimension(Dimension::DimensionType d) const {
return std::any_of(geometries.begin(),
geometries.end(),
[&d](const std::unique_ptr<Geometry>& g) {
return g->hasDimension(d);
});
}

int
GeometryCollection::getBoundaryDimension() const
{
Expand Down
7 changes: 1 addition & 6 deletions src/geom/prep/PreparedLineStringIntersects.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,19 +69,14 @@ PreparedLineStringIntersects::intersects(const geom::Geometry* g) const
return true;
}

// For L/L case we are done
if(g->getDimension() == 1) {
return false;
}

// For L/A case, need to check for proper inclusion of the target in the test
if(g->getDimension() == 2
&& prepLine.isAnyTargetComponentInTest(g)) {
return true;
}

// For L/P case, need to check if any points lie on line(s)
if(g->getDimension() == 0) {
if(g->hasDimension(Dimension::P)) {
return isAnyTestPointInTarget(g);
}

Expand Down
27 changes: 27 additions & 0 deletions tests/unit/geom/GeometryCollectionTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,4 +154,31 @@ void object::test<7>()
ensure_equals(components.size(), 2u);
}

// Test of hasDimension()
template<>
template<>
void object::test<8>
()
{
auto gc = readWKT("GEOMETRYCOLLECTION(POINT (1 1), LINESTRING (1 1, 2 2))");

ensure(gc->hasDimension(geos::geom::Dimension::P));
ensure(gc->hasDimension(geos::geom::Dimension::L));
ensure(!gc->hasDimension(geos::geom::Dimension::A));
}


// Test of hasDimension() for nested collection
template<>
template<>
void object::test<9>
()
{
auto gc = readWKT("GEOMETRYCOLLECTION(POINT (1 1), GEOMETRYCOLLECTION(LINESTRING (1 1, 2 2), POLYGON((0 0, 0 1, 1 1, 0 0))))");

ensure(gc->hasDimension(geos::geom::Dimension::P));
ensure(gc->hasDimension(geos::geom::Dimension::L));
ensure(gc->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut
16 changes: 16 additions & 0 deletions tests/unit/geom/LineStringTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ struct test_linestring_data {
geos::io::WKTReader reader_;

std::unique_ptr<geos::geom::LineString> empty_line_;
std::unique_ptr<geos::geom::LineString> line_;

test_linestring_data()
: pm_(1000)
Expand All @@ -45,6 +46,11 @@ struct test_linestring_data {
, empty_line_(factory_->createLineString())
{
assert(nullptr != empty_line_);

auto cs = geos::detail::make_unique<geos::geom::CoordinateSequence>(2u, false, false);
cs->setAt(geos::geom::Coordinate{0, 0}, 0);
cs->setAt(geos::geom::Coordinate{1, 1}, 1);
line_ = factory_->createLineString(std::move(cs));
}

~test_linestring_data()
Expand Down Expand Up @@ -571,6 +577,16 @@ void object::test<31>

}

// Test of hasDimension()
template<>
template<>
void object::test<32>
()
{
ensure(!line_->hasDimension(geos::geom::Dimension::P));
ensure(line_->hasDimension(geos::geom::Dimension::L));
ensure(!line_->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut

13 changes: 13 additions & 0 deletions tests/unit/geom/MultiLineStringTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,18 @@ void object::test<3>
ensure(!mls_->isDimensionStrict(geos::geom::Dimension::A));
}


// Test of hasDimension()
template<>
template<>
void object::test<4>
()
{
ensure(!mls_->hasDimension(geos::geom::Dimension::P));
ensure(mls_->hasDimension(geos::geom::Dimension::L));
ensure(!mls_->hasDimension(geos::geom::Dimension::A));
}


} // namespace tut

11 changes: 11 additions & 0 deletions tests/unit/geom/MultiPointTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -417,5 +417,16 @@ void object::test<31>
ensure(!empty_mp_->isDimensionStrict(geos::geom::Dimension::L));
}

// Test of hasDimension()
template<>
template<>
void object::test<32>
()
{
ensure(mp_->hasDimension(geos::geom::Dimension::P));
ensure(!mp_->hasDimension(geos::geom::Dimension::L));
ensure(!mp_->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut

11 changes: 11 additions & 0 deletions tests/unit/geom/MultiPolygonTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,15 @@ void object::test<3>
ensure(!empty_mp_->isDimensionStrict(geos::geom::Dimension::L));
}

// Test of hasDimension()
template<>
template<>
void object::test<4>
()
{
ensure(!mp_->hasDimension(geos::geom::Dimension::P));
ensure(!mp_->hasDimension(geos::geom::Dimension::L));
ensure(mp_->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut
14 changes: 13 additions & 1 deletion tests/unit/geom/PointTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <memory>
#include <string>

constexpr int MAX_TESTS = 100;

namespace tut {
//
Expand Down Expand Up @@ -59,7 +60,7 @@ struct test_point_data {
}
};

typedef test_group<test_point_data> group;
typedef test_group<test_point_data, MAX_TESTS> group;
typedef group::object object;

group test_point_group("geos::geom::Point");
Expand Down Expand Up @@ -622,5 +623,16 @@ void object::test<47>
ensure(pt->getEnvelopeInternal()->contains(7, 9));
}

// Test of hasDimension()
template<>
template<>
void object::test<48>
()
{
ensure(point_->hasDimension(geos::geom::Dimension::P));
ensure(!point_->hasDimension(geos::geom::Dimension::L));
ensure(!point_->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut

11 changes: 11 additions & 0 deletions tests/unit/geom/PolygonTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,4 +650,15 @@ void object::test<44>()
ensure_equals(holes.size(), 1u);
}

// Test of hasDimension()
template<>
template<>
void object::test<45>
()
{
ensure(!poly_->hasDimension(geos::geom::Dimension::P));
ensure(!poly_->hasDimension(geos::geom::Dimension::L));
ensure(poly_->hasDimension(geos::geom::Dimension::A));
}

} // namespace tut
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,17 @@
<test> <op name="intersects" arg1="A" arg2="B"> true </op> </test>
</case>

<case>
<desc>LineString against GC, with point at endpoint
</desc>
<a>
LINESTRING (0 0, 1 1)
</a>
<b>
GEOMETRYCOLLECTION (POINT (1 1), LINESTRING (2 2, 3 3))
</b>
<test> <op name="intersects" arg1="A" arg2="B"> true </op> </test>
</case>


</run>