def __make_overview_tiles(self, mbtiles, zoom, start_coords, end_coords): #======================================================================== if zoom > self.__min_zoom: zoom -= 1 log('Tiling zoom level {} for {}'.format(zoom, self.__id)) HALF_SIZE = (TILE_SIZE[0]//2, TILE_SIZE[1]//2) half_start = (start_coords[0]//2, start_coords[1]//2) half_end = (end_coords[0]//2, end_coords[1]//2) progress_bar = ProgressBar(total=(half_end[0]-half_start[0]+1) *(half_end[1]-half_start[1]+1), unit='tiles', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') for x in range(half_start[0], half_end[0] + 1): for y in range(half_start[1], half_end[1] + 1): overview_tile = blank_image(TILE_SIZE) for i in range(2): for j in range(2): try: tile = mbtiles.get_tile(zoom+1, 2*x+i, 2*y+j) half_tile = cv2.resize(tile, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) paste_image(overview_tile, half_tile, (i*HALF_SIZE[0], j*HALF_SIZE[1])) except ExtractionError: pass if not_empty(overview_tile): mbtiles.save_tile_as_png(zoom, x, y, overview_tile) progress_bar.update(1) progress_bar.close() self.__make_overview_tiles(mbtiles, zoom, half_start, half_end)
def __draw_element_list(self, elements, transform, path_list, show_progress=False): #================================================================================== children = list(elements.iter_children()) progress_bar = ProgressBar( show=show_progress, total=len(children), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') for wrapped_element in children: element = wrapped_element.etree_element if element.tag == SVG_NS('use'): element = self.__definitions.use(element) wrapped_element = cssselect2.ElementWrapper.from_xml_root( element) elif element.tag in [ SVG_NS('linearGradient'), SVG_NS('radialGradient') ]: if self.__first_scan: self.__definitions.add_definition(element) continue self.__draw_element(wrapped_element, transform, path_list) progress_bar.update(1) progress_bar.close()
def __process_shape_list(self, shapes, transform, show_progress=False): #====================================================================== progress_bar = ProgressBar(show=show_progress, total=len(shapes), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') features = [] for shape in shapes: properties = {'tile-layer': 'features'} # Passed through to map viewer properties.update(self.source.properties_from_markup(shape.name)) if 'error' in properties: pass elif 'path' in properties: pass elif (shape.shape_type == MSO_SHAPE_TYPE.AUTO_SHAPE or shape.shape_type == MSO_SHAPE_TYPE.FREEFORM or isinstance(shape, pptx.shapes.connector.Connector)): geometry = self.__get_geometry(shape, properties, transform) feature = self.flatmap.new_feature(geometry, properties) features.append(feature) elif shape.shape_type == MSO_SHAPE_TYPE.GROUP: grouped_feature = self.__process_group(shape, properties, transform) if grouped_feature is not None: features.append(grouped_feature) elif (shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX or shape.shape_type == MSO_SHAPE_TYPE.PICTURE): pass else: log.warn('"{}" {} not processed...'.format(shape.name, str(shape.shape_type))) progress_bar.update(1) progress_bar.close() return features
def __draw_element_list(self, elements, parent_transform, parent_style, show_progress=False): #============================================================================================ drawing_objects = [] children = list(elements.iter_children()) progress_bar = ProgressBar(show=show_progress, total=len(children), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') for wrapped_element in children: progress_bar.update(1) element = wrapped_element.etree_element if element.tag is etree.Comment or element.tag is etree.PI: continue if element.tag == SVG_NS('defs'): self.__definitions.add_definitions(element) continue elif element.tag == SVG_NS('use'): element = self.__definitions.use(element) wrapped_element = wrap_element(element) elif element.tag in [SVG_NS('linearGradient'), SVG_NS('radialGradient')]: self.__definitions.add_definition(element) continue if element.tag == SVG_NS('clipPath'): self.__add_clip_path(wrapped_element) else: drawing_objects.extend(self.__draw_element(wrapped_element, parent_transform, parent_style)) progress_bar.close() return drawing_objects
def __save_features(self, features): #=================================== progress_bar = ProgressBar( total=len(features), unit='ftr', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') for feature in features: properties = feature.properties.copy() geometry = feature.geometry area = geometry.area mercator_geometry = mercator_transform(geometry) geojson = { 'type': 'Feature', 'id': feature.feature_id, 'tippecanoe': { 'layer': properties['tile-layer'] }, 'geometry': shapely.geometry.mapping(mercator_geometry), 'properties': { 'bounds': list(mercator_geometry.bounds), # The viewer requires `centroid` 'centroid': list(list(mercator_geometry.centroid.coords)[0]), 'area': area, 'length': geometry.length, 'layer': self.__layer.id, } } if 'maxzoom' in properties: geojson['tippecanoe']['maxzoom'] = properties['maxzoom'] if 'minzoom' in properties: geojson['tippecanoe']['minzoom'] = properties['minzoom'] if area > 0: scale = math.log(math.sqrt(self.__map_area / area), 2) geojson['properties']['scale'] = scale if scale > 6 and 'group' not in properties and 'minzoom' not in properties: geojson['tippecanoe']['minzoom'] = 5 else: geojson['properties']['scale'] = 10 for (key, value) in properties.items(): if not ignore_property(key): geojson['properties'][key] = value properties['bounds'] = geojson['properties']['bounds'] properties['centroid'] = geojson['properties']['centroid'] properties['geometry'] = geojson['geometry']['type'] properties['layer'] = self.__layer.id # The layer's annotation had property details for each feature self.__layer.annotate(feature, properties) self.__geojson_layers[properties['tile-layer']].append(geojson) progress_bar.update(1) progress_bar.close()
def __make_zoomed_tiles(self, tile_extractor): #============================================= mbtiles = MBTiles(self.__database_path, True, True) mbtiles.add_metadata(id=self.__id) zoom = self.__max_zoom log('Tiling zoom level {} for {}'.format(zoom, self.__id)) progress_bar = ProgressBar(total=len(self.__tile_set), unit='tiles', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') for tile in self.__tile_set: tile_image = tile_extractor.get_tile(tile) alpha_image = add_alpha(tile_image) if not_empty(alpha_image): mbtiles.save_tile_as_png(zoom, tile.x, tile.y, alpha_image) progress_bar.update(1) progress_bar.close() self.__make_overview_tiles(mbtiles, zoom, self.__tile_set.start_coords, self.__tile_set.end_coords) mbtiles.close(compress=True)
def __process_element_list(self, elements, transform, show_progress=False): #========================================================================== progress_bar = ProgressBar( show=show_progress, total=len(elements), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') features = [] for element in elements: if element.tag == SVG_NS('defs'): self.__definitions.add_definitions(element) progress_bar.update(1) continue elif element.tag == SVG_NS('use'): element = self.__definitions.use(element) self.__process_element(element, transform, features) progress_bar.update(1) progress_bar.close() return features
def __process_element_list(self, elements, transform, parent_properties, parent_style, show_progress=False): #=========================================================================================================== children = list(elements.iter_children()) progress_bar = ProgressBar(show=show_progress, total=len(children), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') features = [] for wrapped_element in children: progress_bar.update(1) element = wrapped_element.etree_element if element.tag is etree.Comment or element.tag is etree.PI: continue elif element.tag == SVG_NS('defs'): self.__definitions.add_definitions(element) continue elif element.tag == SVG_NS('use'): element = self.__definitions.use(element) wrapped_element = wrap_element(element) self.__process_element(wrapped_element, transform, features, parent_properties, parent_style) progress_bar.close() return features
def __process_shape_list(self, shapes, transform, show_progress=False): #====================================================================== progress_bar = ProgressBar( show=show_progress, total=len(shapes), unit='shp', ncols=40, bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt}') features = [] for shape in shapes: properties = { 'tile-layer': 'features' } # Passed through to map viewer if shape.name.startswith('.'): group_name = self.__current_group[-1] # For error reporting properties.update(parse_markup(shape.name)) if 'error' in properties: self.source.error( 'Shape in slide {}, group {}, has annotation syntax error: {}' .format(self.__slide_number, group_name, shape.name)) if 'warning' in properties: self.source.error('Warning, slide {}, group {}: {}'.format( self.__slide_number, group_name, properties['warning'])) for key in ['id', 'path']: if key in properties: if self.flatmap.is_duplicate_feature_id( properties[key]): self.source.error( 'Shape in slide {}, group {}, has a duplicate id: {}' .format(self.__slide_number, group_name, shape.name)) if 'error' in properties: pass elif 'path' in properties: pass elif (shape.shape_type == MSO_SHAPE_TYPE.AUTO_SHAPE or shape.shape_type == MSO_SHAPE_TYPE.FREEFORM or isinstance(shape, pptx.shapes.connector.Connector)): geometry = self.__get_geometry(shape, properties, transform) feature = self.flatmap.new_feature(geometry, properties) if self.base_layer and not feature.get_property('group'): # Save relationship between id/class and internal feature id self.flatmap.save_feature_id(feature) features.append(feature) elif shape.shape_type == MSO_SHAPE_TYPE.GROUP: self.__current_group.append(properties.get('markup', "''")) grouped_feature = self.__process_group(shape, properties, transform) self.__current_group.pop() if grouped_feature is not None: if self.base_layer: self.flatmap.save_feature_id(grouped_feature) features.append(grouped_feature) elif (shape.shape_type == MSO_SHAPE_TYPE.TEXT_BOX or shape.shape_type == MSO_SHAPE_TYPE.PICTURE): pass else: print('"{}" {} not processed...'.format( shape.name, str(shape.shape_type))) progress_bar.update(1) progress_bar.close() return features