/*! \brief Returns area of area without areas of isles \param Map vector map \param area area id \return area of area without areas of isles */ double Vect_get_area_area(const struct Map_info *Map, int area) { const struct Plus_head *Plus; struct P_area *Area; struct line_pnts *Points; double size; int i; static int first_time = 1; G_debug(3, "Vect_get_area_area(): area = %d", area); if (first_time == 1) { G_begin_polygon_area_calculations(); first_time = 0; } Points = Vect_new_line_struct(); Plus = &(Map->plus); Area = Plus->Area[area]; Vect_get_area_points(Map, area, Points); size = G_area_of_polygon(Points->x, Points->y, Points->n_points); /* substructing island areas */ for (i = 0; i < Area->n_isles; i++) { Vect_get_isle_points(Map, Area->isles[i], Points); size -= G_area_of_polygon(Points->x, Points->y, Points->n_points); } Vect_destroy_line_struct(Points); G_debug(3, " area = %f", size); return (size); }
int sort_areas(struct Map_info *Map, struct line_pnts *Points, int field, struct cat_list *cat_list) { int i, centroid, nareas_selected; struct line_cats *Cats; CELL cat; G_begin_polygon_area_calculations(); Cats = Vect_new_cats_struct(); /* first count valid areas */ nareas = Vect_get_num_areas(Map); if (nareas == 0) return 0; /* allocate list to hold valid area info */ list = (struct list *)G_calloc(nareas * sizeof(char), sizeof(struct list)); /* store area size,cat,index in list */ nareas_selected = 0; for (i = 0; i < nareas; i++) { centroid = Vect_get_area_centroid(Map, i + 1); SETNULL(&cat); if (centroid <= 0) { G_debug(2,_("Area without centroid (OK for island)")); } else { Vect_read_line(Map, NULL, Cats, centroid); if (field > 0) { if (Vect_cats_in_constraint(Cats, field, cat_list)) { Vect_cat_get(Cats, field, &cat); nareas_selected++; } else { G_debug(2, _("Area centroid without category")); } } else { /* field < 1, process all areas with centroid */ cat = 0; nareas_selected++; } } list[i].index = i + 1; Vect_get_area_points(Map, i + 1, Points); list[i].size = G_area_of_polygon(Points->x, Points->y, Points->n_points); list[i].cat = cat; } if (nareas_selected > 0) { /* sort the list by size */ qsort(list, nareas * sizeof(char), sizeof(struct list), compare); } return nareas_selected; }