earthengine-api/python/ee/table_converter.py
Google Earth Engine Authors 8fee1d9e26 v0.1.386
PiperOrigin-RevId: 597577360
2024-01-18 18:09:09 +00:00

68 lines
2.0 KiB
Python

"""Converters used in the table data fetching methods."""
from typing import Any, Dict, Iterator, List, Optional, Type, Union
class TableConverter:
"""Base class for table data converters."""
def do_conversion(self, features: Iterator[Any]) -> Any:
raise NotImplementedError()
class PandasConverter(TableConverter):
"""Converter from a feature generator to a `pandas.DataFrame`."""
def do_conversion(self, features: Iterator[Any]) -> Any:
try:
import pandas # pylint: disable=g-import-not-at-top
except ImportError as exc:
raise ImportError(
'Using format PANDAS_DATAFRAME requires pandas.'
) from exc
return pandas.DataFrame.from_records(self._convert_to_records(features))
def _convert_to_records(
self, features: Iterator[Any]
) -> Iterator[Dict[str, Any]]:
for feature in features:
yield {
'geo': feature.get('geometry'),
**(feature.get('properties', {}) or {}),
}
class GeoPandasConverter(TableConverter):
"""Converter from a feature generator to a `geopandas.GeoDataFrame`."""
def do_conversion(self, features: Iterator[Any]) -> Any:
try:
import geopandas # pylint: disable=g-import-not-at-top
except ImportError as exc:
raise ImportError(
'Using format GEOPANDAS_GEODATAFRAME requires geopandas.'
) from exc
return geopandas.GeoDataFrame.from_features(
self._materialize_features(features)
)
def _materialize_features(self, features: Iterator[Any]) -> List[Any]:
"""Materializes the features, making several requests if necessary."""
return list(features)
_TABLE_DATA_CONVERTERS: Dict[str, Type[TableConverter]] = {
'PANDAS_DATAFRAME': PandasConverter,
'GEOPANDAS_GEODATAFRAME': GeoPandasConverter,
}
def from_file_format(
file_format: Union[str, TableConverter]
) -> Optional[TableConverter]:
if isinstance(file_format, TableConverter):
return file_format
if file_format in _TABLE_DATA_CONVERTERS:
return _TABLE_DATA_CONVERTERS[file_format.upper()]()
return None