[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