[python-shapely] 01/06: New upstream version 1.6.2
Bas Couwenberg
sebastic at debian.org
Thu Oct 26 18:42:57 UTC 2017
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository python-shapely.
commit 17bd13e4c5430cf72720ac2a9bec42fccaf4b41f
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Thu Oct 26 19:53:33 2017 +0200
New upstream version 1.6.2
---
CHANGES.txt | 10 ++++++++++
docs/manual.rst | 7 ++++++-
shapely/__init__.py | 2 +-
shapely/ops.py | 23 +++++++++++++----------
tests/test_split.py | 28 ++++++++++++++++++----------
5 files changed, 48 insertions(+), 22 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index c00514c..8dd19ad 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,16 @@
Changes
=======
+1.6.2 (2017-10-26)
+------------------
+
+- Handle a ``TypeError`` that can occur when geometries are torn down (#473,
+ #528).
+- Splitting a linestring by one of its end points will now succeed instead of
+ failing with a ``ValueError`` (#524, #533).
+- Missing documentation of a geometry's ``overlaps`` predicate has been added
+ (#522).
+
1.6.1 (2017-09-01)
------------------
diff --git a/docs/manual.rst b/docs/manual.rst
index 12c7536..8ad4665 100644
--- a/docs/manual.rst
+++ b/docs/manual.rst
@@ -442,7 +442,7 @@ constructor parameter.
Polygons
--------
-.. class:: Polygon(exterior [,interiors=None])
+.. class:: Polygon(shell [,holes=None])
The `Polygon` constructor takes two positional parameters. The first is an
ordered sequence of ``(x, y[, z])`` point tuples and is treated exactly as in
@@ -1145,6 +1145,11 @@ This predicate applies to all types and is the inverse of :meth:`intersects`.
In other words, geometric objects intersect if they have any boundary or
interior point in common.
+.. method:: object.overlaps(other)
+
+ Returns ``True`` if the objects intersect (see above) but neither contains
+ the other.
+
.. method:: object.touches(other)
Returns ``True`` if the objects have at least one point in common and their
diff --git a/shapely/__init__.py b/shapely/__init__.py
index f49459c..51bbb3f 100644
--- a/shapely/__init__.py
+++ b/shapely/__init__.py
@@ -1 +1 @@
-__version__ = "1.6.1"
+__version__ = "1.6.2"
diff --git a/shapely/ops.py b/shapely/ops.py
index 68fcbcd..7f6c050 100644
--- a/shapely/ops.py
+++ b/shapely/ops.py
@@ -257,7 +257,7 @@ def transform(func, geom):
def nearest_points(g1, g2):
"""Returns the calculated nearest points in the input geometries
-
+
The points are returned in the same order as the input geometries.
"""
seq = lgeos.methods['nearest_points'](g1._geom, g2._geom)
@@ -339,21 +339,21 @@ class SplitOp(object):
union = poly.boundary.union(splitter)
# some polygonized geometries may be holes, we do not want them
- # that's why we test if the original polygon (poly) contains
+ # that's why we test if the original polygon (poly) contains
# an inner point of polygonized geometry (pg)
return [pg for pg in polygonize(union) if poly.contains(pg.representative_point())]
@staticmethod
def _split_line_with_line(line, splitter):
"""Split a LineString with another (Multi)LineString or (Multi)Polygon"""
-
+
# if splitter is a polygon, pick it's boundary
if splitter.type in ('Polygon', 'MultiPolygon'):
splitter = splitter.boundary
assert(isinstance(line, LineString))
assert(isinstance(splitter, LineString) or isinstance(splitter, MultiLineString))
-
+
if splitter.crosses(line):
# The lines cross --> return multilinestring from the split
return line.difference(splitter)
@@ -364,7 +364,7 @@ class SplitOp(object):
# The lines do not cross --> return collection with identity line
return [line]
- @staticmethod
+ @staticmethod
def _split_line_with_point(line, splitter):
"""Split a LineString with a Point"""
@@ -374,10 +374,13 @@ class SplitOp(object):
# check if point is in the interior of the line
if not line.relate_pattern(splitter, '0********'):
# point not on line interior --> return collection with single identity line
- # (REASONING: Returning a list with the input line reference and creating a
- # GeometryCollection at the general split function prevents unnecessary copying
+ # (REASONING: Returning a list with the input line reference and creating a
+ # GeometryCollection at the general split function prevents unnecessary copying
# of linestrings in multipoint splitting function)
return [line]
+ elif line.coords[0] == splitter.coords[0]:
+ # if line is a closed ring the previous test doesn't behave as desired
+ return [line]
# point is on line, get the distance from the first point on line
distance_on_line = line.project(splitter)
@@ -388,7 +391,7 @@ class SplitOp(object):
pd = line.project(Point(p))
if pd == distance_on_line:
return [
- LineString(coords[:i+1]),
+ LineString(coords[:i+1]),
LineString(coords[i:])
]
elif distance_on_line < pd:
@@ -414,9 +417,9 @@ class SplitOp(object):
# add the newly split 2 lines or the same line if not split
new_chunks.extend(SplitOp._split_line_with_point(chunk, pt))
chunks = new_chunks
-
+
return chunks
-
+
@staticmethod
def split(geom, splitter):
"""
diff --git a/tests/test_split.py b/tests/test_split.py
index dcaae0b..c18f088 100644
--- a/tests/test_split.py
+++ b/tests/test_split.py
@@ -7,7 +7,7 @@ from shapely.ops import cascaded_union, linemerge
class TestSplitGeometry(unittest.TestCase):
# helper class for testing below
- def helper(self, geom, splitter, expected_chunks):
+ def helper(self, geom, splitter, expected_chunks):
s = split(geom, splitter)
self.assertEqual(s.type, "GeometryCollection")
self.assertEqual(len(s), expected_chunks)
@@ -25,6 +25,14 @@ class TestSplitGeometry(unittest.TestCase):
# not split --> expected equal to line
self.assertTrue(s[0].equals(geom))
+ def test_split_closed_line_with_point(self):
+ # point at start/end of closed ring -> return equal
+ # see GH #524
+ ls = LineString([(0,0), (0, 1), (1, 1), (1, 0), (0, 0)])
+ splitter = Point(0, 0)
+ self.helper(ls, splitter, 1)
+
+
class TestSplitPolygon(TestSplitGeometry):
poly_simple = Polygon([(0, 0), (2, 0), (2, 2), (0, 2), (0, 0)])
poly_hole = Polygon([(0, 0), (2, 0), (2, 2), (0, 2), (0, 0)], [[(0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5), (0.5, 0.5)]])
@@ -94,7 +102,7 @@ class TestSplitLine(TestSplitGeometry):
def test_split_line_with_line(self):
# crosses at one point --> return 2 segments
splitter = LineString([(0, 1), (1, 0)])
- self.helper(self.ls, splitter, 2)
+ self.helper(self.ls, splitter, 2)
# crosses at two points --> return 3 segments
splitter = LineString([(0, 1), (1, 0), (1, 2)])
@@ -117,7 +125,7 @@ class TestSplitLine(TestSplitGeometry):
def test_split_line_with_multiline(self):
# crosses at one point --> return 2 segments
splitter = MultiLineString([[(0, 1), (1, 0)], [(0, 0), (2, -2)]])
- self.helper(self.ls, splitter, 2)
+ self.helper(self.ls, splitter, 2)
# crosses at two points --> return 3 segments
splitter = MultiLineString([[(0, 1), (1, 0)], [(0, 2), (2, 0)]])
@@ -158,7 +166,7 @@ class TestSplitLine(TestSplitGeometry):
self.helper(self.ls, splitter, 4)
class TestSplitMulti(TestSplitGeometry):
-
+
def test_split_multiline_with_point(self):
# a cross-like multilinestring with a point in the middle --> return 4 line segments
l1 = LineString([(0, 1), (2, 1)])
@@ -166,27 +174,27 @@ class TestSplitMulti(TestSplitGeometry):
ml = MultiLineString([l1, l2])
splitter = Point((1, 1))
self.helper(ml, splitter, 4)
-
+
def test_split_multiline_with_multipoint(self):
- # a cross-like multilinestring with a point in middle, a point on one of the lines and a point in the exterior
+ # a cross-like multilinestring with a point in middle, a point on one of the lines and a point in the exterior
# --> return 4+1 line segments
l1 = LineString([(0, 1), (3, 1)])
l2 = LineString([(1, 0), (1, 2)])
ml = MultiLineString([l1, l2])
splitter = MultiPoint([(1, 1), (2, 1), (4, 2)])
self.helper(ml, splitter, 5)
-
+
def test_split_multipolygon_with_line(self):
# two polygons with a crossing line --> return 4 triangles
- poly1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
+ poly1 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
poly2 = Polygon([(1, 1), (1, 2), (2, 2), (2, 1), (1, 1)])
mpoly = MultiPolygon([poly1, poly2])
ls = LineString([(-1, -1), (3, 3)])
self.helper(mpoly, ls, 4)
# two polygons away from the crossing line --> return identity
- poly1 = Polygon([(10, 10), (10, 11), (11, 11), (11, 10), (10, 10)])
+ poly1 = Polygon([(10, 10), (10, 11), (11, 11), (11, 10), (10, 10)])
poly2 = Polygon([(-10, -10), (-10, -11), (-11, -11), (-11, -10), (-10, -10)])
mpoly = MultiPolygon([poly1, poly2])
ls = LineString([(-1, -1), (3, 3)])
- self.helper(mpoly, ls, 2)
\ No newline at end of file
+ self.helper(mpoly, ls, 2)
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/python-shapely.git
More information about the Pkg-grass-devel
mailing list