Skip to content

Commit 1cd1d51

Browse files
Add GeoPandas adaptor
1 parent 2e31203 commit 1cd1d51

2 files changed

Lines changed: 28 additions & 3 deletions

File tree

pins/_adaptors.py

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,23 @@
88
from typing_extensions import TypeAlias
99

1010
if TYPE_CHECKING:
11+
import geopandas as gpd
1112
import pandas as pd
1213

1314
PandasDataFrame: TypeAlias = pd.DataFrame
14-
DataFrame: TypeAlias = PandasDataFrame
15+
GeoPandasGeoDataFrame: TypeAlias = gpd.GeoDataFrame
16+
DataFrame: TypeAlias = PandasDataFrame | GeoPandasGeoDataFrame
1517

1618

1719
class AbstractPandasFrame(AbstractBackend):
1820
_backends = [("pandas", "DataFrame")]
1921

2022

21-
AbstractDF: TypeAlias = AbstractPandasFrame
23+
class AbstractGeoPandasFrame(AbstractPandasFrame):
24+
_backends = [("geopandas", "GeoDataFrame")]
25+
26+
27+
AbstractDF: TypeAlias = AbstractPandasFrame | AbstractGeoPandasFrame
2228

2329

2430
class Adaptor:
@@ -142,12 +148,29 @@ def write_feather(self, file: str) -> None:
142148
self._d.to_feather(file)
143149

144150

151+
class GeoPandasAdaptor(PandasAdaptor):
152+
_d: ClassVar[GeoPandasGeoDataFrame] # type: ignore[reportIncompatibleVariableOverride]
153+
154+
def __init__(self, data: AbstractGeoPandasFrame) -> None:
155+
super().__init__(data)
156+
157+
@property
158+
def df_type(self) -> str:
159+
# Consider over-riding this for specialized dataframes
160+
return "GeoDataFrame"
161+
162+
def head(self, n: int) -> GeoPandasAdaptor:
163+
return GeoPandasAdaptor(self._d.head(n))
164+
165+
145166
@overload
146167
def create_adaptor(obj: DataFrame) -> DFAdaptor: ...
147168
@overload
148169
def create_adaptor(obj: Any) -> Adaptor: ...
149170
def create_adaptor(obj: Any | DataFrame) -> Adaptor | DFAdaptor:
150-
if isinstance(obj, AbstractPandasFrame):
171+
if isinstance(obj, AbstractGeoPandasFrame):
172+
return GeoPandasAdaptor(obj)
173+
elif isinstance(obj, AbstractPandasFrame):
151174
return PandasAdaptor(obj)
152175
elif isinstance(obj, Adaptor):
153176
return obj

pins/drivers.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@ def save_data(
174174
raise NotImplementedError(msg)
175175
elif pin_type == "parquet":
176176
adaptor.write_parquet(final_name)
177+
elif pin_type == "geoparquet":
178+
adaptor.write_parquet(final_name)
177179
elif pin_type == "joblib":
178180
adaptor.write_joblib(final_name)
179181
elif pin_type == "json":

0 commit comments

Comments
 (0)