def position_boundary_label(self, shape, node, label_width, label_height, node_extent_shape): x_scale = (node.max_x - node.min_x) / float(self.img_w) y_scale = (node.max_y - node.min_y) / float(self.img_h) label_geo_w = label_width * x_scale * .5 label_geo_h = label_height * y_scale * .5 #TODO: this will be weird if the extent isn't square label_geo_spacing = self.label_spacing * x_scale ret_results = [] if(not shape): return None distance_since_last_label = 0 line = shape.get(0) for line_iter in range(shape.numlines): line = shape.get(line_iter) if(line.numpoints == 0): continue last_point = line.get(0) last_x, last_y = tiletree.geo_coord_to_img(last_point.x, last_point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) point_iter = 1 while point_iter < line.numpoints: point = line.get(point_iter) this_x, this_y = tiletree.geo_coord_to_img(point.x, point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) this_distance = calc_distance(this_x, this_y, last_x, last_y) if((distance_since_last_label + this_distance) > self.label_spacing ): point = pro_rate_point(last_point.x, last_point.y, point.x, point.y, label_geo_spacing - distance_since_last_label*x_scale) point = mapscript.pointObj(*point) this_x, this_y = tiletree.geo_coord_to_img(point.x, point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) point_iter -= 1 if(node_extent_shape.contains(point)): min_label_x = point.x - (x_scale * self.label_adjustment_max) max_label_x = point.x + (x_scale * self.label_adjustment_max) pos_results = self.slow_position_poly_label(shape, node, point.x, point.y, x_scale, y_scale, min_label_x, max_label_x, label_geo_w, label_geo_h) ret_results.append(self.return_pos_results(node, pos_results)) distance_since_last_label = 0 else: distance_since_last_label += this_distance last_x = this_x last_y = this_y last_point = point point_iter +=1 return ret_results
def render_pos_results(self, node, context, label_class, label_text, is_in_tile, label_extent): if(not is_in_tile): return img_x, img_y = tiletree.geo_coord_to_img(label_extent[0], label_extent[1], self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) img_max_x, img_max_y = tiletree.geo_coord_to_img(label_extent[2], label_extent[3], self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) self.render_label(context, label_text, img_x, img_y, img_max_x, img_max_y, label_class)
def render_pos_results(self, node, context, label_class, label_text, is_in_tile, label_extent): if (not is_in_tile): return img_x, img_y = tiletree.geo_coord_to_img(label_extent[0], label_extent[1], self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) img_max_x, img_max_y = tiletree.geo_coord_to_img( label_extent[2], label_extent[3], self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) self.render_label(context, label_text, img_x, img_y, img_max_x, img_max_y, label_class)
def position_boundary_label(self, shape, node, label_width, label_height, node_extent_shape): x_scale = (node.max_x - node.min_x) / float(self.img_w) y_scale = (node.max_y - node.min_y) / float(self.img_h) label_geo_w = label_width * x_scale * .5 label_geo_h = label_height * y_scale * .5 #TODO: this will be weird if the extent isn't square label_geo_spacing = self.label_spacing * x_scale ret_results = [] if (not shape): return None distance_since_last_label = 0 line = shape.get(0) for line_iter in range(shape.numlines): line = shape.get(line_iter) if (line.numpoints == 0): continue last_point = line.get(0) last_x, last_y = tiletree.geo_coord_to_img(last_point.x, last_point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) point_iter = 1 while point_iter < line.numpoints: point = line.get(point_iter) this_x, this_y = tiletree.geo_coord_to_img( point.x, point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) this_distance = calc_distance(this_x, this_y, last_x, last_y) if ((distance_since_last_label + this_distance) > self.label_spacing): point = pro_rate_point( last_point.x, last_point.y, point.x, point.y, label_geo_spacing - distance_since_last_label * x_scale) point = mapscript.pointObj(*point) this_x, this_y = tiletree.geo_coord_to_img( point.x, point.y, self.img_w, self.img_h, node.min_x, node.min_y, node.max_x, node.max_y) point_iter -= 1 if (node_extent_shape.contains(point)): min_label_x = point.x - (x_scale * self.label_adjustment_max) max_label_x = point.x + (x_scale * self.label_adjustment_max) pos_results = self.slow_position_poly_label( shape, node, point.x, point.y, x_scale, y_scale, min_label_x, max_label_x, label_geo_w, label_geo_h) ret_results.append( self.return_pos_results(node, pos_results)) distance_since_last_label = 0 else: distance_since_last_label += this_distance last_x = this_x last_y = this_y last_point = point point_iter += 1 return ret_results