shapely 1.8a1__tar.gz → 1.8a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {Shapely-1.8a1 → Shapely-1.8a2}/CHANGES.txt +35 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/CREDITS.txt +1 -0
- {Shapely-1.8a1/Shapely.egg-info → Shapely-1.8a2}/PKG-INFO +41 -6
- {Shapely-1.8a1 → Shapely-1.8a2}/README.rst +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2/Shapely.egg-info}/PKG-INFO +41 -6
- {Shapely-1.8a1 → Shapely-1.8a2}/Shapely.egg-info/SOURCES.txt +0 -1
- Shapely-1.8a2/VERSION.txt +1 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/_structures.py +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/markers.py +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/requirements.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/specifiers.py +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/version.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/docs/design.rst +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/docs/manual.rst +60 -11
- {Shapely-1.8a1 → Shapely-1.8a2}/setup.cfg +0 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/setup.py +2 -3
- Shapely-1.8a2/shapely/__init__.py +1 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/affinity.py +2 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/algorithms/polylabel.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/coords.py +29 -19
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/errors.py +21 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/base.py +13 -13
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/geo.py +4 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/linestring.py +16 -5
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/multilinestring.py +5 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/multipoint.py +5 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/multipolygon.py +5 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/point.py +16 -5
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/polygon.py +18 -7
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/proxy.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geos.py +25 -26
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/impl.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/iterops.py +3 -3
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/linref.py +3 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/ops.py +28 -22
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/prepared.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/speedups/__init__.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/speedups/_speedups.c +68 -13
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/speedups/_speedups.pyx +2 -2
- Shapely-1.8a2/shapely/strtree.py +374 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/topology.py +3 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/vectorized/_vectorized.pyx +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/wkb.py +20 -5
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/wkt.py +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_delegated.py +1 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_geointerface.py +1 -1
- Shapely-1.8a2/tests/test_geometry_geo.py +18 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_linear_referencing.py +2 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_minimum_rotated_rectangle.py +0 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_operations.py +2 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_polygon.py +4 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_shared_paths.py +3 -2
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_split.py +4 -3
- Shapely-1.8a2/tests/test_strtree.py +198 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_substring.py +2 -1
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_vectorized.py +1 -1
- Shapely-1.8a2/tests/test_wkb.py +158 -0
- Shapely-1.8a2/tests/test_wkt.py +62 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/unpickle-strtree.py +1 -5
- Shapely-1.8a1/VERSION.txt +0 -1
- Shapely-1.8a1/shapely/__init__.py +0 -1
- Shapely-1.8a1/shapely/strtree.py +0 -236
- Shapely-1.8a1/tests/test_geometry_geo.py +0 -16
- Shapely-1.8a1/tests/test_strtree.py +0 -111
- Shapely-1.8a1/tests/test_strtree_nearest.py +0 -29
- Shapely-1.8a1/tests/test_wkb.py +0 -74
- Shapely-1.8a1/tests/test_wkt.py +0 -34
- {Shapely-1.8a1 → Shapely-1.8a2}/LICENSE.txt +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/Shapely.egg-info/dependency_links.txt +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/Shapely.egg-info/requires.txt +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/Shapely.egg-info/top_level.txt +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/__about__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/_compat.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/_vendor/packaging/utils.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/docs/index.rst +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/docs/project.rst +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/_buildcfg.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/_geos.pxi +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/algorithms/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/algorithms/cga.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/ctypes_declarations.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/examples/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/examples/dissolve.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/examples/geoms.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/examples/intersect.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/geometry/collection.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/predicates.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/validation.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/shapely/vectorized/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/__init__.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/conftest.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_affinity.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_binascii_hex.txt +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_box.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_buffer.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_cga.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_clip_by_rect.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_collection.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_coords.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_create_inconsistent_dimensionality.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_default_impl.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_delaunay.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_dlls.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_doctests.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_emptiness.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_empty_polygons.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_equality.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_geometry_base.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_geomseq.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_geos_err_handler.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_getitem.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_hash.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_invalid_geometries.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_iterops.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_linemerge.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_linestring.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_locale.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_make_valid.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_mapping.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_minimum_clearance.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_multi.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_multilinestring.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_multipoint.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_multipolygon.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_ndarrays.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_nearest.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_operators.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_orient.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_parallel_offset.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_persist.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_pickle.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_point.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_polygonize.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_polylabel.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_predicates.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_prepared.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_products_z.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_shape.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_singularity.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_snap.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_styles.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_svg.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_transform.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_union.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_validation.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_voronoi_diagram.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/test_xy.py +0 -0
- {Shapely-1.8a1 → Shapely-1.8a2}/tests/threading_test.py +0 -0
|
@@ -1,6 +1,37 @@
|
|
|
1
1
|
Changes
|
|
2
2
|
=======
|
|
3
3
|
|
|
4
|
+
1.8a2 (TBD)
|
|
5
|
+
-----------
|
|
6
|
+
|
|
7
|
+
Python version support:
|
|
8
|
+
|
|
9
|
+
Shapely 1.8 will support only Python versions >= 3.6.
|
|
10
|
+
|
|
11
|
+
New features:
|
|
12
|
+
|
|
13
|
+
- The STRtree nearest*() methods now take an optional argument that
|
|
14
|
+
specifies exclusion of the input geometry from results (#1115).
|
|
15
|
+
- A GeometryTypeError has been added to shapely.errors and is consistently
|
|
16
|
+
raised instead of TypeError or ValueError as in version 1.7. For backwards
|
|
17
|
+
compatibility, the new exception will derive from TypeError and Value error
|
|
18
|
+
until version 2.0 (#1099).
|
|
19
|
+
- The STRtree class constructor now takes an optional second argument, a
|
|
20
|
+
sequence of objects to be stored in the tree. If not provided, the sequence
|
|
21
|
+
indices of the geometries will be stored, as before (#1112).
|
|
22
|
+
- The STRtree class has new query_geoms(), query_items(), nearest_geom(), and
|
|
23
|
+
nearest_item() methods (#1112). The query() and nearest() methods remain as
|
|
24
|
+
aliases for query_geoms() and nearest_geom().
|
|
25
|
+
|
|
26
|
+
Bug fixes:
|
|
27
|
+
|
|
28
|
+
- We no longer attempt to load libc to get the free function on Linux, but get
|
|
29
|
+
it from the global symbol table.
|
|
30
|
+
- GEOS error messages printed when GEOS_getCoordSeq() is passed an empty
|
|
31
|
+
geometry are avoided by never passing an empty geometry (#1134).
|
|
32
|
+
- Python's builtin super() is now used only as described in PEP 3135 (#1109).
|
|
33
|
+
- Only load conda GEOS dll if it exists (on Windows) (#1108).
|
|
34
|
+
|
|
4
35
|
1.8a1 (2021-03-03)
|
|
5
36
|
------------------
|
|
6
37
|
|
|
@@ -8,6 +39,10 @@ Shapely 1.8.0 will be a transitional version. There are a few bug fixes and new
|
|
|
8
39
|
features, but it is mainly about warning of the upcoming changes in 2.0.0.
|
|
9
40
|
Several more pre-releases before 1.8.0 are expected.
|
|
10
41
|
|
|
42
|
+
Python version support:
|
|
43
|
+
|
|
44
|
+
Shapely 1.8 will support only Python versions >= 3.5 (#884).
|
|
45
|
+
|
|
11
46
|
Deprecations:
|
|
12
47
|
|
|
13
48
|
The following functions and geometry attributes and methods will be removed in
|
|
@@ -24,6 +24,7 @@ Shapely is written by:
|
|
|
24
24
|
* David Swinkels <davidswinkelss@gmail.com>
|
|
25
25
|
* Denis Rykov <rykovd@gmail.com>
|
|
26
26
|
* Erwin Sterrenburg <e.w.sterrenburg@gmail.com>
|
|
27
|
+
* Felix Divo <4403130+felixdivo@users.noreply.github.com>
|
|
27
28
|
* Felix Yan <felixonmars@archlinux.org>
|
|
28
29
|
* Filipe Fernandes <ocefpaf@gmail.com>
|
|
29
30
|
* Frédéric Junod <frederic.junod@camptocamp.com>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: Shapely
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8a2
|
|
4
4
|
Summary: Geometric objects, predicates, and operations
|
|
5
5
|
Home-page: https://github.com/Toblerity/Shapely
|
|
6
6
|
Author: Sean Gillies
|
|
@@ -60,9 +60,9 @@ Description: =======
|
|
|
60
60
|
Requirements
|
|
61
61
|
============
|
|
62
62
|
|
|
63
|
-
Shapely 1.
|
|
63
|
+
Shapely 1.8 requires
|
|
64
64
|
|
|
65
|
-
* Python
|
|
65
|
+
* Python >=3.6
|
|
66
66
|
* GEOS >=3.3
|
|
67
67
|
|
|
68
68
|
Installing Shapely
|
|
@@ -197,6 +197,7 @@ Description: =======
|
|
|
197
197
|
* David Swinkels <davidswinkelss@gmail.com>
|
|
198
198
|
* Denis Rykov <rykovd@gmail.com>
|
|
199
199
|
* Erwin Sterrenburg <e.w.sterrenburg@gmail.com>
|
|
200
|
+
* Felix Divo <4403130+felixdivo@users.noreply.github.com>
|
|
200
201
|
* Felix Yan <felixonmars@archlinux.org>
|
|
201
202
|
* Filipe Fernandes <ocefpaf@gmail.com>
|
|
202
203
|
* Frédéric Junod <frederic.junod@camptocamp.com>
|
|
@@ -295,6 +296,37 @@ Description: =======
|
|
|
295
296
|
Changes
|
|
296
297
|
=======
|
|
297
298
|
|
|
299
|
+
1.8a2 (TBD)
|
|
300
|
+
-----------
|
|
301
|
+
|
|
302
|
+
Python version support:
|
|
303
|
+
|
|
304
|
+
Shapely 1.8 will support only Python versions >= 3.6.
|
|
305
|
+
|
|
306
|
+
New features:
|
|
307
|
+
|
|
308
|
+
- The STRtree nearest*() methods now take an optional argument that
|
|
309
|
+
specifies exclusion of the input geometry from results (#1115).
|
|
310
|
+
- A GeometryTypeError has been added to shapely.errors and is consistently
|
|
311
|
+
raised instead of TypeError or ValueError as in version 1.7. For backwards
|
|
312
|
+
compatibility, the new exception will derive from TypeError and Value error
|
|
313
|
+
until version 2.0 (#1099).
|
|
314
|
+
- The STRtree class constructor now takes an optional second argument, a
|
|
315
|
+
sequence of objects to be stored in the tree. If not provided, the sequence
|
|
316
|
+
indices of the geometries will be stored, as before (#1112).
|
|
317
|
+
- The STRtree class has new query_geoms(), query_items(), nearest_geom(), and
|
|
318
|
+
nearest_item() methods (#1112). The query() and nearest() methods remain as
|
|
319
|
+
aliases for query_geoms() and nearest_geom().
|
|
320
|
+
|
|
321
|
+
Bug fixes:
|
|
322
|
+
|
|
323
|
+
- We no longer attempt to load libc to get the free function on Linux, but get
|
|
324
|
+
it from the global symbol table.
|
|
325
|
+
- GEOS error messages printed when GEOS_getCoordSeq() is passed an empty
|
|
326
|
+
geometry are avoided by never passing an empty geometry (#1134).
|
|
327
|
+
- Python's builtin super() is now used only as described in PEP 3135 (#1109).
|
|
328
|
+
- Only load conda GEOS dll if it exists (on Windows) (#1108).
|
|
329
|
+
|
|
298
330
|
1.8a1 (2021-03-03)
|
|
299
331
|
------------------
|
|
300
332
|
|
|
@@ -302,6 +334,10 @@ Description: =======
|
|
|
302
334
|
features, but it is mainly about warning of the upcoming changes in 2.0.0.
|
|
303
335
|
Several more pre-releases before 1.8.0 are expected.
|
|
304
336
|
|
|
337
|
+
Python version support:
|
|
338
|
+
|
|
339
|
+
Shapely 1.8 will support only Python versions >= 3.5 (#884).
|
|
340
|
+
|
|
305
341
|
Deprecations:
|
|
306
342
|
|
|
307
343
|
The following functions and geometry attributes and methods will be removed in
|
|
@@ -1068,13 +1104,12 @@ Classifier: Intended Audience :: Science/Research
|
|
|
1068
1104
|
Classifier: License :: OSI Approved :: BSD License
|
|
1069
1105
|
Classifier: Operating System :: OS Independent
|
|
1070
1106
|
Classifier: Programming Language :: Python :: 3
|
|
1071
|
-
Classifier: Programming Language :: Python :: 3.5
|
|
1072
1107
|
Classifier: Programming Language :: Python :: 3.6
|
|
1073
1108
|
Classifier: Programming Language :: Python :: 3.7
|
|
1074
1109
|
Classifier: Programming Language :: Python :: 3.8
|
|
1075
1110
|
Classifier: Programming Language :: Python :: 3.9
|
|
1076
1111
|
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
1077
|
-
Requires-Python: >=3.
|
|
1112
|
+
Requires-Python: >=3.6
|
|
1113
|
+
Provides-Extra: all
|
|
1078
1114
|
Provides-Extra: vectorized
|
|
1079
1115
|
Provides-Extra: test
|
|
1080
|
-
Provides-Extra: all
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: Shapely
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.8a2
|
|
4
4
|
Summary: Geometric objects, predicates, and operations
|
|
5
5
|
Home-page: https://github.com/Toblerity/Shapely
|
|
6
6
|
Author: Sean Gillies
|
|
@@ -60,9 +60,9 @@ Description: =======
|
|
|
60
60
|
Requirements
|
|
61
61
|
============
|
|
62
62
|
|
|
63
|
-
Shapely 1.
|
|
63
|
+
Shapely 1.8 requires
|
|
64
64
|
|
|
65
|
-
* Python
|
|
65
|
+
* Python >=3.6
|
|
66
66
|
* GEOS >=3.3
|
|
67
67
|
|
|
68
68
|
Installing Shapely
|
|
@@ -197,6 +197,7 @@ Description: =======
|
|
|
197
197
|
* David Swinkels <davidswinkelss@gmail.com>
|
|
198
198
|
* Denis Rykov <rykovd@gmail.com>
|
|
199
199
|
* Erwin Sterrenburg <e.w.sterrenburg@gmail.com>
|
|
200
|
+
* Felix Divo <4403130+felixdivo@users.noreply.github.com>
|
|
200
201
|
* Felix Yan <felixonmars@archlinux.org>
|
|
201
202
|
* Filipe Fernandes <ocefpaf@gmail.com>
|
|
202
203
|
* Frédéric Junod <frederic.junod@camptocamp.com>
|
|
@@ -295,6 +296,37 @@ Description: =======
|
|
|
295
296
|
Changes
|
|
296
297
|
=======
|
|
297
298
|
|
|
299
|
+
1.8a2 (TBD)
|
|
300
|
+
-----------
|
|
301
|
+
|
|
302
|
+
Python version support:
|
|
303
|
+
|
|
304
|
+
Shapely 1.8 will support only Python versions >= 3.6.
|
|
305
|
+
|
|
306
|
+
New features:
|
|
307
|
+
|
|
308
|
+
- The STRtree nearest*() methods now take an optional argument that
|
|
309
|
+
specifies exclusion of the input geometry from results (#1115).
|
|
310
|
+
- A GeometryTypeError has been added to shapely.errors and is consistently
|
|
311
|
+
raised instead of TypeError or ValueError as in version 1.7. For backwards
|
|
312
|
+
compatibility, the new exception will derive from TypeError and Value error
|
|
313
|
+
until version 2.0 (#1099).
|
|
314
|
+
- The STRtree class constructor now takes an optional second argument, a
|
|
315
|
+
sequence of objects to be stored in the tree. If not provided, the sequence
|
|
316
|
+
indices of the geometries will be stored, as before (#1112).
|
|
317
|
+
- The STRtree class has new query_geoms(), query_items(), nearest_geom(), and
|
|
318
|
+
nearest_item() methods (#1112). The query() and nearest() methods remain as
|
|
319
|
+
aliases for query_geoms() and nearest_geom().
|
|
320
|
+
|
|
321
|
+
Bug fixes:
|
|
322
|
+
|
|
323
|
+
- We no longer attempt to load libc to get the free function on Linux, but get
|
|
324
|
+
it from the global symbol table.
|
|
325
|
+
- GEOS error messages printed when GEOS_getCoordSeq() is passed an empty
|
|
326
|
+
geometry are avoided by never passing an empty geometry (#1134).
|
|
327
|
+
- Python's builtin super() is now used only as described in PEP 3135 (#1109).
|
|
328
|
+
- Only load conda GEOS dll if it exists (on Windows) (#1108).
|
|
329
|
+
|
|
298
330
|
1.8a1 (2021-03-03)
|
|
299
331
|
------------------
|
|
300
332
|
|
|
@@ -302,6 +334,10 @@ Description: =======
|
|
|
302
334
|
features, but it is mainly about warning of the upcoming changes in 2.0.0.
|
|
303
335
|
Several more pre-releases before 1.8.0 are expected.
|
|
304
336
|
|
|
337
|
+
Python version support:
|
|
338
|
+
|
|
339
|
+
Shapely 1.8 will support only Python versions >= 3.5 (#884).
|
|
340
|
+
|
|
305
341
|
Deprecations:
|
|
306
342
|
|
|
307
343
|
The following functions and geometry attributes and methods will be removed in
|
|
@@ -1068,13 +1104,12 @@ Classifier: Intended Audience :: Science/Research
|
|
|
1068
1104
|
Classifier: License :: OSI Approved :: BSD License
|
|
1069
1105
|
Classifier: Operating System :: OS Independent
|
|
1070
1106
|
Classifier: Programming Language :: Python :: 3
|
|
1071
|
-
Classifier: Programming Language :: Python :: 3.5
|
|
1072
1107
|
Classifier: Programming Language :: Python :: 3.6
|
|
1073
1108
|
Classifier: Programming Language :: Python :: 3.7
|
|
1074
1109
|
Classifier: Programming Language :: Python :: 3.8
|
|
1075
1110
|
Classifier: Programming Language :: Python :: 3.9
|
|
1076
1111
|
Classifier: Topic :: Scientific/Engineering :: GIS
|
|
1077
|
-
Requires-Python: >=3.
|
|
1112
|
+
Requires-Python: >=3.6
|
|
1113
|
+
Provides-Extra: all
|
|
1078
1114
|
Provides-Extra: vectorized
|
|
1079
1115
|
Provides-Extra: test
|
|
1080
|
-
Provides-Extra: all
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1.8a2
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
from __future__ import absolute_import, division, print_function
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
class Infinity
|
|
7
|
+
class Infinity:
|
|
8
8
|
|
|
9
9
|
def __repr__(self):
|
|
10
10
|
return "Infinity"
|
|
@@ -36,7 +36,7 @@ class Infinity(object):
|
|
|
36
36
|
Infinity = Infinity()
|
|
37
37
|
|
|
38
38
|
|
|
39
|
-
class NegativeInfinity
|
|
39
|
+
class NegativeInfinity:
|
|
40
40
|
|
|
41
41
|
def __repr__(self):
|
|
42
42
|
return "-Infinity"
|
|
@@ -40,7 +40,7 @@ class UndefinedEnvironmentName(ValueError):
|
|
|
40
40
|
"""
|
|
41
41
|
|
|
42
42
|
|
|
43
|
-
class Node
|
|
43
|
+
class Node:
|
|
44
44
|
|
|
45
45
|
def __init__(self, value):
|
|
46
46
|
self.value = value
|
|
@@ -254,7 +254,7 @@ def default_environment():
|
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
|
|
257
|
-
class Marker
|
|
257
|
+
class Marker:
|
|
258
258
|
|
|
259
259
|
def __init__(self, marker):
|
|
260
260
|
try:
|
|
@@ -503,7 +503,7 @@ class Specifier(_IndividualSpecifier):
|
|
|
503
503
|
return False
|
|
504
504
|
|
|
505
505
|
# Ensure that we do not allow a local version of the version mentioned
|
|
506
|
-
# in the specifier, which is
|
|
506
|
+
# in the specifier, which is technically greater than, to match.
|
|
507
507
|
if prospective.local is not None:
|
|
508
508
|
if Version(prospective.base_version) == Version(spec.base_version):
|
|
509
509
|
return False
|
|
@@ -589,7 +589,7 @@ def _pad_version(left, right):
|
|
|
589
589
|
class SpecifierSet(BaseSpecifier):
|
|
590
590
|
|
|
591
591
|
def __init__(self, specifiers="", prereleases=None):
|
|
592
|
-
# Split on , to break each
|
|
592
|
+
# Split on , to break each individual specifier into it's own item, and
|
|
593
593
|
# strip each item to remove leading/trailing whitespace.
|
|
594
594
|
specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
|
|
595
595
|
|
|
@@ -3,7 +3,7 @@ Design Notes
|
|
|
3
3
|
============
|
|
4
4
|
|
|
5
5
|
Shapely provides classes that implement, more or less, the interfaces in the
|
|
6
|
-
OGC's simple feature
|
|
6
|
+
OGC's simple feature access specification [1]_. The classes are defined in
|
|
7
7
|
similarly named modules under ``shapely.geometry``: ``Point`` is in
|
|
8
8
|
``shapely.geometry.point``, ``MultiPolygon`` is in
|
|
9
9
|
``shapely.geometry.multipolygon``. These classes derive from
|
|
@@ -1290,7 +1290,7 @@ Shapely's binary :meth:`within` predicate.
|
|
|
1290
1290
|
|
|
1291
1291
|
.. code-block:: python
|
|
1292
1292
|
|
|
1293
|
-
class Within
|
|
1293
|
+
class Within:
|
|
1294
1294
|
def __init__(self, o):
|
|
1295
1295
|
self.o = o
|
|
1296
1296
|
def __lt__(self, other):
|
|
@@ -1570,7 +1570,7 @@ Constructive Methods
|
|
|
1570
1570
|
Shapely geometric object have several methods that yield new objects not
|
|
1571
1571
|
derived from set-theoretic analysis.
|
|
1572
1572
|
|
|
1573
|
-
.. method:: object.buffer(distance, resolution=16, cap_style=1, join_style=1, mitre_limit=5.0)
|
|
1573
|
+
.. method:: object.buffer(distance, resolution=16, cap_style=1, join_style=1, mitre_limit=5.0, single_sided=False)
|
|
1574
1574
|
|
|
1575
1575
|
Returns an approximate representation of all points within a given `distance`
|
|
1576
1576
|
of the this geometric object.
|
|
@@ -1647,6 +1647,28 @@ With a `resolution` of 1, the buffer is a square patch.
|
|
|
1647
1647
|
>>> q.area
|
|
1648
1648
|
200.0
|
|
1649
1649
|
|
|
1650
|
+
You may want a buffer only on one side. You can achieve this effect with
|
|
1651
|
+
`single_sided` option.
|
|
1652
|
+
|
|
1653
|
+
The side used is determined by the sign of the buffer distance:
|
|
1654
|
+
|
|
1655
|
+
- a positive distance indicates the left-hand side
|
|
1656
|
+
- a negative distance indicates the right-hand side
|
|
1657
|
+
|
|
1658
|
+
.. code-block:: pycon
|
|
1659
|
+
|
|
1660
|
+
>>> line = LineString([(0, 0), (1, 1), (0, 2), (2, 2), (3, 1), (1, 0)])
|
|
1661
|
+
>>> left_hand_side = line.buffer(0.5, single_sided=True)
|
|
1662
|
+
>>> right_hand_side = line.buffer(-0.3, single_sided=True)
|
|
1663
|
+
|
|
1664
|
+
.. plot:: code/buffer_single_side.py
|
|
1665
|
+
|
|
1666
|
+
Figure 10. Single sided buffer of 0.5 left hand (left) and of 0.3 right hand (right).
|
|
1667
|
+
|
|
1668
|
+
The single-sided buffer of point geometries is the same as the regular buffer.
|
|
1669
|
+
The End Cap Style for single-sided buffers is always ignored, and forced to
|
|
1670
|
+
the equivalent of `CAP_STYLE.flat`.
|
|
1671
|
+
|
|
1650
1672
|
Passed a `distance` of 0, :meth:`buffer` can sometimes be used to "clean" self-touching
|
|
1651
1673
|
or self-crossing polygons such as the classic "bowtie". Users have reported
|
|
1652
1674
|
that very small distance values sometimes produce cleaner results than 0. Your
|
|
@@ -1690,7 +1712,7 @@ Buffering splits the polygon in two at the point where they touch.
|
|
|
1690
1712
|
|
|
1691
1713
|
.. plot:: code/convex_hull.py
|
|
1692
1714
|
|
|
1693
|
-
Figure
|
|
1715
|
+
Figure 11. Convex hull (blue) of 2 points (left) and of 6 points (right).
|
|
1694
1716
|
|
|
1695
1717
|
.. attribute:: object.envelope
|
|
1696
1718
|
|
|
@@ -1722,7 +1744,7 @@ Figure 10. Convex hull (blue) of 2 points (left) and of 6 points (right).
|
|
|
1722
1744
|
|
|
1723
1745
|
.. plot:: code/minimum_rotated_rectangle.py
|
|
1724
1746
|
|
|
1725
|
-
Figure
|
|
1747
|
+
Figure 12. Minimum rotated rectangle for a multipoint feature (left) and a
|
|
1726
1748
|
linestring feature (right).
|
|
1727
1749
|
|
|
1728
1750
|
.. method:: object.parallel_offset(distance, side, resolution=16, join_style=1, mitre_limit=5.0)
|
|
@@ -1762,7 +1784,7 @@ linestring feature (right).
|
|
|
1762
1784
|
|
|
1763
1785
|
.. plot:: code/parallel_offset.py
|
|
1764
1786
|
|
|
1765
|
-
Figure
|
|
1787
|
+
Figure 13. Three styles of parallel offset lines on the left side of a simple
|
|
1766
1788
|
line string (its starting point shown as a circle) and one offset on the right
|
|
1767
1789
|
side, a multipart.
|
|
1768
1790
|
|
|
@@ -1770,7 +1792,7 @@ The effect of the `mitre_limit` parameter is shown below.
|
|
|
1770
1792
|
|
|
1771
1793
|
.. plot:: code/parallel_offset_mitre.py
|
|
1772
1794
|
|
|
1773
|
-
Figure
|
|
1795
|
+
Figure 14. Large and small mitre_limit values for left and right offsets.
|
|
1774
1796
|
|
|
1775
1797
|
.. method:: object.simplify(tolerance, preserve_topology=True)
|
|
1776
1798
|
|
|
@@ -1797,7 +1819,7 @@ Douglas-Peucker algorithm [6]_ is used.
|
|
|
1797
1819
|
|
|
1798
1820
|
.. plot:: code/simplify.py
|
|
1799
1821
|
|
|
1800
|
-
Figure
|
|
1822
|
+
Figure 15. Simplification of a nearly circular polygon using a tolerance of 0.2
|
|
1801
1823
|
(left) and 0.5 (right).
|
|
1802
1824
|
|
|
1803
1825
|
.. note::
|
|
@@ -1925,7 +1947,7 @@ preserved or supported by 3D affine transformations.
|
|
|
1925
1947
|
|
|
1926
1948
|
.. plot:: code/rotate.py
|
|
1927
1949
|
|
|
1928
|
-
Figure
|
|
1950
|
+
Figure 16. Rotation of a `LineString` (gray) by an angle of 90°
|
|
1929
1951
|
counter-clockwise (blue) using different origins.
|
|
1930
1952
|
|
|
1931
1953
|
.. function:: shapely.affinity.scale(geom, xfact=1.0, yfact=1.0, zfact=1.0, origin='center')
|
|
@@ -1967,7 +1989,7 @@ preserved or supported by 3D affine transformations.
|
|
|
1967
1989
|
|
|
1968
1990
|
.. plot:: code/scale.py
|
|
1969
1991
|
|
|
1970
|
-
Figure
|
|
1992
|
+
Figure 17. Scaling of a gray triangle to blue result: a) by a factor of 1.5
|
|
1971
1993
|
along x-direction, with reflection across y-axis; b) by a factor of 2 along
|
|
1972
1994
|
x-direction with custom origin at (1, 1).
|
|
1973
1995
|
|
|
@@ -1999,7 +2021,7 @@ preserved or supported by 3D affine transformations.
|
|
|
1999
2021
|
|
|
2000
2022
|
.. plot:: code/skew.py
|
|
2001
2023
|
|
|
2002
|
-
Figure
|
|
2024
|
+
Figure 18. Skewing of a gray "R" to blue result: a) by a shear angle of 20°
|
|
2003
2025
|
along the x-direction and an origin at (1, 1); b) by a shear angle of 30°
|
|
2004
2026
|
along the y-direction, using default origin.
|
|
2005
2027
|
|
|
@@ -2186,6 +2208,33 @@ using functions in the :mod:`shapely.ops` module.
|
|
|
2186
2208
|
<shapely.geometry.linestring.LineString object at 0x...>,
|
|
2187
2209
|
<shapely.geometry.linestring.LineString object at 0x...>]
|
|
2188
2210
|
|
|
2211
|
+
Efficient Rectangle Clipping
|
|
2212
|
+
----------------------------
|
|
2213
|
+
The :func:`~shapely.ops.clip_by_rect` function in `shapely.ops` returns the
|
|
2214
|
+
portion of a geometry within a rectangle.
|
|
2215
|
+
|
|
2216
|
+
.. function:: shapely.ops.clip_by_rect(geom, xmin, ymin, xmax, ymax)
|
|
2217
|
+
|
|
2218
|
+
The geometry is clipped in a fast but possibly dirty way. The output is
|
|
2219
|
+
not guaranteed to be valid. No exceptions will be raised for topological
|
|
2220
|
+
errors.
|
|
2221
|
+
|
|
2222
|
+
`New in version 1.7.`
|
|
2223
|
+
|
|
2224
|
+
Requires GEOS 3.5.0 or higher
|
|
2225
|
+
|
|
2226
|
+
.. code-block:: python
|
|
2227
|
+
|
|
2228
|
+
>>> from shapely.geometry import Polygon
|
|
2229
|
+
>>> from shapely.ops import clip_by_rect
|
|
2230
|
+
>>> polygon = Polygon(
|
|
2231
|
+
shell=[(0, 0), (0, 30), (30, 30), (30, 0), (0, 0)],
|
|
2232
|
+
holes=[[(10, 10), (20, 10), (20, 20), (10, 20), (10, 10)]],
|
|
2233
|
+
)
|
|
2234
|
+
>>> clipped_polygon = clip_by_rect(polygon, 5, 5, 15, 15)
|
|
2235
|
+
>>> print(clipped_polygon.wkt)
|
|
2236
|
+
POLYGON ((5 5, 5 15, 10 15, 10 10, 15 10, 15 5, 5 5))
|
|
2237
|
+
|
|
2189
2238
|
Efficient Unions
|
|
2190
2239
|
----------------
|
|
2191
2240
|
|
|
@@ -2835,7 +2884,7 @@ Or a simple placemark-type object:
|
|
|
2835
2884
|
|
|
2836
2885
|
.. code-block:: pycon
|
|
2837
2886
|
|
|
2838
|
-
>>> class GeoThing
|
|
2887
|
+
>>> class GeoThing:
|
|
2839
2888
|
... def __init__(self, d):
|
|
2840
2889
|
... self.__geo_interface__ = d
|
|
2841
2890
|
>>> thing = GeoThing({"type": "Point", "coordinates": (0.0, 0.0)})
|
|
@@ -82,7 +82,7 @@ if 'all' in sys.warnoptions:
|
|
|
82
82
|
log.level = logging.DEBUG
|
|
83
83
|
|
|
84
84
|
|
|
85
|
-
class GEOSConfig
|
|
85
|
+
class GEOSConfig:
|
|
86
86
|
"""Interface to config options from the `geos-config` utility
|
|
87
87
|
"""
|
|
88
88
|
|
|
@@ -197,7 +197,6 @@ setup_args = dict(
|
|
|
197
197
|
'License :: OSI Approved :: BSD License',
|
|
198
198
|
'Operating System :: OS Independent',
|
|
199
199
|
'Programming Language :: Python :: 3',
|
|
200
|
-
'Programming Language :: Python :: 3.5',
|
|
201
200
|
'Programming Language :: Python :: 3.6',
|
|
202
201
|
'Programming Language :: Python :: 3.7',
|
|
203
202
|
'Programming Language :: Python :: 3.8',
|
|
@@ -205,7 +204,7 @@ setup_args = dict(
|
|
|
205
204
|
'Topic :: Scientific/Engineering :: GIS',
|
|
206
205
|
],
|
|
207
206
|
cmdclass = {},
|
|
208
|
-
python_requires = '>=3.
|
|
207
|
+
python_requires = '>=3.6',
|
|
209
208
|
extras_require = extra_reqs,
|
|
210
209
|
package_data={
|
|
211
210
|
'shapely': ['shapely/_geos.pxi']},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.8a2"
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""Affine transforms, both in general and specific, named transforms."""
|
|
2
2
|
|
|
3
3
|
from math import sin, cos, tan, pi
|
|
4
|
+
from shapely.errors import GeometryTypeError
|
|
4
5
|
|
|
5
6
|
__all__ = ['affine_transform', 'rotate', 'scale', 'skew', 'translate']
|
|
6
7
|
|
|
@@ -92,7 +93,7 @@ def affine_transform(geom, matrix):
|
|
|
92
93
|
return type(geom)([affine_transform(part, matrix)
|
|
93
94
|
for part in geom.geoms])
|
|
94
95
|
else:
|
|
95
|
-
raise
|
|
96
|
+
raise GeometryTypeError('Type %r not recognized' % geom.type)
|
|
96
97
|
|
|
97
98
|
|
|
98
99
|
def interpret_origin(geom, origin, ndim):
|
|
@@ -3,7 +3,7 @@ from ..geos import TopologicalError
|
|
|
3
3
|
from heapq import heappush, heappop
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
class Cell
|
|
6
|
+
class Cell:
|
|
7
7
|
"""A `Cell`'s centroid property is a potential solution to finding the pole
|
|
8
8
|
of inaccessibility for a given polygon. Rich comparison operators are used
|
|
9
9
|
for sorting `Cell` objects in a priority queue based on the potential
|
|
@@ -11,7 +11,7 @@ from shapely.geos import lgeos
|
|
|
11
11
|
from shapely.topology import Validating
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
class CoordinateSequence
|
|
14
|
+
class CoordinateSequence:
|
|
15
15
|
"""
|
|
16
16
|
Iterative access to coordinate tuples from the parent geometry's coordinate
|
|
17
17
|
sequence.
|
|
@@ -41,15 +41,22 @@ class CoordinateSequence(object):
|
|
|
41
41
|
self.__p__ = parent
|
|
42
42
|
|
|
43
43
|
def _update(self):
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
if self.__p__.is_empty:
|
|
45
|
+
self._ndim = None
|
|
46
|
+
self._cseq = None
|
|
47
|
+
else:
|
|
48
|
+
self._ndim = self.__p__._ndim
|
|
49
|
+
self._cseq = lgeos.GEOSGeom_getCoordSeq(self.__p__._geom)
|
|
46
50
|
|
|
47
51
|
def __len__(self):
|
|
48
52
|
self._update()
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
if self._cseq is None:
|
|
54
|
+
return 0
|
|
55
|
+
else:
|
|
56
|
+
cs_len = c_uint(0)
|
|
57
|
+
if self._cseq:
|
|
58
|
+
lgeos.GEOSCoordSeq_getSize(self._cseq, byref(cs_len))
|
|
59
|
+
return cs_len.value
|
|
53
60
|
|
|
54
61
|
def __iter__(self):
|
|
55
62
|
self._update()
|
|
@@ -74,7 +81,7 @@ class CoordinateSequence(object):
|
|
|
74
81
|
m = self.__len__()
|
|
75
82
|
has_z = self._ndim == 3
|
|
76
83
|
if isinstance(key, int):
|
|
77
|
-
if key + m < 0 or key >= m:
|
|
84
|
+
if self._cseq is None or key + m < 0 or key >= m:
|
|
78
85
|
raise IndexError("index out of range")
|
|
79
86
|
if key < 0:
|
|
80
87
|
i = m + key
|
|
@@ -88,17 +95,20 @@ class CoordinateSequence(object):
|
|
|
88
95
|
else:
|
|
89
96
|
return (dx.value, dy.value)
|
|
90
97
|
elif isinstance(key, slice):
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
lgeos.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
98
|
+
if self._cseq is None:
|
|
99
|
+
return []
|
|
100
|
+
else:
|
|
101
|
+
res = []
|
|
102
|
+
start, stop, stride = key.indices(m)
|
|
103
|
+
for i in range(start, stop, stride):
|
|
104
|
+
lgeos.GEOSCoordSeq_getX(self._cseq, i, byref(dx))
|
|
105
|
+
lgeos.GEOSCoordSeq_getY(self._cseq, i, byref(dy))
|
|
106
|
+
if has_z:
|
|
107
|
+
lgeos.GEOSCoordSeq_getZ(self._cseq, i, byref(dz))
|
|
108
|
+
res.append((dx.value, dy.value, dz.value))
|
|
109
|
+
else:
|
|
110
|
+
res.append((dx.value, dy.value))
|
|
111
|
+
return res
|
|
102
112
|
else:
|
|
103
113
|
raise TypeError("key must be an index or slice")
|
|
104
114
|
|