示例#1
0
 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)
示例#2
0
 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()
示例#3
0
 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
示例#4
0
 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
示例#5
0
    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()
示例#6
0
 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)
示例#7
0
 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
示例#8
0
 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
示例#9
0
 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