Codebase list python-geopandas / a387ebf
New upstream version 0.10.1 Bas Couwenberg 2 years ago
4 changed file(s) with 104 addition(s) and 26 deletion(s). Raw diff Collapse all Expand all
00 Changelog
11 =========
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
211
312 Version 0.10.0 (October 3, 2021)
413 --------------------------------
2121 # setup.py/versioneer.py will grep for the variable names, so they must
2222 # each be defined on a line of their own. _version.py will just call
2323 # 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"
2626 keywords = {"refnames": git_refnames, "full": git_full}
2727 return keywords
2828
00 import os
11 from distutils.version import LooseVersion
22
3 import numpy as np
34 import pandas as pd
45
56 from shapely.geometry import Point, Polygon, LineString, GeometryCollection, box
373374 df3 = GeoDataFrame({"geometry": polys3, "col3": [1, 2]})
374375 expected = GeoDataFrame([], columns=["col1", "col3", "geometry"])
375376 result = overlay(df1, df3)
376 assert_geodataframe_equal(result, expected, check_like=True)
377 assert_geodataframe_equal(result, expected, check_dtype=False)
377378
378379
379380 def test_correct_index(dfs):
655656
656657 result = geopandas.overlay(nybb, nybb2)
657658
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)
5858
5959 return GeoDataFrame(dfinter, geometry=geom_intersect, crs=df1.crs)
6060 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 ]
6670
6771
6872 def _overlay_difference(df1, df2):
264268 "df{} contains mixed geometry types.".format(i + 1)
265269 )
266270
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"),
281284 )
282 + ["geometry"],
283 )
285 return result[
286 result.columns.drop(df1.geometry.name).tolist() + [df1.geometry.name]
287 ]
284288
285289 # Computations
286290 def _make_valid(df):