def to_json(self): packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._exterior, flip_row_col_order=True), INTERIOR: [points_to_row_col_list(i, flip_row_col_order=True) for i in self._interior] } } return packed_obj
def to_json(self): ''' The function from_json convert VectorGeometry class object to json format :return: VectorGeometry class object in json format ''' packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._exterior, flip_row_col_order=True), INTERIOR: [points_to_row_col_list(i, flip_row_col_order=True) for i in self._interior] }, GEOMETRY_SHAPE: self.geometry_name(), GEOMETRY_TYPE: self.geometry_name(), } self._add_creation_info(packed_obj) return packed_obj
def crop(self, rect): try: clipping_window_shpl = ShapelyPolygon( points_to_row_col_list(rect.corners)) self_shpl = ShapelyPolygon(self.exterior_np, holes=self.interior_np) intersections_shpl = self_shpl.buffer(0).intersection( clipping_window_shpl) mapping_shpl = mapping(intersections_shpl) except Exception: logger.warn('Polygon cropping exception, shapely.', exc_info=False) raise intersections = shapely_figure_to_coords_list(mapping_shpl) # Check for bad cropping cases (e.g. empty points list) out_polygons = [] for intersection in intersections: if isinstance(intersection, list) and len(intersection) > 0 and len( intersection[0]) >= 3: exterior = row_col_list_to_points(intersection[0], do_round=True) interiors = [] for interior_contour in intersection[1:]: if len(interior_contour) > 2: interiors.append( row_col_list_to_points(interior_contour, do_round=True)) out_polygons.append(Polygon(exterior, interiors)) return out_polygons
def _transform(self, transform_fn): transformed_corners = [transform_fn(p) for p in self.corners] rows, cols = zip(*points_to_row_col_list(transformed_corners)) return Rectangle(top=round(min(rows)), left=round(min(cols)), bottom=round(max(rows)), right=round(max(cols)))
def to_json(self): packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._exterior, flip_row_col_order=True), INTERIOR: [ points_to_row_col_list(i, flip_row_col_order=True) for i in self._interior ] }, GEOMETRY_SHAPE: self.geometry_name(), GEOMETRY_TYPE: self.geometry_name(), } self._add_creation_info(packed_obj) return packed_obj
def to_json(self): packed_obj = { POINTS: points_to_row_col_list(self._points, flip_row_col_order=True), FACES: [face.to_json() for face in self._faces] } return packed_obj
def to_json(self): packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._points, flip_row_col_order=True), INTERIOR: [] } } return packed_obj
def to_json(self): packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._points, flip_row_col_order=True), INTERIOR: [] } } self._add_creation_info(packed_obj) return packed_obj
def to_json(self): ''' The function to_json convert Cuboid class object to json format :return: Cuboid in json format ''' packed_obj = { POINTS: points_to_row_col_list(self._points, flip_row_col_order=True), FACES: [face.to_json() for face in self._faces] } self._add_creation_info(packed_obj) return packed_obj
def to_json(self): ''' The function to_json convert Rectangle class object to json format :return: Rectangle in json format ''' packed_obj = { POINTS: { EXTERIOR: points_to_row_col_list(self._points, flip_row_col_order=True), INTERIOR: [] } } self._add_creation_info(packed_obj) return packed_obj
def crop(self, rect): ''' Crop the current Polygon with a given rectangle, if polygon cat't be cropped it generate exception error :param rect: Rectangle class object :return: list of Poligon class objects ''' from supervisely_lib.geometry.point_location import PointLocation try: points = [ PointLocation(row=rect.top, col=rect.left), PointLocation(row=rect.top, col=rect.right + 1), PointLocation(row=rect.bottom + 1, col=rect.right + 1), PointLocation(row=rect.bottom + 1, col=rect.left) ] #points = rect.corners # old implementation with 1 pixel error (right bottom) #@TODO: investigate here (critical issue) clipping_window_shpl = ShapelyPolygon( points_to_row_col_list(points)) self_shpl = ShapelyPolygon(self.exterior_np, holes=self.interior_np) intersections_shpl = self_shpl.buffer(0).intersection( clipping_window_shpl) mapping_shpl = mapping(intersections_shpl) except Exception: logger.warn('Polygon cropping exception, shapely.', exc_info=True) # raise # if polygon is invalid, just print warning and skip it # @TODO: need more investigation here return [] intersections = shapely_figure_to_coords_list(mapping_shpl) # Check for bad cropping cases (e.g. empty points list) out_polygons = [] for intersection in intersections: if isinstance(intersection, list) and len(intersection) > 0 and len( intersection[0]) >= 3: exterior = row_col_list_to_points(intersection[0], do_round=True) interiors = [] for interior_contour in intersection[1:]: if len(interior_contour) > 2: interiors.append( row_col_list_to_points(interior_contour, do_round=True)) out_polygons.append(Polygon(exterior, interiors)) return out_polygons
def interior_np(self): return [ np.array(points_to_row_col_list(i), dtype=np.int64) for i in self._interior ]
def exterior_np(self): return np.array(points_to_row_col_list(self._exterior), dtype=np.int64)
def exterior_np(self): ''' The function exterior_np convert exterior attribute(list of PointLocation objects) to numpy array :return: numpy array ''' return np.array(points_to_row_col_list(self._exterior), dtype=np.int64)
def interior_np(self): ''' The function interior_np convert interior attribute(list of PointLocation objects) to numpy array :return: numpy array ''' return [np.array(points_to_row_col_list(i), dtype=np.int64) for i in self._interior]
def _contours_list(self): return [ points_to_row_col_list( [self._points[idx] for idx in face.tolist()], flip_row_col_order=True) for face in self._faces ]
def assertPolyEquals(self, poly, exterior, interiors): self.assertIsInstance(poly, Polygon) self.assertCountEqual(points_to_row_col_list(poly.exterior, flip_row_col_order=True), exterior) self.assertEqual(len(poly.interior), len(interiors)) for p_interior, interior in zip(poly.interior, interiors): self.assertCountEqual(points_to_row_col_list(p_interior, flip_row_col_order=True), interior)