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
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
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
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
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
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())
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())
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
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
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
def add_shape_geometry_metadata(geom_type: int, binary_buffer: BinaryBuffer): binary_buffer.put_byte(ShapeEnum.shape.value) binary_buffer.put_byte(geom_type)
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)