Skip to content

Commit 41d6968

Browse files
author
peng.li24
committed
feat: add cross-type intersects() C++ methods + pybind11 bindings for all geometry types
- C++: add intersects(MultiLineString) to LineString, intersects(Polygon/MultiPolygon) to MultiLineString, intersects(MultiLineString) to MultiPolygon, intersects(MultiLineString/MultiPolygon) to Polygon - pybind11: add missing intersects bindings for Point, LineString, Polygon, MultiLineString, MultiPolygon covering all cross-type combinations
1 parent c4c5929 commit 41d6968

5 files changed

Lines changed: 53 additions & 0 deletions

File tree

shapely/geometry/linestring.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ class LineString {
8787
bool intersects(const LineString& other) const;
8888
template <typename U> bool intersects(const Point<U>& other) const;
8989
template <typename U> bool intersects(const Polygon<U>& other) const;
90+
template <typename U> bool intersects(const MultiLineString<U>& other) const;
9091

9192
// -- DE-9IM --
9293
template <typename U> std::string relate(const Point<U>& other) const;
@@ -286,6 +287,7 @@ template <typename T> template <typename U> bool LineString<T>::equals_exact(con
286287
template <typename T> bool LineString<T>::intersects(const LineString& o) const { return geos_linestring_->intersects(o.geos_linestring_.get()); }
287288
template <typename T> template <typename U> bool LineString<T>::intersects(const Point<U>& o) const { return geos_linestring_->intersects(o.geos_point_.get()); }
288289
template <typename T> template <typename U> bool LineString<T>::intersects(const Polygon<U>& o) const { return geos_linestring_->intersects(o.geos_polygon_.get()); }
290+
template <typename T> template <typename U> bool LineString<T>::intersects(const MultiLineString<U>& o) const { return geos_linestring_->intersects(o.geos_mls_.get()); }
289291

290292
// Python: shapely/geometry/base.py::relate:L753, relate_pattern:L890
291293
// -- relate / relate_pattern ------------------------------------------------

shapely/geometry/multilinestring.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ class MultiLineString {
8686
bool intersects(const MultiLineString& other) const;
8787
template <typename U> bool intersects(const Point<U>& other) const;
8888
template <typename U> bool intersects(const LineString<U>& other) const;
89+
template <typename U> bool intersects(const Polygon<U>& other) const;
90+
template <typename U> bool intersects(const MultiPolygon<U>& other) const;
8991

9092
// -- DE-9IM --
9193
template <typename U> std::string relate(const Point<U>& other) const;
@@ -271,6 +273,10 @@ template <typename T> template <typename U>
271273
bool MultiLineString<T>::intersects(const Point<U>& o) const { return geos_mls_->intersects(o.geos_point_.get()); }
272274
template <typename T> template <typename U>
273275
bool MultiLineString<T>::intersects(const LineString<U>& o) const { return geos_mls_->intersects(o.geos_linestring_.get()); }
276+
template <typename T> template <typename U>
277+
bool MultiLineString<T>::intersects(const Polygon<U>& o) const { return geos_mls_->intersects(o.geos_polygon_.get()); }
278+
template <typename T> template <typename U>
279+
bool MultiLineString<T>::intersects(const MultiPolygon<U>& o) const { return geos_mls_->intersects(o.geos_mp_.get()); }
274280

275281
// -- relate / relate_pattern -----------------------------------------------
276282
template <typename T> template <typename U> std::string MultiLineString<T>::relate(const Point<U>& o) const { return detail::geos_relate(geos_mls_.get(), o.geos_point_.get()); }

shapely/geometry/multipolygon.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ class MultiPolygon {
9696
template <typename U> bool intersects(const Point<U>& other) const;
9797
template <typename U> bool intersects(const LineString<U>& other) const;
9898
template <typename U> bool intersects(const Polygon<U>& other) const;
99+
template <typename U> bool intersects(const MultiLineString<U>& other) const;
99100

100101
// -- DE-9IM --
101102
template <typename U> std::string relate(const Point<U>& other) const;
@@ -288,6 +289,7 @@ template <typename T> bool MultiPolygon<T>::intersects(const MultiPolygon& o) co
288289
template <typename T> template <typename U> bool MultiPolygon<T>::intersects(const Point<U>& o) const { return geos_mp_->intersects(o.geos_point_.get()); }
289290
template <typename T> template <typename U> bool MultiPolygon<T>::intersects(const LineString<U>& o) const { return geos_mp_->intersects(o.geos_linestring_.get()); }
290291
template <typename T> template <typename U> bool MultiPolygon<T>::intersects(const Polygon<U>& o) const { return geos_mp_->intersects(o.geos_polygon_.get()); }
292+
template <typename T> template <typename U> bool MultiPolygon<T>::intersects(const MultiLineString<U>& o) const { return geos_mp_->intersects(o.geos_mls_.get()); }
291293

292294
// -- relate / relate_pattern -----------------------------------------------
293295
template <typename T> template <typename U> std::string MultiPolygon<T>::relate(const Point<U>& o) const { return detail::geos_relate(geos_mp_.get(), o.geos_point_.get()); }

shapely/geometry/polygon.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,8 @@ class Polygon {
248248
bool intersects(const Polygon& other) const;
249249
template <typename U> bool intersects(const LineString<U>& other) const;
250250
template <typename U> bool intersects(const Point<U>& other) const;
251+
template <typename U> bool intersects(const MultiLineString<U>& other) const;
252+
template <typename U> bool intersects(const MultiPolygon<U>& other) const;
251253

252254
// -- DE-9IM --
253255
template <typename U> std::string relate(const Point<U>& other) const;
@@ -785,6 +787,8 @@ template <typename T> template <typename U> bool Polygon<T>::equals_exact(const
785787
template <typename T> bool Polygon<T>::intersects(const Polygon& o) const { return geos_polygon_->intersects(o.geos_polygon_.get()); }
786788
template <typename T> template <typename U> bool Polygon<T>::intersects(const LineString<U>& o) const { return geos_polygon_->intersects(o.geos_linestring_.get()); }
787789
template <typename T> template <typename U> bool Polygon<T>::intersects(const Point<U>& o) const { return geos_polygon_->intersects(o.geos_point_.get()); }
790+
template <typename T> template <typename U> bool Polygon<T>::intersects(const MultiLineString<U>& o) const { return geos_polygon_->intersects(o.geos_mls_.get()); }
791+
template <typename T> template <typename U> bool Polygon<T>::intersects(const MultiPolygon<U>& o) const { return geos_polygon_->intersects(o.geos_mp_.get()); }
788792

789793
// Python: shapely/geometry/base.py::relate:L753, relate_pattern:L890
790794
// -- relate / relate_pattern ------------------------------------------------

tests/module.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,15 @@ PYBIND11_MODULE(shapelycpp, m) {
5959
.def("distance", [](const Point<double>& self, const Point<double>& o) {
6060
return self.distance(o);
6161
})
62+
.def("intersects", [](const Point<double>& self, const Point<double>& o) {
63+
return self.intersects(o);
64+
})
65+
.def("intersects", [](const Point<double>& self, const LineString<double>& o) {
66+
return self.intersects(o);
67+
})
68+
.def("intersects", [](const Point<double>& self, const Polygon<double>& o) {
69+
return self.intersects(o);
70+
})
6271
BIND_ACCESSORS(Point<double>);
6372

6473
// ======================================================================
@@ -97,6 +106,15 @@ PYBIND11_MODULE(shapelycpp, m) {
97106
.def("intersects", [](const LineString<double>& self, const LineString<double>& o) {
98107
return self.intersects(o);
99108
})
109+
.def("intersects", [](const LineString<double>& self, const Point<double>& o) {
110+
return self.intersects(o);
111+
})
112+
.def("intersects", [](const LineString<double>& self, const Polygon<double>& o) {
113+
return self.intersects(o);
114+
})
115+
.def("intersects", [](const LineString<double>& self, const MultiLineString<double>& o) {
116+
return self.intersects(o);
117+
})
100118
BIND_ACCESSORS(LineString<double>);
101119

102120
// ======================================================================
@@ -137,6 +155,18 @@ PYBIND11_MODULE(shapelycpp, m) {
137155
.def("intersects", [](const Polygon<double>& self, const Polygon<double>& o) {
138156
return self.intersects(o);
139157
})
158+
.def("intersects", [](const Polygon<double>& self, const Point<double>& o) {
159+
return self.intersects(o);
160+
})
161+
.def("intersects", [](const Polygon<double>& self, const LineString<double>& o) {
162+
return self.intersects(o);
163+
})
164+
.def("intersects", [](const Polygon<double>& self, const MultiLineString<double>& o) {
165+
return self.intersects(o);
166+
})
167+
.def("intersects", [](const Polygon<double>& self, const MultiPolygon<double>& o) {
168+
return self.intersects(o);
169+
})
140170
.def_property_readonly("coords_arr", [](const Polygon<double>& poly) {
141171
return _native_to_array(poly.data(), poly.rows(), poly.cols());
142172
})
@@ -255,6 +285,12 @@ PYBIND11_MODULE(shapelycpp, m) {
255285
.def("intersects", [](const MultiLineString<double>& self, const MultiLineString<double>& o) {
256286
return self.intersects(o);
257287
})
288+
.def("intersects", [](const MultiLineString<double>& self, const Polygon<double>& o) {
289+
return self.intersects(o);
290+
})
291+
.def("intersects", [](const MultiLineString<double>& self, const MultiPolygon<double>& o) {
292+
return self.intersects(o);
293+
})
258294
BIND_ACCESSORS(MultiLineString<double>);
259295

260296
// ======================================================================
@@ -302,6 +338,9 @@ PYBIND11_MODULE(shapelycpp, m) {
302338
.def("intersects", [](const MultiPolygon<double>& self, const MultiPolygon<double>& o) {
303339
return self.intersects(o);
304340
})
341+
.def("intersects", [](const MultiPolygon<double>& self, const MultiLineString<double>& o) {
342+
return self.intersects(o);
343+
})
305344
BIND_ACCESSORS(MultiPolygon<double>);
306345

307346
// ======================================================================

0 commit comments

Comments
 (0)