|
8 | 8 | from typing_extensions import TypeAlias |
9 | 9 |
|
10 | 10 | if TYPE_CHECKING: |
| 11 | + import geopandas as gpd |
11 | 12 | import pandas as pd |
12 | 13 |
|
13 | 14 | PandasDataFrame: TypeAlias = pd.DataFrame |
14 | | - DataFrame: TypeAlias = PandasDataFrame |
| 15 | + GeoPandasGeoDataFrame: TypeAlias = gpd.GeoDataFrame |
| 16 | + DataFrame: TypeAlias = PandasDataFrame | GeoPandasGeoDataFrame |
15 | 17 |
|
16 | 18 |
|
17 | 19 | class AbstractPandasFrame(AbstractBackend): |
18 | 20 | _backends = [("pandas", "DataFrame")] |
19 | 21 |
|
20 | 22 |
|
21 | | -AbstractDF: TypeAlias = AbstractPandasFrame |
| 23 | +class AbstractGeoPandasFrame(AbstractPandasFrame): |
| 24 | + _backends = [("geopandas", "GeoDataFrame")] |
| 25 | + |
| 26 | + |
| 27 | +AbstractDF: TypeAlias = AbstractPandasFrame | AbstractGeoPandasFrame |
22 | 28 |
|
23 | 29 |
|
24 | 30 | class Adaptor: |
@@ -142,12 +148,29 @@ def write_feather(self, file: str) -> None: |
142 | 148 | self._d.to_feather(file) |
143 | 149 |
|
144 | 150 |
|
| 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 | + |
145 | 166 | @overload |
146 | 167 | def create_adaptor(obj: DataFrame) -> DFAdaptor: ... |
147 | 168 | @overload |
148 | 169 | def create_adaptor(obj: Any) -> Adaptor: ... |
149 | 170 | 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): |
151 | 174 | return PandasAdaptor(obj) |
152 | 175 | elif isinstance(obj, Adaptor): |
153 | 176 | return obj |
|
0 commit comments