[Git][debian-gis-team/python-geopandas][upstream] New upstream version 0.10.1

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Fri Oct 8 14:23:44 BST 2021



Bas Couwenberg pushed to branch upstream at Debian GIS Project / python-geopandas


Commits:
a387ebf0 by Bas Couwenberg at 2021-10-08T15:13:29+02:00
New upstream version 0.10.1
- - - - -


4 changed files:

- CHANGELOG.md
- geopandas/_version.py
- geopandas/tests/test_overlay.py
- geopandas/tools/overlay.py


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -1,6 +1,15 @@
 Changelog
 =========
 
+Version 0.10.1 (October 8, 2021)
+--------------------------------
+
+Small bug-fix release:
+
+- Fix regression in `overlay()` with non-overlapping geometries and a
+  non-default `how` (.e. not "intersection") (#2157).
+
+
 Version 0.10.0 (October 3, 2021)
 --------------------------------
 


=====================================
geopandas/_version.py
=====================================
@@ -22,8 +22,8 @@ def get_keywords():
     # setup.py/versioneer.py will grep for the variable names, so they must
     # each be defined on a line of their own. _version.py will just call
     # get_keywords().
-    git_refnames = " (HEAD -> master, tag: v0.10.0)"
-    git_full = "0be92da324d6a83d2a65904cde5c983c433a1584"
+    git_refnames = " (HEAD -> master, tag: v0.10.1)"
+    git_full = "f9e168181de34d3fdb6ea753a7b6d8467369da38"
     keywords = {"refnames": git_refnames, "full": git_full}
     return keywords
 


=====================================
geopandas/tests/test_overlay.py
=====================================
@@ -1,6 +1,7 @@
 import os
 from distutils.version import LooseVersion
 
+import numpy as np
 import pandas as pd
 
 from shapely.geometry import Point, Polygon, LineString, GeometryCollection, box
@@ -374,7 +375,7 @@ def test_empty_intersection(dfs):
     df3 = GeoDataFrame({"geometry": polys3, "col3": [1, 2]})
     expected = GeoDataFrame([], columns=["col1", "col3", "geometry"])
     result = overlay(df1, df3)
-    assert_geodataframe_equal(result, expected, check_like=True)
+    assert_geodataframe_equal(result, expected, check_dtype=False)
 
 
 def test_correct_index(dfs):
@@ -656,5 +657,69 @@ def test_empty_overlay_return_non_duplicated_columns():
 
     result = geopandas.overlay(nybb, nybb2)
 
-    assert all(result.columns.isin(nybb.columns))
-    assert len(result.columns) == len(nybb.columns)
+    expected = GeoDataFrame(
+        columns=[
+            "BoroCode_1",
+            "BoroName_1",
+            "Shape_Leng_1",
+            "Shape_Area_1",
+            "BoroCode_2",
+            "BoroName_2",
+            "Shape_Leng_2",
+            "Shape_Area_2",
+            "geometry",
+        ],
+        crs=nybb.crs,
+    )
+    assert_geodataframe_equal(result, expected, check_dtype=False)
+
+
+def test_non_overlapping(how):
+    p1 = Polygon([(0, 0), (2, 0), (2, 2), (0, 2)])
+    p2 = Polygon([(3, 3), (5, 3), (5, 5), (3, 5)])
+    df1 = GeoDataFrame({"col1": [1], "geometry": [p1]})
+    df2 = GeoDataFrame({"col2": [2], "geometry": [p2]})
+    result = overlay(df1, df2, how=how)
+
+    if how == "intersection":
+        expected = GeoDataFrame(
+            {
+                "col1": np.array([], dtype="int64"),
+                "col2": np.array([], dtype="int64"),
+                "geometry": [],
+            },
+            index=pd.Index([], dtype="object"),
+        )
+    elif how == "union":
+        expected = GeoDataFrame(
+            {
+                "col1": [1, np.nan],
+                "col2": [np.nan, 2],
+                "geometry": [p1, p2],
+            }
+        )
+    elif how == "identity":
+        expected = GeoDataFrame(
+            {
+                "col1": [1.0],
+                "col2": [np.nan],
+                "geometry": [p1],
+            }
+        )
+    elif how == "symmetric_difference":
+        expected = GeoDataFrame(
+            {
+                "col1": [1, np.nan],
+                "col2": [np.nan, 2],
+                "geometry": [p1, p2],
+            }
+        )
+    elif how == "difference":
+        expected = GeoDataFrame(
+            {
+                "col1": [1],
+                "geometry": [p1],
+            }
+        )
+
+    assert_geodataframe_equal(result, expected)


=====================================
geopandas/tools/overlay.py
=====================================
@@ -59,11 +59,15 @@ def _overlay_intersection(df1, df2):
 
         return GeoDataFrame(dfinter, geometry=geom_intersect, crs=df1.crs)
     else:
-        return GeoDataFrame(
-            [],
-            columns=list(set(df1.columns).union(df2.columns)) + ["__idx1", "__idx2"],
-            crs=df1.crs,
+        result = df1.iloc[:0].merge(
+            df2.iloc[:0].drop(df2.geometry.name, axis=1),
+            left_index=True,
+            right_index=True,
+            suffixes=("_1", "_2"),
         )
+        return result[
+            result.columns.drop(df1.geometry.name).tolist() + [df1.geometry.name]
+        ]
 
 
 def _overlay_difference(df1, df2):
@@ -265,23 +269,23 @@ def overlay(df1, df2, how="intersection", keep_geom_type=None, make_valid=True):
                 "df{} contains mixed geometry types.".format(i + 1)
             )
 
-    box_gdf1 = df1.total_bounds
-    box_gdf2 = df2.total_bounds
-
-    if not (
-        ((box_gdf1[0] <= box_gdf2[2]) and (box_gdf2[0] <= box_gdf1[2]))
-        and ((box_gdf1[1] <= box_gdf2[3]) and (box_gdf2[1] <= box_gdf1[3]))
-    ):
-        return GeoDataFrame(
-            [],
-            columns=list(
-                set(
-                    df1.drop(df1.geometry.name, axis=1).columns.to_list()
-                    + df2.drop(df2.geometry.name, axis=1).columns.to_list()
-                )
+    if how == "intersection":
+        box_gdf1 = df1.total_bounds
+        box_gdf2 = df2.total_bounds
+
+        if not (
+            ((box_gdf1[0] <= box_gdf2[2]) and (box_gdf2[0] <= box_gdf1[2]))
+            and ((box_gdf1[1] <= box_gdf2[3]) and (box_gdf2[1] <= box_gdf1[3]))
+        ):
+            result = df1.iloc[:0].merge(
+                df2.iloc[:0].drop(df2.geometry.name, axis=1),
+                left_index=True,
+                right_index=True,
+                suffixes=("_1", "_2"),
             )
-            + ["geometry"],
-        )
+            return result[
+                result.columns.drop(df1.geometry.name).tolist() + [df1.geometry.name]
+            ]
 
     # Computations
     def _make_valid(df):



View it on GitLab: https://salsa.debian.org/debian-gis-team/python-geopandas/-/commit/a387ebf024a0ff1ca53452b29c356dc186b6694a

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/python-geopandas/-/commit/a387ebf024a0ff1ca53452b29c356dc186b6694a
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20211008/1def9cde/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list