Source code for rastervision.core.data.vector_source.geojson_vector_source

from typing import TYPE_CHECKING
import logging

import geopandas as gpd

from rastervision.pipeline.file_system import download_if_needed
from rastervision.core.box import Box
from rastervision.core.data.vector_source.vector_source import VectorSource
from rastervision.core.data.utils import listify_uris, merge_geojsons

if TYPE_CHECKING:
    from rastervision.core.data import CRSTransformer, VectorTransformer

log = logging.getLogger(__name__)


[docs]class GeoJSONVectorSource(VectorSource): """A :class:`.VectorSource` for reading GeoJSON files."""
[docs] def __init__(self, uris: str | list[str], crs_transformer: 'CRSTransformer', vector_transformers: list['VectorTransformer'] = [], bbox: Box | None = None): """Constructor. Args: uris: URI(s) of the GeoJSON file(s). crs_transformer: A ``CRSTransformer`` to convert between map and pixel coords. Normally this is obtained from a :class:`.RasterSource`. vector_transformers: ``VectorTransformers`` for transforming geometries. Defaults to ``[]``. bbox: User-specified crop of the extent. If ``None``, the full extent available in the source file is used. """ self.uris = listify_uris(uris) super().__init__( crs_transformer, vector_transformers=vector_transformers, bbox=bbox)
def _get_geojson(self) -> dict: geojsons = [self._get_geojson_single(uri) for uri in self.uris] geojson = merge_geojsons(geojsons) return geojson def _get_geojson_single(self, uri: str) -> dict: # download first so that it gets cached path = download_if_needed(uri) df: gpd.GeoDataFrame = gpd.read_file(path) df = df.to_crs('epsg:4326') geojson = df.__geo_interface__ return geojson