diff --git a/geopandas/geodataframe.py b/geopandas/geodataframe.py index 7380f63..e4b8bc9 100644 --- a/geopandas/geodataframe.py +++ b/geopandas/geodataframe.py @@ -11,7 +11,7 @@ import fiona import numpy as np from pandas import DataFrame, Series from shapely.geometry import mapping - +from shapely.geometry.base import BaseGeometry from geopandas import GeoSeries from geopandas.plotting import plot_dataframe import geopandas.io @@ -114,7 +114,7 @@ class GeoDataFrame(DataFrame): elif isinstance(col, (list, np.ndarray)): level = col elif hasattr(col, 'ndim') and col.ndim != 1: - raise ValueError("Must pass array with one dimension only") + raise ValueError("Must pass array with one dimension only.") else: try: level = frame[col].values @@ -132,10 +132,13 @@ class GeoDataFrame(DataFrame): del frame[to_remove] if isinstance(level, GeoSeries) and level.crs != crs: - # avoids caching issues/crs sharing issues + # Avoids caching issues/crs sharing issues level = level.copy() level.crs = crs + # Check that we are using a listlike of geometries + if not all(isinstance(item, BaseGeometry) for item in level): + raise TypeError("Input geometry column must contain valid geometry objects.") frame[geo_column_name] = level frame._geometry_column_name = geo_column_name frame.crs = crs diff --git a/tests/test_geodataframe.py b/tests/test_geodataframe.py index 320431b..0452ca6 100644 --- a/tests/test_geodataframe.py +++ b/tests/test_geodataframe.py @@ -112,7 +112,17 @@ class TestDataFrame(unittest.TestCase): df = self.df.copy() df.geometry = 'apple' +<<<<<<< HEAD with self.assertRaises(KeyError): +======= + # non-geometry error + def _should_raise_value_error_with_non_geo(): + df = self.df.copy() + df.geometry = range(df.shape[0]) + self.assertRaises(TypeError, _should_raise_value_error_with_non_geo) + + def _should_raise_key_error(): +>>>>>>> BUG: Check that set_geometry will set valid geometry column df = self.df.copy() del df['geometry'] df['geometry']