Ejemplo n.º 1
0
 def serialize(cls, obj: Point, binary_buffer: BinaryBuffer):
     if isinstance(obj, Point):
         add_shape_geometry_metadata(GeomEnum.point.value, binary_buffer)
         binary_buffer.put_double(obj.x)
         binary_buffer.put_double(obj.y)
         binary_buffer.put_int(-2130640127)
     else:
         raise TypeError(f"Need a {cls.name} instance")
     return binary_buffer.byte_array
Ejemplo n.º 2
0
def add_offsets_to_polygon(geom: Polygon, binary_buffer: BinaryBuffer, initial_offset: int) -> int:
    offset = initial_offset
    num_rings = get_number_of_rings(geom)
    binary_buffer.put_int(offset)
    offset += geom.exterior.coords.__len__()
    for _ in range(num_rings - 1):
        binary_buffer.put_int(offset)
        offset = offset + geom.interiors[_].coords.__len__()

    return offset
Ejemplo n.º 3
0
    def serialize(cls, obj: MultiPolygon, binary_buffer: BinaryBuffer):
        if isinstance(obj, MultiPolygon):
            num_polygons = len(obj.geoms)
            num_points = sum([
                get_number_of_polygon_points(polygon) for polygon in obj.geoms
            ])
            num_rings = sum(
                [get_number_of_rings(polygon) for polygon in obj.geoms])

            add_shape_geometry_metadata(GeomEnum.polygon.value, binary_buffer)
            binary_buffer.add_empty_bytes("double", 4)
            binary_buffer.put_int(num_rings)
            binary_buffer.put_int(num_points)

            offset = 0
            for geom in obj.geoms:
                offset = add_offsets_to_polygon(geom, binary_buffer, offset)

            for geom in obj.geoms:
                coordinates_exterior = reverse_linear_ring(
                    geom.exterior, False)
                put_coordinates(coordinates_exterior, binary_buffer)

                for ring in geom.interiors:
                    coordinates = reverse_linear_ring(ring)
                    put_coordinates(coordinates, binary_buffer)

            binary_buffer.put_int(-2130640127)
        else:
            raise TypeError(f"Need a {cls.name} instance")
        return binary_buffer.byte_array
Ejemplo n.º 4
0
    def serialize(cls, obj: Polygon, binary_buffer: BinaryBuffer):
        if isinstance(obj, Polygon):
            add_shape_geometry_metadata(GeomEnum.polygon.value, binary_buffer)

            num_rings = get_number_of_rings(obj)

            num_points = get_number_of_polygon_points(obj)

            binary_buffer.add_empty_bytes("double", 4)

            binary_buffer.put_int(num_rings)
            binary_buffer.put_int(num_points)

            add_offsets_to_polygon(obj, binary_buffer, 0)

            coordinates_exterior = reverse_linear_ring(obj.exterior, False)
            put_coordinates(coordinates_exterior, binary_buffer)

            for ring in obj.interiors:
                coordinates = reverse_linear_ring(ring)
                put_coordinates(coordinates, binary_buffer)

            binary_buffer.put_int(-2130640127)

        else:
            raise TypeError(f"Need a {cls.name} instance")
        return binary_buffer.byte_array
Ejemplo n.º 5
0
    def serialize(cls, obj: LineString, binary_buffer: BinaryBuffer):
        if isinstance(obj, LineString):
            add_shape_geometry_metadata(GeomEnum.polyline.value, binary_buffer)
            binary_buffer.add_empty_bytes("double", 4)
            num_points = obj.coords.__len__()
            binary_buffer.put_int(1)
            binary_buffer.put_int(num_points)
            binary_buffer.put_int(0)

            put_coordinates(obj.coords, binary_buffer)

            binary_buffer.put_int(-2130640127)
        else:
            raise TypeError(f"Need a {cls.name} instance")
        return binary_buffer.byte_array
Ejemplo n.º 6
0
    def to_bytes(cls, geom: BaseGeometry) -> List[int]:
        geom_name = str(geom.__class__.__name__).lower()

        try:
            appr_parser = cls.parsers[geom_name]
        except KeyError:
            raise KeyError(f"Parser for geometry {geom_name}")
        return appr_parser.serialize(geom, BinaryBuffer())
Ejemplo n.º 7
0
    def to_bytes(cls, geom: BaseGeometry) -> List[int]:
        from geo_pyspark.sql.types import GeometryType
        geom_name = str(geom.__class__.__name__).lower()

        try:
            appr_parser = PARSERS[geom_name]
            geom.__UDT__ = GeometryType()
        except KeyError:
            raise KeyError(f"Parser for geometry {geom_name} is not available")
        return appr_parser.serialize(geom, BinaryBuffer())
Ejemplo n.º 8
0
 def serialize(cls, obj: MultiPoint, binary_buffer: BinaryBuffer):
     if isinstance(obj, MultiPoint):
         add_shape_geometry_metadata(GeomEnum.multipoint.value, binary_buffer)
         binary_buffer.add_empty_bytes("double", 4)
         binary_buffer.put_int(len(obj.geoms))
         for point in obj.geoms:
             binary_buffer.put_double(point.x)
             binary_buffer.put_double(point.y)
         binary_buffer.put_byte(-127)
     else:
         raise TypeError(f"Need a {cls.name} instance")
     return binary_buffer.byte_array
Ejemplo n.º 9
0
 def to_bytes(self):
     from geo_pyspark.utils.binary_parser import BinaryBuffer
     bin_buffer = BinaryBuffer()
     bin_buffer.put_double(self.minx)
     bin_buffer.put_double(self.maxx)
     bin_buffer.put_double(self.miny)
     bin_buffer.put_double(self.maxy)
     return bin_buffer.byte_array
Ejemplo n.º 10
0
    def serialize(cls, obj: MultiLineString, binary_buffer: BinaryBuffer):
        if isinstance(obj, MultiLineString):
            add_shape_geometry_metadata(GeomEnum.polyline.value, binary_buffer)
            binary_buffer.add_empty_bytes("double", 4)

            num_parts = len(obj.geoms)
            num_points = sum([len(el.coords) for el in obj.geoms])

            binary_buffer.put_int(num_parts)
            binary_buffer.put_int(num_points)

            offset = 0
            for _ in range(num_parts):
                binary_buffer.put_int(offset)
                offset = offset + obj.geoms[_].coords.__len__()

            for geom in obj.geoms:
                put_coordinates(geom.coords, binary_buffer)

            binary_buffer.put_int(-2130640127)
        else:
            raise TypeError(f"Need a {cls.name} instance")
        return binary_buffer.byte_array
Ejemplo n.º 11
0
def add_shape_geometry_metadata(geom_type: int, binary_buffer: BinaryBuffer):
    binary_buffer.put_byte(ShapeEnum.shape.value)
    binary_buffer.put_byte(geom_type)
Ejemplo n.º 12
0
def put_coordinates(coordinates: Iterable[Iterable[numeric]],
                    binary_buffer: BinaryBuffer):
    for coordinate in coordinates:
        binary_buffer.put_double(Point(coordinate).x)
        binary_buffer.put_double(Point(coordinate).y)