예제 #1
0
def make_tracks(layer: ogr.Layer, coordinate_transformer) -> OrderedDict:
    tracks = OrderedDict()
    # this (ugly) style of feature iteration is a workaround for:
    # https://github.com/nextgis/pygdal/issues/31
    feature = layer.GetNextFeature()
    while feature is not None:
        track_id = feature.GetField("track_id")
        track = tracks.setdefault(track_id,
                                  Track(track_id, coordinate_transformer))
        segment_data = SegmentsData(
            segment_id=feature.GetField('segment_id'),
            vehicle_type=feature.GetField('vehicle_type'),
            timestamp=dt.datetime.strptime(
                feature.GetField("timestamp"),
                "%Y-%m-%d %H:%M:%S").replace(tzinfo=dt.timezone.utc))
        geom = feature.GetGeometryRef()
        for lon, lat in geom.GetPoints():
            geom = ogr.Geometry(ogr.wkbPoint)
            geom.AddPoint(lon, lat)
            segment_data.add_point(geom)
        track.add_segment(segment_data)
        feature = layer.GetNextFeature()
    for item in tracks.values():
        item.prepare()
    return tracks
예제 #2
0
    def get_geometry_type(self, layer: ogr.Layer) -> str:
        """Get geometry type human readable."""
        try:
            logger.debug(ogr.GeometryTypeToName(layer.GetGeomType()))
            # if layer.GetGeomType():
            #     geom_type = layer.GetGeomType()
            #     layer.ResetReading()
            #     logger.error(geom_type)

            #     return geom_type

            feat = layer.GetNextFeature()
            if not hasattr(feat, "GetGeometryRef"):
                logger.error("Unable to determine GeoMetryRef")
                return None
            layer_geom = feat.GetGeometryRef()
            if hasattr(layer_geom, "GetGeometryName"):
                return layer_geom.GetGeometryName()

        except Exception as err:
            logger.error(
                "Unable to retrieve geometry type for layer: {}. Trace: {}".format(
                    layer.GetName(), err
                )
            )
            return None