New upstream version 0.10.1
Bas Couwenberg
2 years ago
0 | 0 | Changelog |
1 | 1 | ========= |
2 | ||
3 | Version 0.10.1 (October 8, 2021) | |
4 | -------------------------------- | |
5 | ||
6 | Small bug-fix release: | |
7 | ||
8 | - Fix regression in `overlay()` with non-overlapping geometries and a | |
9 | non-default `how` (.e. not "intersection") (#2157). | |
10 | ||
2 | 11 | |
3 | 12 | Version 0.10.0 (October 3, 2021) |
4 | 13 | -------------------------------- |
21 | 21 | # setup.py/versioneer.py will grep for the variable names, so they must |
22 | 22 | # each be defined on a line of their own. _version.py will just call |
23 | 23 | # get_keywords(). |
24 | git_refnames = " (HEAD -> master, tag: v0.10.0)" | |
25 | git_full = "0be92da324d6a83d2a65904cde5c983c433a1584" | |
24 | git_refnames = " (HEAD -> master, tag: v0.10.1)" | |
25 | git_full = "f9e168181de34d3fdb6ea753a7b6d8467369da38" | |
26 | 26 | keywords = {"refnames": git_refnames, "full": git_full} |
27 | 27 | return keywords |
28 | 28 |
0 | 0 | import os |
1 | 1 | from distutils.version import LooseVersion |
2 | 2 | |
3 | import numpy as np | |
3 | 4 | import pandas as pd |
4 | 5 | |
5 | 6 | from shapely.geometry import Point, Polygon, LineString, GeometryCollection, box |
373 | 374 | df3 = GeoDataFrame({"geometry": polys3, "col3": [1, 2]}) |
374 | 375 | expected = GeoDataFrame([], columns=["col1", "col3", "geometry"]) |
375 | 376 | result = overlay(df1, df3) |
376 | assert_geodataframe_equal(result, expected, check_like=True) | |
377 | assert_geodataframe_equal(result, expected, check_dtype=False) | |
377 | 378 | |
378 | 379 | |
379 | 380 | def test_correct_index(dfs): |
655 | 656 | |
656 | 657 | result = geopandas.overlay(nybb, nybb2) |
657 | 658 | |
658 | assert all(result.columns.isin(nybb.columns)) | |
659 | assert len(result.columns) == len(nybb.columns) | |
659 | expected = GeoDataFrame( | |
660 | columns=[ | |
661 | "BoroCode_1", | |
662 | "BoroName_1", | |
663 | "Shape_Leng_1", | |
664 | "Shape_Area_1", | |
665 | "BoroCode_2", | |
666 | "BoroName_2", | |
667 | "Shape_Leng_2", | |
668 | "Shape_Area_2", | |
669 | "geometry", | |
670 | ], | |
671 | crs=nybb.crs, | |
672 | ) | |
673 | assert_geodataframe_equal(result, expected, check_dtype=False) | |
674 | ||
675 | ||
676 | def test_non_overlapping(how): | |
677 | p1 = Polygon([(0, 0), (2, 0), (2, 2), (0, 2)]) | |
678 | p2 = Polygon([(3, 3), (5, 3), (5, 5), (3, 5)]) | |
679 | df1 = GeoDataFrame({"col1": [1], "geometry": [p1]}) | |
680 | df2 = GeoDataFrame({"col2": [2], "geometry": [p2]}) | |
681 | result = overlay(df1, df2, how=how) | |
682 | ||
683 | if how == "intersection": | |
684 | expected = GeoDataFrame( | |
685 | { | |
686 | "col1": np.array([], dtype="int64"), | |
687 | "col2": np.array([], dtype="int64"), | |
688 | "geometry": [], | |
689 | }, | |
690 | index=pd.Index([], dtype="object"), | |
691 | ) | |
692 | elif how == "union": | |
693 | expected = GeoDataFrame( | |
694 | { | |
695 | "col1": [1, np.nan], | |
696 | "col2": [np.nan, 2], | |
697 | "geometry": [p1, p2], | |
698 | } | |
699 | ) | |
700 | elif how == "identity": | |
701 | expected = GeoDataFrame( | |
702 | { | |
703 | "col1": [1.0], | |
704 | "col2": [np.nan], | |
705 | "geometry": [p1], | |
706 | } | |
707 | ) | |
708 | elif how == "symmetric_difference": | |
709 | expected = GeoDataFrame( | |
710 | { | |
711 | "col1": [1, np.nan], | |
712 | "col2": [np.nan, 2], | |
713 | "geometry": [p1, p2], | |
714 | } | |
715 | ) | |
716 | elif how == "difference": | |
717 | expected = GeoDataFrame( | |
718 | { | |
719 | "col1": [1], | |
720 | "geometry": [p1], | |
721 | } | |
722 | ) | |
723 | ||
724 | assert_geodataframe_equal(result, expected) |
58 | 58 | |
59 | 59 | return GeoDataFrame(dfinter, geometry=geom_intersect, crs=df1.crs) |
60 | 60 | else: |
61 | return GeoDataFrame( | |
62 | [], | |
63 | columns=list(set(df1.columns).union(df2.columns)) + ["__idx1", "__idx2"], | |
64 | crs=df1.crs, | |
65 | ) | |
61 | result = df1.iloc[:0].merge( | |
62 | df2.iloc[:0].drop(df2.geometry.name, axis=1), | |
63 | left_index=True, | |
64 | right_index=True, | |
65 | suffixes=("_1", "_2"), | |
66 | ) | |
67 | return result[ | |
68 | result.columns.drop(df1.geometry.name).tolist() + [df1.geometry.name] | |
69 | ] | |
66 | 70 | |
67 | 71 | |
68 | 72 | def _overlay_difference(df1, df2): |
264 | 268 | "df{} contains mixed geometry types.".format(i + 1) |
265 | 269 | ) |
266 | 270 | |
267 | box_gdf1 = df1.total_bounds | |
268 | box_gdf2 = df2.total_bounds | |
269 | ||
270 | if not ( | |
271 | ((box_gdf1[0] <= box_gdf2[2]) and (box_gdf2[0] <= box_gdf1[2])) | |
272 | and ((box_gdf1[1] <= box_gdf2[3]) and (box_gdf2[1] <= box_gdf1[3])) | |
273 | ): | |
274 | return GeoDataFrame( | |
275 | [], | |
276 | columns=list( | |
277 | set( | |
278 | df1.drop(df1.geometry.name, axis=1).columns.to_list() | |
279 | + df2.drop(df2.geometry.name, axis=1).columns.to_list() | |
280 | ) | |
271 | if how == "intersection": | |
272 | box_gdf1 = df1.total_bounds | |
273 | box_gdf2 = df2.total_bounds | |
274 | ||
275 | if not ( | |
276 | ((box_gdf1[0] <= box_gdf2[2]) and (box_gdf2[0] <= box_gdf1[2])) | |
277 | and ((box_gdf1[1] <= box_gdf2[3]) and (box_gdf2[1] <= box_gdf1[3])) | |
278 | ): | |
279 | result = df1.iloc[:0].merge( | |
280 | df2.iloc[:0].drop(df2.geometry.name, axis=1), | |
281 | left_index=True, | |
282 | right_index=True, | |
283 | suffixes=("_1", "_2"), | |
281 | 284 | ) |
282 | + ["geometry"], | |
283 | ) | |
285 | return result[ | |
286 | result.columns.drop(df1.geometry.name).tolist() + [df1.geometry.name] | |
287 | ] | |
284 | 288 | |
285 | 289 | # Computations |
286 | 290 | def _make_valid(df): |